logging文件样例
BASE_LOG_DIR = os.path.join(BASE_DIR, "log") LOGGING = { 'version': 1, # 保留字 'disable_existing_loggers': False, # 禁用已经存在的logger实例 # 日志文件的格式 'formatters': { # 详细的日志格式 'standard': { 'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' '[%(levelname)s][%(message)s]' }, # 简单的日志格式 'simple': { 'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' }, # 定义一个特殊的日志格式 'collect': { 'format': '%(message)s' } }, # 过滤器 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, # 处理器 'handlers': { # 在终端打印 'console': { 'level': 'DEBUG', 'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志 'class': 'logging.StreamHandler', # 'formatter': 'simple' }, # 默认的 'default': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切 'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M 'backupCount': 3, # 最多备份几个 'formatter': 'standard', 'encoding': 'utf-8', }, # 专门用来记错误日志 'error': { 'level': 'ERROR', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切 'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M 'backupCount': 5, 'formatter': 'standard', 'encoding': 'utf-8', }, # 专门定义一个收集特定信息的日志 'collect': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切 'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"), 'maxBytes': 1024 * 1024 * 50, # 日志大小 50M 'backupCount': 5, 'formatter': 'collect', 'encoding': "utf-8" } }, 'loggers': { # 默认的logger应用如下配置 '': { 'handlers': ['default', 'console', 'error'], # 上线之后可以把'console'移除 'level': 'DEBUG', 'propagate': True, # 向不向更高级别的logger传递 }, # 名为 'collect'的logger还单独处理 'collect': { 'handlers': ['console', 'collect'], 'level': 'INFO', } }, }
配置分析说明:version保留字。
disable_existing_loggers
是否禁用已经存在的logger实例。
如果LOGGING
中的disable_existing_loggers
键为True
(默认值),那么默认配置中的所有logger 都将禁用。Logger 的禁用与删除不同;logger 仍然存在,但是将默默丢弃任何传递给它的信息,也不会传播给上一级logger。所以,你应该非常小心使用'disable_existing_loggers': True
;它可能不是你想要的。你可以设置disable_existing_loggers
为False
,并重新定义部分或所有的默认loggers;或者你可以设置LOGGING_CONFIG
为 None
,并 自己处理logging 配置。
Logging 的配置属于Django setup()
函数的一部分。所以,你可以肯定在你的项目代码中logger 是永远可用的。
formatters
定义输出的日志格式。
常用的格式化属性:
%(name)s Logger的名字 %(levelname)s 文本形式的日志级别 %(message)s 用户输出的消息 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 %(levelno)s 数字形式的日志级别 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有 %(filename)s 调用日志输出函数的模块的文件名 %(module)s 调用日志输出函数的模块名 %(funcName)s 调用日志输出函数的函数名 %(lineno)d 调用日志输出函数的语句所在的代码行 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有
handlers
处理器。key为处理器名,values为处理器配置。
level:日志处理级别。
formatter: 这个参数对应
filters: 对应后面的
class:处理类。常用的有:
filename:记录日志的文件名。
maxBytes:文件最大字节数。
backupCount:最大扩展数。这个是和maxBytes一起使用的。例如当日志文件 pro.log 达到最大字节数,那么就会扩展一个文件pro.log.1文件继续记录日志, 依次扩展,达到backupCount的设定值,例如为5,那么到pro.log.5后,后面的日志会再次记入 pro.log文件,相当于轮询。
level:日志处理级别。
formatter: 这个参数对应
formatters
。filters: 对应后面的
filters
。class:处理类。常用的有:
NullHandler
(无任何操作,相当于丢弃日志),FileHandler
(输出到磁盘文件)等。其他处理类请看 https://docs.python.org/3/library/logging.handlers.htmlfilename:记录日志的文件名。
maxBytes:文件最大字节数。
backupCount:最大扩展数。这个是和maxBytes一起使用的。例如当日志文件 pro.log 达到最大字节数,那么就会扩展一个文件pro.log.1文件继续记录日志, 依次扩展,达到backupCount的设定值,例如为5,那么到pro.log.5后,后面的日志会再次记入 pro.log文件,相当于轮询。
loggers
handlers:对应的handles对象列表。
level:logger实例输出的日志级别,但是这个级别并不是最终输出日志的级别,还有根据handlers的级别进行判断,两个level中取级别高的。DEBUG < INFO < WARNING < ERROR < CRITICAL
propagate:日志是否向上级传递。True 向上级传,False 不向上级传。默认为True。
filters: 对应后面的 filters
。
更详细说明请参照:https://docs.python.org/3/library/logging.html#logrecord-attributes
filters
过滤器。过滤器用来对传递给 Logger 或者 Handler 的日志信息提供附加的控制。
默认情况下,所有满足级别的日志信息都会被处理,但是我们可以通过 filter 来过滤掉 CRITICAL 级别的日志,然后仅允许 ERROR 级别的日志通过。
filter 也可以被用来对前面被忽略掉的日志进行修改,例如,我们可以在一定条件下将 ERROR 日志降级为 WARNING 日志。
过滤器可以安装在 logger 或者 handler 上,多个过滤器可以形成一个链来接连产生作用。
示例
import logging # 生成一个以当前文件名为名字的logger实例 logger = logging.getLogger(__name__) # 生成一个名为collect的logger实例 collect_logger = logging.getLogger("collect") def index(request): logger.debug("错误1。。。。") logger.info("错误2") logger.debug("这是app01里面的index视图函数") collect_logger.info("非默认错误") return HttpResponse("OK")