python中日志记录

python中日志记录

一、简介

这里介绍在python中的日志记录,流程逻辑与java中类似。日志记录包含Logger(日志记录器)、Handler(日志输出地)、
Filter(过滤器)、Formatter(日志输出格式)以及日志级别等。下面进行分别介绍。

二、内容

2.1 日志级别

日志的级别及相就数值如下:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0

2.2 handler日志输出地

handler定义日志输出目的地,有如下目的地:

StreamHandler:输出到流,如标准输出、错误输出
FileHandler:输出到文件
RotatingFileHandler:输出到文件,按文件大小归档
TimedRotatingFileHandler:输出到文件,按时间归档
HTTPHandler:输出到http
SMTPHandler:输出到邮件
NullHandler:不输出

2.3 formatter日志格式

通过logging.Formatter方法定义日志格式,具体如下:

日志格式定义方法:logging.Formatter(self, fmt=None, datefmt=None, style='%')
参数:
  fmt:消息格式化
  datefmt:日期格式化
  style:默认为%,指定格式格式化的占位符,可选值为'%', '{' or '$'

消息格式的常用变量如下:

%(name)s:日志名称
%(levelno)s:日志级别,数字形式
%(levelname)s:日志级别
%(pathname)s:日志路径名
%(filename)s:日志文件名
%(module)s:日志模块名
%(funcName)s:日志所在方法名
%(lineno)d:日志所在代码行
%(asctime)s:当前时间
%(thread)d:线程id
%(threadName)s:线程名称
%(process)d:进程id
%(message)s:消息

2.4 filter过滤器

由logging.Filter()生成过滤器,过滤参数与formatter变量类似,具体变量参数在logging.LogRecord类中

三、示例

3.1 配置文件logging.json

定义json格式配置文件logging.json,示例如下:

{
  "version": 1,
  "disable_existing_loggers": false,
  "formatters": {
    "simple": {
      "format": "%(asctime)s %(name)s [%(levelname)s] %(funcName)s %(message)s"
    }
  },
  "handlers": {
    "streamHandler": {
      "class": "logging.StreamHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "stream": "ext://sys.stdout"
    },
    "timedRotatingFileHandler": {
      "class": "logging.handlers.TimedRotatingFileHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "filename": "../logs/test_log.log",
      "when":"midnight"
    }
  },
  "root": {
    "level": "INFO",
    "handlers": [
      "streamHandler",
      "timedRotatingFileHandler"
    ]
  }
}

3.2 代码示例

import datetime
import json
import logging.config
import os
from logging.handlers import TimedRotatingFileHandler


# 代码中创建输出handler,每个日志一个单独文件
def get_logger(name='all', level='INFO'):
    # 消息格式化
    log_format = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    # 时间格式化
    date_format = '%Y-%m-%d %H:%M:%S'

    # 日志初始化配置,仅第一次配置有效,后续修改不起作用
    # logging.basicConfig(filename="main.log", level=logging.DEBUG, format=log_format, datefmt=date_format)

    # 基于时间归档日志文件,filename:日志文件名, when:归档触发时间, backupCount:日志保留个数
    handler = TimedRotatingFileHandler(filename="../logs/{}.log".format(name),
                                       when='midnight',
                                       atTime=datetime.time(0, 0, 0, 0),
                                       backupCount=20)
    handler.setFormatter(log_format)
    handler.suffix = '%Y-%m-%d'

    # 输出到控制台
    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(log_format)
    test_filter = logging.Filter()

    # 过滤器,根据日志消息过滤
    test_filter.filter = lambda record: 'test' in record.message
    # 过滤器,根据日志级别过滤
    # test_filter.filter = lambda record: record.levelno > logging.INFO
    streamHandler.addFilter(test_filter)

    # 获取logger
    logger = logging.getLogger(name)
    # 指定日志级别
    logger.setLevel(level)
    # 添加handler
    logger.addHandler(handler)
    logger.addHandler(streamHandler)
    return logger
    pass


# 从json配置文件中配置日志,获取logger
def get_logger_from_json_config(name='all', level='INFO'):
    logger_config_file = '../logging.json'
    if os.path.exists(logger_config_file):
        with open(logger_config_file, encoding='UTF-8') as f:
            cfg = json.load(f)
            logging.config.dictConfig(cfg)

    logger = logging.getLogger(name)
    logger.setLevel(level)
    return logger


def main():
    # 根据代码配置获取logger
    logger = get_logger('log_study', 'INFO')
    # 根据json格式的配置文件获取logger
    # logger = get_logger_from_json_config('log_study_1', 'DEBUG')

    logger.debug("%s log", 'debug')
    logger.info("%s log", 'info')
    logger.warning("%s log", 'warning test')
    logger.error("%s log", 'error')
    logger.fatal("%s log", 'fatal')


if __name__ == '__main__':
    main()

日志输出示例如下:

2019-01-22 23:17:53,315 INFO info log
2019-01-22 23:17:53,318 WARNING warning test log
2019-01-22 23:17:53,319 ERROR error log
2019-01-22 23:17:53,319 CRITICAL fatal log
发布了274 篇原创文章 · 获赞 95 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/chinabestchina/article/details/105211759