一个配置,解决你所有的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日志难题

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

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值