美文网首页
python日志管理

python日志管理

作者: S_jie | 来源:发表于2020-08-05 18:45 被阅读0次

python的logging如果不设置,那么系统会默认值输出warning和高于warning的日志信息,如图下:

import logging

logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical') 

上面打印了debug、info但是系统默认配置只会输出warning和高于warning的日志信息。

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

Process finished with exit code 0

关于日志的级别设置、输出方式、和输出到日志文件中下面慢慢讲解。
首先要了解日志的级别都有哪些


日志级别

日志输出级别

通过logging.basicConfig函数来设置日志的输出级别

import logging

#  通过basicConfig里的level来控制日志的输出级别
logging.basicConfig(level=logging.DEBUG)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')

这时候再去执行就会发现输出的日志级别已经发生变化,我们可以通过basicConfig里的level来控制日志的输出

DEBUG:root:debug
INFO:root:info
WARNING:root:warning
ERROR:root:error
CRITICAL:root:critical

Process finished with exit code 0

文件输出

之前做的只是在控制台输出,在开发过程中记录日志也是很重要的。所以必须的学会制定日志的输出方式,不只是在控制台输出。

import logging

#  通过basicConfig里的filename来控制日志的输出的方式
logging.basicConfig(filename='base.log', level=logging.INFO)
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')

这个时候就会发现控制台什么都没有输出,但是咋们执行文件的目录下多出了base.log文件。打开后控制台输出的信息都存到这里面去了。


base.log

到这里大家基本应该了解到了。logging里的basicConfig可以完成这些配置
首先得了解logging的构成
logging模块包括logger,Handler,Filter,Formatter四个部分。

  • Logger 记录器,用于设置日志采集,root(系统的)还可以自己定义采集器
  • Handler 处理器,指定日志发送的路径
  • Filter 过滤器,控制输出哪些日志
  • Formatter 格式化器,指定输出中日志的格式。

Logger 记录器

创建一个记录器,指定日志输出级别:debug,info,warning,error,critical,如果没有创建,系统会默认给出一个root logger并应用默认的日志级别warning,
创建方法 :
logger = logging.getLogger(logger_name)

Handler 处理器

logging中较常用的有三个,StreamHandler,FileHandler,NullHandler,
NullHandler这个基本用不上也没必要了解。

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。fmt是消息的格式化字符串,datefmt是日期字符串。如果不指明fmt,将使用'%(message)s'。如果不指明datefmt,将使用ISO8601日期格式。

Formatter

formatter = logging.Formatter(fmt=None, datefmt=None)

Filter 过滤器

filter = logging.Filter(name='')

basicConfig关键字参数

basicConfig关键字参数

format格式

format格式

总结

上面描述了logging模块的基本使用和一些常用信息,在正常使用过程中:

import logging

# 新建记录器
logger = logging.getLogger('con_log')
logger.setLevel(logging.DEBUG)  # 设置打印log级别为debug

# 文件处理
fh = logging.FileHandler("../run_log.log")
fh.setLevel(logging.WARN)

# 指定日志输出格式
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)

# 将处理程序和日志格式添加到记录器
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

这样基本就定义好了一个日志的输出格式了。但是这样用在项目里很繁琐,需要每个文件都加上这个,最好的处理办法,就是把这个写成一个配置文件,放在项目配置目录下,直接读取。

新建文件log.conf

#指定两种采集器,一种是系统的一种自己定义的
[loggers]
keys=root,DEBUGLogger

# 系统采集器信息
[logger_root]
# 输出级别定位debug
level=DEBUG
# 日志输出路径为控制台和指定文件
handlers=consoleHandler,fileHandler

# 自定义采集器
[logger_DEBUGLogger]
# 日志输出路径为控制台和指定文件
handlers=consoleHandler,fileHandler
# 引用名称
qualname=DEBUGLogger
# 0输出日志,但是消息不传递,1输出日志,消息往更高级别传递,root为最高级别
propagate=0

# 控制日志输出流向
[handlers]
# 控制台输出、文件输出
keys=consoleHandler,fileHandler

# 输出到控制台的具体配置
[handler_consoleHandler]
# 指定文件类型流输出
class=StreamHandler
# 指定输出级别
level=DEBUG
# 引用格式的预定义
formatter=form02
# 指定标准量输出
args=(sys.stdout,)

# 输出到文件的具体配置
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=form01
args=('runlog.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

调用:

import logging
import logging.config

CON_LOG = 'xxx/xxx/log.conf'
logging.config.fileConfig(CON_LOG)
logging = logging.getLogger()

相关文章

网友评论

      本文标题:python日志管理

      本文链接:https://www.haomeiwen.com/subject/bcrorktx.html