python的logging使用

先看一个简单的demo:

# -*- coding:utf-8 -*-
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO,
                        format='%(asctime)s %(levelno)s %(message)s',
                        datefmt='%Y-%m-%d %H:%M:%S',)
# logging.basicConfig(filename='logger.log', level=logging.INFO)
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')

运行后会在控制台打印日志,格式为:年月日时分秒 日志级别 日志内容。

在这个例子中,日志配置是通过basicConfig函数来配置的。一共有6个参数:

参数描述
filename创建一个FileHandler,使用此文件名。而不是使用StreamHandler
filemode指明打开日志文件的模式(未指明则默认为’a’)
format日志输出的格式
datefmt日期/时间格式
level日志输出级别
stream用来初始化SteamHandler,与filename不兼容,同时存在时优先取filename

上述例子中指定了四个参数,未使用filename和filemode。
如果将注释行打开,即使用:

logging.basicConfig(filename='logger.log', level=logging.INFO)

指定创建一个FileHandler,在当前目录下生成logger.log日志文件,则输出内容如下:

INFO:root:info message
WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message

因为没有指定格式,故使用默认格式输出(BASIC_FORMAT = “%(levelname)s:%(name)s:%(message)s”)。

logging的组成

看一下源代码中basicConfig具体做了什么:

try:
    if len(root.handlers) == 0:
        filename = kwargs.get("filename")
        if filename:
            mode = kwargs.get("filemode", 'a')
            hdlr = FileHandler(filename, mode)
        else:
            stream = kwargs.get("stream")
            hdlr = StreamHandler(stream)
        fs = kwargs.get("format", BASIC_FORMAT)
        dfs = kwargs.get("datefmt", None)
        fmt = Formatter(fs, dfs)
        hdlr.setFormatter(fmt)
        root.addHandler(hdlr)
        level = kwargs.get("level")
        if level is not None:
            root.setLevel(level)

从中可以看出,先是创建一个日志处理器Handler, 然后生成格式化器Formatter,为Handler设置格式,最后将Handler添加到root中,root是一个日志记录器Logger。这其中涉及几个重要概念:
Logger记录器:暴露了应用程序代码能直接使用的接口。
Handler处理器:将记录器产生的日志记录发送至合适的目的地。
Formatter格式化器:指定了最终输出日志记录的格式布局。

Logger

创建方式为:

logger = logging.getLogger(logger_name)

如果没有显式地创建logger,则默认创建一个root logger。

默认的日志级别是WARN,默认的处理器Handler是StreamHandler。

logger创建后,需要对其设置处理器handler和日志级别,而在handler中则设置了格式化formatter。

Handler

Handler处理器类型有很多种,常用的有三个:StreamHandler,FileHandler和NullHandler。其中SteamHandler是默认的handler,表示日志打印到标准输出上。FileHandler是将日志输出到文件,NullHandler什么都不做。

Formatter

Formatter是Handler输出格式的格式化器,对日期/时间和具体日志内容进行格式化。

了解了这几个概念之后,就可以不用系统函数basicConfig,也能手动进行日志配置了。logger.py如下:

# coding=utf-8
import logging
# create logger
logger_name = "example"
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
# create file handler
log_path = "./log.log"
fh = logging.FileHandler(log_path)
fh.setLevel(logging.WARN)
# create formatter
fmt = "%(asctime)-15s %(levelname)s %(filename)s %(lineno)d %(process)d %(message)s"
datefmt = "%a %d %b %Y %H:%M:%S"
formatter = logging.Formatter(fmt, datefmt)
# add handler and formatter to logger
fh.setFormatter(formatter)
logger.addHandler(fh)
# print log info
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

日志文件为同目录下的log.log文件,内容如下:

Thu 09 May 2019 15:25:22 WARNING logger.py 26 14695 warn message
Thu 09 May 2019 15:25:22 ERROR logger.py 27 14695 error message
Thu 09 May 2019 15:25:22 CRITICAL logger.py 28 14695 critical message

日志配置方式

在上文的例子中介绍过基本配置方式basicConfig,实际上还有其他的日志配置方式:
通过配置文件,使用fileConfig()读取进行配置。或者通过配置字段,使用dictConfig()读取配置信息进行配置。还可以通过网络,使用listen()函数进行配置。
下面是通过配置文件进行配置的例子。配置文件logging.conf如下:

[loggers]
keys=root,example01
[logger_root]
level=DEBUG
handlers=hand01,hand02
[logger_example01]
handlers=hand01,hand02
qualname=example01
propagate=0
[handlers]
keys=hand01,hand02
[handler_hand01]
class=StreamHandler
level=INFO
formatter=form02
args=(sys.stderr,)
[handler_hand02]
class=FileHandler
level=DEBUG
formatter=form01
args=('log.log', 'a')
[formatters]
keys=form01,form02
[formatter_form01]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
[formatter_form02]
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

logging.py如下:

# -*- encoding:utf-8 -*-
import logging.config
logging.config.fileConfig("./logging.conf")
# create logger
logger_name = "example01"
logger = logging.getLogger(logger_name)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值