0
点赞
收藏
分享

微信扫一扫

Python 命令行(四)- 日志

在线上系统中,日志担任着重要的角色,是系统的重要组成部分,用来记录用户操作、系统运行状态和错误信息。因此,日志并不是可由可无的,日志的好坏直接关系到系统出现问题时定位的速度;此外,我们也可以对日志进行观察和分析,提前发现系统可能存在的风险,以预防线上事故的发生。

通常,日志的应用主要分如下两个场景:

  • 诊断日志:记录与应用程序操作相关的日志,用于分析和排查线上问题;
  • 审计日志:为商业分析而记录的日志,用于构成用户报告、优化商业目标等;比如:Apache 的访问日志,就是一种审计日志。

下面,我们就来认识和了解 Python 内置的日志模块 - logging 吧~

一. 日志等级

Python 标准库中的 logging 模块,为我们提供了日志相关的功能~ 使用 logging 模块,最简单的方式是导入 logging 模块,然后调用它的 debug info warn errorcritical 等函数记录日志:

import logging

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

运行结果:

logging 模块默认将日志输出到屏幕终端,日志级别为 WARNING ,即只有日志级别大于等于 EARNING 的日志才会被输出。

日志级别通常用来区分日志的重要程度,一方面,我们可以只保存比较高的日志级别,以提高性能;另一方面,也会便于日志的分析。

二. 配置日志格式

使用 logging 记录日志之前,我们可以进行一些简单的配置,如定义日志输出的文件,日志等级:

import logging

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

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

运行上述内容,将产生一个 app.log 的文件,文件中记录了 INFO 级别及以上的内容。

上述例子,我们使用 basicConfig 在代码中配置了日志格式,对于复杂的项目,我们也可以将日志的配置保存到一个单独的配置文件中,然后在代码中使用 fileConfig 来读取配置文件。

在正式介绍 fileConfig 之前,我们先来看 logging 模块中最重要的 3 个概念:

  • Logger:日志记录器,是应用程序中能直接使用的接口;
  • Handler:日志处理器,用以表明将日志保存到什么地方以及保存多久;
  • Formatter:格式化器,用以配置日志的输出格式。

其中,一个日志记录器,可以添加多个日志处理器;一个日志处理器对应一个格式化器。在典型应用场景中,一个日志记录器使用一个日志处理器,一个日志处理器使用一个日志格式化器。

下面的例子中,日志文件将保存所有 DEBUG 级别及以上的日志,输出的每条日志中包含了打印日志的时间、日志级别和日志内容。

import logging

logging.basicConfig(
    level=logging.DEBUG, 
    format='%(asctime)s : %(levelname)s : %(message)s', 
    filename='app.log'
)

logging.debug('debug msg')
logging.info('info msg')
logging.warning('warn msg')
logging.error('error msg')

运行结果:

对于比较复杂的项目,可以将日志的配置保存到一个配置文件中:

[loggers]
keys = root

[handlers]
keys = logfile

[formatters]
keys = generic

[logger_root]
handlers = logfile

[handler_logfile]
class = handlers.TimedRotatingFileHandler
args = ('appBetter.log', 'midnight', 1, 10)
level = DEBUG
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)s-5.5s [%(name)s:%(lineno)s] %(message)s

定义好配置文件之后,在 Python 代码中使用 logging.config 模块的 fileConfig 函数加载日志配置即可:

import logging
import logging.config

logging.config.fileConfig('logging.cnf')

logging.debug('debug msg')
logging.info('info msg')
logging.warning('warn msg')
logging.error('error msg')

运行结果:

关于参数的说明如下:

  • filename:日志输出的文件名称;
  • when :定义日志切分的时间间隔单位,可选参数有:S 秒、M 分钟、H 小时、D 天、W Week day 以及 midnight Roll over at midnight ;
  • interval :间隔时间单位的个数,即等待多少个 when 的时间后创建新的 filename 日志文件;
  • backupCount :保留日志的文件个数。默认为 0,即不会自动删除文件。如果设置为正整数 N,则在创建新的日志文件时,将检查日志文件个数是否到达 N,达到了的话就会从最先创建的开始删除,从而维持日志文件个数始终为 N 个。
举报

相关推荐

0 条评论