Django(37)配置django日志 (2)

FileHandler:继承自StreamHandler,输出到文件,默认情况下,文件无限增长
初始化参数:filename,mode ='a',encoding = None,delay = False
delay如果为True,那么会延迟到第一次调用emit写入数据时才打开文件

'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/path/to/django/app.log', #参数配置在这里,多个参数按顺序继续配置即可, 如果要添加encoding,那么在下面添加 encoding: 'utf-8' 即可 }, }

RotatingFileHandler:自动按大小切分的log文件(常用)
初始化参数:filename,mode ='a',maxBytes = 0,backupCount = 0,encoding = None,delay = False
maxBytes:最大字节数,超过时创建新的日志文件,如果backupCount或maxBytes有一个为0,那么就一直使用一个文件
backupCount:最大文件个数,新文件的扩展名是指定的文件后加序号".1"等,譬如:backupCount=5,基础文件名为:app.log,那么达到指定maxBytes之后,会关闭文件app.log,将app.log重命名为app.log.1,如果app.log.1存在,那么就顺推,先将 app.log.1重命名为app.log.2,再将现在的app.log命名为app.log.1,最大创建到app.log.5(旧的app.log.5会被删除),然后重新创建app.log文件进行日志写入,也就是永远只会对app.log文件进行写入。

TimedRotatingFileHandler:按时间自动切分的log文件,文件后缀 %Y-%m-%d_%H-%M-%S
初始化参数:filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None
when:时间间隔类型,不区分大小写

'S':秒 'M':分钟 'H':小时 'D':天 'W0'-'W6':星期几(0 = 星期一) 'midnight':如果atTime未指定,则在 0点0分0秒 翻转,否则在atTime时间翻转

interval:间隔的数值
backupCount: 文件个数
encoding:编码
delay:True是写入文件时才打开文件,默认False,实例化时即打开文件
utc:False则使用当地时间,True则使用UTC时间
atTime:必须是datetime.time实例,指定文件第一次切分的时间,when设置为S,M,H,D时,该设置会被忽略

SMTPHandler:通过email发送日志记录消息
初始化参数:mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=5.0
mailhost:发件人邮箱服务器地址(默认25端口)或地址和指定端口的元组,如:('smtp.163.com', 25)
fromaddr:发件人邮箱
toaddrs:收件人邮箱列表
subject:邮件标题
credentials:如果邮箱服务器需要登录,则传递(username, password)元组
secure:使用TLS加密协议
 

Loggers

 

1.settings中配置

通过在settings中配置LOGGING配置项实现日志配置,共4个配置项(都是可选的,不过一般会指定handler):

level:指定记录日志的级别,没有配置则处理所有级别的日子

propagate:设置该记录器的日志是否传播到父记录器,不设置则是True

filters:指定过滤器列表

handlers:指定处理器列表

示例如下:

LOGGING = { 'version': 1, # 固定值,现在只有这一个版本 'disable_existing_loggers': False, # 设置已存在的logger不失效 'loggers': { '': { 'handlers': ['console'], }, 'django': { 'handlers': ['console'], 'propagate': True, }, 'django.request': { 'handlers': ['mail_admins'], 'level': 'ERROR', 'propagate': False, }, 'myproject.custom': { 'handlers': ['console', 'mail_admins'], 'level': 'INFO', 'filters': ['special'] } } }

配置了4个 logger, 分别对应2个不同的handler(console输出日志到控制台,mail_admins输出日志到邮件)

'':默认的记录器,不指定特定名称,那么就是使用这个记录器,没有配置level,那么就是处理所有级别的日志,传递所有级别的日志到console控制器

django:传递所有级别的日志到console控制器

django.request:django记录器的子记录器,处理ERROR级别及以上的日志,propagate设置为 False,表明不传播日志给 "django",该logger传递日志到mail_admins控制器

myproject.custom:处理INFO级别及以上的日志,应用了一个 special 的过滤器来过滤日志,传递日志到2个控制器(['console', 'mail_admins'])处理
 

注意
django框架有个默认的配置:DEFAULT_LOGGING,一旦配置了自己的LOGGING后,那么所有的默认的LOGGER全部都失效,失效不等于没有记录器了,而是说记录器不起作用了,即不会记录日志,也不会将日志传播给父记录器。因此你应该非常小心使用,因为你会感觉你丢了日志一样,可以手动设置同名的logger实现覆盖,如:

LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'loggers': { # 覆盖了 django 记录器,所有django的记录日志最后全部写入到文件中 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, }, }

 

2.django内置的logger

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjggx.html