一个配置,解决你所有的Python日志难题

引入日志是软件开发中至关重要的一步,它不仅仅是一种调试工具,更是在应用程序的整个生命周期中追踪、记录和分析重要信息的关键手段。

Python的标准库logging模块提供了灵活的配置选项,但对于一些开发者来说,配置仍然显得繁琐。

本文将以一种直观,优雅的方式帮你配置好日志,不管什么项目,复制过去就能直接使用。

  • 针对不同的类型日志,保存到不同的日志文件
  • 自定义日志大小和数量
  • 具备高度灵活可配置性
import os 
import logging
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
LOG_PATH = os.path.join(BASE_DIR, 'logs')
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '[%(asctime)s] - %(thread)d - %(levelname)s - %(pathname)s - %(lineno)d - %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
        'standard': {
            'format': '[%(asctime)s] %(thread)s requested %(levelname)s in %(pathname)s %(lineno)d: %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple',
        },
        'request': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_PATH, 'request.log'),
            'maxBytes': 1024 * 1024 * 30,
            'backupCount': 10,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        'db': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_PATH, 'db.log'),
            'maxBytes': 1024 * 1024 * 30,  # 30 MB
            'backupCount': 10,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        'task': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_PATH, 'task.log'),
            'maxBytes': 1024 * 1024 * 30,  # 30 MB
            'backupCount': 10,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
    },
    'loggers': {
        'request': {
            'handlers': ['request', 'console'],
            'level': 'INFO',
            'propagate': False
        },
        'db': {
            'handlers': ['db'],
            'level': 'INFO',
            'propagate': False,
        },
        'task': {
            'handlers': ['task'],
            'level': 'INFO',
            'propagate': False
        },
    },
}
# 配置日志
logging.config.dictConfig(LOGGING)
# 使用
# 记录请求日志
logger = logging.getLogger('request')
logger.info('This is an info log message.')
logger.warning('This is a warning log message.')
# 记录数据库日志
logger = logging.getLogger('db')
logger.info('This is an info log message.')
logger.warning('This is a warning log message.')
# 记录任务日志
logger = logging.getLogger('task')
logger.info('This is an info log message.')
logger.warning('This is a warning log message.')

logging.Formatter 的常用格式字符串

格式字符串 作用
%(name)s 日志记录器的名称(记录通道)
%(levelno)s
  • 日志记录级别的数字
  • DEBUG=10、INFO=20、WARNING=30、ERROR=40、CRITICAL=50
%(levelname)s
  • 日志记录级别的文本
  • “DEBUG”、“INFO”、“WARNING”、“ERROR”、“CRITICAL”
%(pathname)s 日志调用的源文件的完整路径名
%(filename)s 日志调用的源文件的文件名部分
%(module)s 日志调用的源文件的文件名的名称部分
%(lineno)d 日志调用的源行号
%(funcName)s 日志调用的函数名
%(created)f
  • 打印日志的时间
  • time.time() 的返回值
%(asctime)s
  • 打印日志的时间
  • datetime.datetime.now() 的返回值
%(msecs)d 打印日志的毫秒部分
%(relativeCreated)d
  • 打印日志的时间,毫秒为单位
  • 是相对于加载 logging 模块的时间(通常在应用程序启动时)
%(thread)d 线程ID
%(threadName)s 线程名,一般是主线程 MainThread
%(process)d 进程ID
%(message)s 日志信息

 查看原文:一个配置,解决你所有的Python日志难题

 关注公众号 "字节航海家" 及时获取最新内容

一个配置,解决你所有的Python日志难题_第1张图片

你可能感兴趣的:(python,python,后端)