引入日志是软件开发中至关重要的一步,它不仅仅是一种调试工具,更是在应用程序的整个生命周期中追踪、记录和分析重要信息的关键手段。
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.')
格式字符串 | 作用 |
---|---|
%(name)s | 日志记录器的名称(记录通道) |
%(levelno)s |
|
%(levelname)s |
|
%(pathname)s | 日志调用的源文件的完整路径名 |
%(filename)s | 日志调用的源文件的文件名部分 |
%(module)s | 日志调用的源文件的文件名的名称部分 |
%(lineno)d | 日志调用的源行号 |
%(funcName)s | 日志调用的函数名 |
%(created)f |
|
%(asctime)s |
|
%(msecs)d | 打印日志的毫秒部分 |
%(relativeCreated)d |
|
%(thread)d | 线程ID |
%(threadName)s | 线程名,一般是主线程 MainThread |
%(process)d | 进程ID |
%(message)s | 日志信息 |
查看原文:一个配置,解决你所有的Python日志难题
关注公众号 "字节航海家" 及时获取最新内容