django的日志库logging使用介绍

2024年05月22日 编程 暂无评论 阅读48 次

介绍

日志记录是非常实用的开发工具,之前学的教程里没介绍过,还是用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.')

输出结果

给我留言

登录

忘记密码 ?

切换登录

注册