一.简单介绍
我们在部署系统或者某个软件服务时,为了方便定位部署过程中出现的问题,我们需要记录一些日志,方便我们定位和排查问题。python的logging模块
提供了一组便利的日志函数,它们分别是:debug()、 info()、 warning()、 error() 和 critical()。logging函数根据它们用来跟踪的事件的级别或严重程度来命名。标准级别及其适用性描述如下(以严重程度递增排序):
每个级别对应的数字值为
CRITICAL:50,ERROR:40,WARNING:30,INFO:20,DEBUG:10,NOTSET:0。
Python 中日志的默认等级是 WARNING,DEBUG 和 INFO 级别的日志将不会得到显示,在 logging 中更改设置。
二.logging模块介绍
logging模块提供了两种记录日志的方式:
- 使用logging提供的模块级别的函数
这里提到的级别函数是DEBUG、ERROR等级别 - 使用logging日志系统的四大组件
这里四大组件是指loggers、handlers、filters和formatters这几个组件。下面说明了它们各自的作用:
组件名称 | 对应类名 | 功能描述 |
-|-|-|
日志器 | Logger | 提供了应用程序可一直使用的接口 |
处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
格式器 | Formatter | 决定日志记录的最终输出格式 |
日志器logger是入口,真正工作的是处理器handler,处理器handler还可以通过过滤器filter和各时期formatter对要输出的日志内容做过滤和格式化等处理操作
三.四大组件介绍
3.1 Logger类
Logger对象有三个工作要做:
- 向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息
- 基于日志严重等级(默认的过滤设施)或filter对象来决定要对哪些日志进行后续处理
- 将日志消息传送给所有感兴趣的日志handlers
Logger对象最常用的方法分为两类:配置方法和消息发送方法
最常用的配置方法如下:
方法 | 描述 |
---|---|
Logger.setLevel() | 设置日志器将会处理的日志信息的最低严重级别 |
Loggger.addHandler()和Logger.removeHandler() | 为该logger对象添加和移除一个handler对象 |
Logger.addFilter()和Logger.removeFilter() | 为该logger对象添加和移除一个filter对象 |
关于Logger.setLevel()方法的说明:
内建等级中,级别最低的是DEBUG,级别最高的是CRITICAL。例如setLevel(logging.INFO),此时函数参数为INFO,那么该logger将只会处理INFO、WARNING、ERROR和CRITICAL级别的日志,而DEBUG级别的消息将会被忽略/丢弃。
Logger对象配置完毕后,可以使用下面的方法来创建日志记录:
那么,怎样得到一个Logger对象呢?一种方式是通过Logger类的实例化方法创建一个Logger类的实例,但是我们通常都是用第二种方式--logging.getLogger()方法。
def get_log(modle_name, level=logging.FATAL):
"""
get a log handler
:param modle_name:
:param level:
:return:
"""
log = logging.getLogger(modle_name)
log.setLevel(logging.DEBUG)
# new log, write log to file "/var/log/icfs/icfs-cli.log" level=logging.DEBUG
log.addHandler(__get_file_handler())
# old log, print info to stdout, only filter info like this: "Error(xxx): xxxx xxx". use by ui. level=logging.ERROR
log.addHandler(__get_stdout_handler())
# new log, print info to stderr, not count info like: "Error(xxx): xxxx xxx". default level=logging.WARNING
log.addHandler(__get_stderr_handler(level))
return log
logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则其值为'root'。若以相同的name参数值多次调用getLogger()方法,将会返回指向同一个logger对象的引用