django的日志库logging使用介绍
介绍
日志记录是非常实用的开发工具,之前学的教程里没介绍过,还是用chatgpt的时候它告诉我的。
用下来发现和android的log工具非常像,甚至更加好用。
logging在普通python程序中也可以使用,在django中则配置更加方便
本文也完全根据chatgpt教学整理成笔记完成
django中使用logging
下面是一个例子
#在setting文件中配置日志记录器格式
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': 'django.log',
'when': 'midnight', # 每天凌晨创建新文件
'backupCount': 7, # 保留最近 7 天的日志文件
'formatter': 'verbose',
},
},
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': 'ERROR',
'propagate': True,
},
'logindemo': {
'handlers': ['console', 'file'],
'level': 'DEBUG',
'propagate': False,
},
},
}
# 应用日志配置(这个应该是不用的)
logging.config.dictConfig(LOGGING)
# 然后使用
import logging
from logging.handlers import TimedRotatingFileHandler
# 获取日志记录器
logger = logging.getLogger('logindemo')
# 记录日志示例
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')
配置分为几层,loggers日志记录器,handler处理器,formatters格式化器,还有个过滤器Filter这里没用到。
日志记录器级别:DEBUG,INFO,WARNING,ERROR,CRITICAL。分别对应上面的debug,info等记录方式
先根据不同名字获取日志记录器,然后日志记录器过滤出自己要记录级别以上的日志交给handler处理器
handler处理器再过滤一次自己要处理的级别以上的日志,按formatter指定的格式输出。
处理器(Handler)包括下面几个种类
- StreamHandler:将日志消息输出到控制台。
- FileHandler:将日志消息写入文件。
- SMTPHandler:通过电子邮件发送日志消息。
- HTTPHandler:通过 HTTP POST 请求发送日志消息。
- RotatingFileHandler:将日志消息写入文件,并在文件达到指定大小时进行轮换。
# 单个文件例子
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'django.log',
'formatter': 'verbose',
},
# 超出文件大小换文件例子
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'django_rotating.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5, # 保留最近的 5 个日志文件
'formatter': 'verbose',
},
Formatter常用的格式化指示符包括:
{levelname}:日志级别名称(如 DEBUG、INFO、WARNING、ERROR、CRITICAL)。
{asctime}:日志记录时间。
{module}:调用日志记录功能的模块名。
{message}:日志消息内容。
{name}:日志记录器的名称。
{pathname}:调用日志记录功能的源文件路径。
{lineno}:调用日志记录功能的源文件行号。
{funcName}:调用日志记录功能的函数名。
Style 指定了格式字符串的样式。可选值有:
'%'
:默认样式,格式化字符串使用%
格式化(如%(levelname)s
)。'{'
:大括号样式,格式化字符串使用{}
格式化(如{levelname}
)。'$'
:美元符号样式,格式化字符串使用$
格式化(如${levelname}
)。
# style是%的例子
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(message)s',
'style': '%',
},
普通python中使用logging
import logging
from logging.handlers import TimedRotatingFileHandler
# 创建日志记录器
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG) # 设置日志级别
# 创建格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 创建控制台处理器并设置级别为DEBUG
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)
# 创建文件处理器,按天轮换日志,保留最近7天的日志文件
file_handler = TimedRotatingFileHandler('my_app.log', when='midnight', interval=1, backupCount=7)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
# 将处理器添加到日志记录器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 记录日志示例
logger.debug('This is a debug message.')
logger.info('This is an info message.')
logger.warning('This is a warning message.')
logger.error('This is an error message.')
logger.critical('This is a critical message.')