python日志模块

一.简单介绍

我们在部署系统或者某个软件服务时,为了方便定位部署过程中出现的问题,我们需要记录一些日志,方便我们定位和排查问题。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对象的引用

原文地址:https://www.cnblogs.com/yuhaohao/p/10969704.html