为什么使用日志?... 或者用打印(Print)?
日志的两个目的:
1.诊断日志: 记录与应用程序操作相关的日志。例如,用户遇到的报错信息,可通过搜索诊断日志获得上下文信息。
2.审计日志: 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息,并结合其他用户资料构成用户报告或者用来优化商业目标。
打印(Print)?
大多数情况下日志总能优于打印,日志的好处:
1.日志事件产生的日志记录 ,包含清晰可用的诊断信息,如文件名称、路径、函数名和行数等。
Filter 过滤器:
Handlers和Loggers可以使用Filters来完成更复杂的过滤(暂时不太了解)
日志的两个目的:
1.诊断日志: 记录与应用程序操作相关的日志。例如,用户遇到的报错信息,可通过搜索诊断日志获得上下文信息。
2.审计日志: 为商业分析而记录的日志。从审计日志中,可提取用户的交易信息,并结合其他用户资料构成用户报告或者用来优化商业目标。
打印(Print)?
大多数情况下日志总能优于打印,日志的好处:
1.日志事件产生的日志记录 ,包含清晰可用的诊断信息,如文件名称、路径、函数名和行数等。
2.可通过logging.Logger.setLevel 方法进行有选择的日志记录,或可通过设置 logging.Logger.disabled 属性为 True 来屏蔽日志记录。
Logging模块主要包含四个组件:
1.Logger 记录器,提供了应用程序代码能直接使用的接口。
2.Handler 处理器,将(记录器产生的)日志记录发送至合适的目的地。
3.Filter 过滤器,对日志信息进行过滤
4.Formatter 格式化器,指明了最终输出中日志记录的格式。
日志级别 级别 何时使用
DEBUG 1 详细信息,方便调试问题。
INFO 2 证明事情按预期工作。
WARNING 3 表明发生了一些小意外,但不影响运行
ERROR 4 由于更严重的问题,软件已不能执行一些功能了。
CRITICAL 5 严重错误,表明软件已不能继续运行了。
Tutor:
1. 使用源码配置log
LOG = logging.getLogger(‘mylog’)
LOG.setLevel(logging.INFO)
LOG_FORMAT = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
# 输出到文件
fh = logging.FileHandler(sys.argv[0]+'.log')
fh.setLevel(logging.INFO)
fh.setFormatter(LOG_FORMAT)
LOG.addHandler(fh)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(LOG_FORMAT)
LOG.addHandler(ch)
2.使用字典配置log
logging_config = dict(
version = 1,
formatters = {
'f': {'format':
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s'}
},
handlers = {
'h': {'class': 'logging.StreamHandler',
'formatter': 'f',
'level': logging.DEBUG}
},
loggers = {
'root': {'handlers': ['h'],
'level': logging.DEBUG}
}
)
dictConfig(logging_config)
logger = logging.getLogger()
logger.debug('debug messages')
使用Logger之前必须先创建Logger实例,
方法:
logger = logging.getLogger(logger_name)
创建Logger实例后,可以进行日志级别设置、增加处理器Handler
方法:
logger.setLevel(logging.ERROR)
logger.addHandler(handler_name)
Handler 处理器:
Handler类型有很多种,比较常用的有三个:StreamHandler,FileHandler,NullHandler,
创建StreamHandler之后,可以通过使用以下方法设置日志级别,设置格式化器Formatter,增加或删除过滤器Filter。
ch.setLevel(logging.WARN) # 指定日志级别,低于WARN级别的日志将被忽略
ch.setFormatter(formatter_name) # 设置一个格式化器formatter
ch.addFilter(filter_name) # 增加一个过滤器,可以增加多个
ch.removeFilter(filter_name) # 删除一个过滤器
StreamHandler创建方法:
sh = logging.StreamHandler(stream=None)
FileHandler创建方法:
fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
Formatter 格式化器:
使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S。
创建方法: formatter = logging.Formatter(fmt=None, datefmt=None)
其中,fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。
有用的format格式
格式 描述
%(levelno)s 打印日志级别的数值
%(levelname)s 打印日志级别名称
%(pathname)s 打印当前执行程序的路径
%(filename)s 打印当前执行程序名称
%(funcName)s 打印日志的当前函数
%(lineno)d 打印日志的当前行号
%(asctime)s 打印日志的时间
%(thread)d 打印线程id
%(threadName)s 打印线程名称
%(process)d 打印进程ID
%(message)s 打印日志信息
Filter 过滤器:
Handlers和Loggers可以使用Filters来完成更复杂的过滤(暂时不太了解)