Django日志配置

1年前 (2024-06-11)学习590

在Django中配置日志的方法非常简单,只需要在 setting 文件中添加配置项,系统会自动生成相应的日志文件,也可以配置调试时显示内容,报错发送邮件等操作。

在setting.py中添加以下配置。

  • # 日志配置
  • LOGS_DIRS = os.path.join(BASE_DIR, 'logs','django')
  • if not os.path.exists(LOGS_DIRS):
  • os.makedirs(LOGS_DIRS)
  • SPIDER_LOGS_DIRS = os.path.join(BASE_DIR, 'logs','spider')
  • if not os.path.exists(SPIDER_LOGS_DIRS):
  • os.makedirs(SPIDER_LOGS_DIRS)
  • LOGGING = {
  • 'version': 1, # 使用的日志模块的版本,目前官方提供的只有版本1,但是官方有可能会升级,为了避免升级出现的版本问题,所以这里固定为1
  • 'disable_existing_loggers': False, # 是否禁用其他的已经存在的日志功能?肯定不能,有可能有些第三方模块在调用,所以禁用了以后,第三方模块无法捕获自身出现的异常了。
  • 'formatters': { # 日志格式设置,verbose或者simple都是自定义的
  • 'verbose': { # 详细格式,适合用于开发人员不在场的情况下的日志记录。
  • # levelname 日志等级
  • # asctime 发生时间
  • # module 文件名
  • # process 进程ID
  • # thread 线程ID
  • # message 异常信息
  • 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
  • 'style': '{', # 变量格式分隔符
  • },
  • 'spiderformat': { # 详细格式,适合用于开发人员不在场的情况下的日志记录。
  • 'format': '{levelname} {asctime} {message}',
  • 'style': '{',
  • },
  • 'simple': { # 简单格式,适合用于开发人员在场的情况下的终端输出
  • 'format': '{levelname} {message}',
  • 'style': '{',
  • },
  • 'standard': {
  • 'format': '%(levelname)s %(asctime)s %(pathname)s %(filename)s %(module)s %(funcName)s %(lineno)d: %(message)s'
  • }, # 对日志信息进行格式化,每个字段对应了日志格式中的一个字段,更多字段参考官网文档,我认为这些字段比较合适,输出类似于下面的内容
  • },
  • 'filters': { # 过滤器
  • 'require_debug_true': {
  • '()': 'django.utils.log.RequireDebugTrue',
  • },
  • },
  • 'handlers': { # 日志处理流程,console或者mail_admins都是自定义的。
  • 'console': {
  • 'level': 'DEBUG', # 设置当前日志处理流程中的日志最低等级
  • 'filters': ['require_debug_true'], # 当前日志处理流程的日志过滤
  • 'class': 'logging.StreamHandler', # 当前日志处理流程的核心类,StreamHandler可以帮我们把日志信息输出到终端下
  • 'formatter': 'simple' # 当前日志处理流程的日志格式
  • },
  • # 'mail_admins': {
  • # 'level': 'ERROR', # 设置当前日志处理流程中的日志最低等级
  • # 'class': 'django.utils.log.AdminEmailHandler', # AdminEmailHandler可以帮我们把日志信息输出到管理员邮箱中。
  • # 'filters': ['special'] # 当前日志处理流程的日志过滤
  • # }
  • 'file': {
  • 'level': 'WARNING',
  • 'class': 'logging.handlers.TimedRotatingFileHandler',
  • # 日志位置,日志文件名,日志保存目录logs必须手动创建
  • 'filename': '%s/django.log' % LOGS_DIRS,
  • # TimedRotatingFileHandler的参数
  • # 目前设定每天一个日志文件
  • # 'S' | 秒
  • # 'M' | 分
  • # 'H' | 时
  • # 'D' | 天
  • # 'W0'-'W6' | 周一至周日
  • # 'midnight' | 每天的凌晨
  • 'when': 'D', # 间间隔的类型,指定秒就不要在Windows上运行测试
  • 'interval': 1, # 时间间隔
  • 'backupCount': 5, # 能留几个日志文件;过数量就会丢弃掉老的日志文件
  • 'encoding': 'utf-8', # 日志文本编码
  • 'formatter': 'verbose' # 当前日志处理流程的日志格式
  • },
  • 'spiderfile': {
  • 'level': 'INFO',
  • 'class': 'logging.handlers.TimedRotatingFileHandler',
  • 'filename': '%s/spider.log' % SPIDER_LOGS_DIRS,
  • 'when': 'H', # 间间隔的类型,指定秒就不要在Windows上运行测试
  • 'interval': 1, # 时间间隔
  • 'backupCount': 90, # 能留几个日志文件;过数量就会丢弃掉老的日志文件
  • 'encoding': 'utf-8', # 日志文本编码
  • 'formatter': 'spiderformat' # 当前日志处理流程的日志格式
  • },
  • },
  • 'loggers': { # 日志处理的命名空间
  • 'django': {
  • 'handlers': ['console', 'file'], # 当基于django命名空间写入日志时,调用那几个日志处理流程
  • 'propagate': True, # 是否在django命名空间对应的日志处理流程结束以后,冒泡通知其他的日志功能。True表示允许
  • },
  • 'spider': {
  • 'level': 'INFO',
  • 'handlers': ['console', 'spiderfile'], # 当基于django命名空间写入日志时,调用那几个日志处理流程
  • 'propagate': False, # 是否在django命名空间对应的日志处理流程结束以后,冒泡通知其他的日志功能。True表示允许
  • },
  • }
  • }

配置中主要的是以下四个大的配置项。

formatters:日志的格式器,配置日志的打印及写入格式

filters:过滤器、配置需要显示日志的路由

handlers:处理器,配置日志的处理方式,包括:写入文件配置、调试打印配置、发送邮件配置等

loggers:日志处理员(我起的名字),可以配置多个不同的日志处理角色,进行不同的操作。


在文件中使用logger
首先导入logging库,并调用在setting.py中配置的loggers
  • import logging
  • splogger = logging.getLogger('spider')

在需要调用日志的地方添加代码

  • splogger.info("开始同步")
  • splogger.warning("未打开页面,重新打开")
  • splogger.error("同步失败")

这个是自动生成的日志文件。

还遇到个问题是正常启动没问题,但是按时间分隔日志文件的时候报错。

启动的时候需要加个参数

  • python manage.py runserver 0.0.0.0:80

还有个简单的启动方法

在项目根目录下创建一个run.py文件,在里面添加以下代码,每次启动时只需要启动这个文件就可以,没必要每次都输命令。

  • import os
  • if __name__ == '__main__':
  • os.system('python manage.py runserver 0.0.0.0:80')
  • # os.system('python manage.py runserver 0.0.0.0:80 --noreload')