Django配置日志输出、logging配置最详细大全、控制台日志全部输出到文件、日志/控制台console重定向到文件
阅读原文时间:2021年04月20日阅读:1

django线上环境中的日志输出是相当重要的,它可以将所有的错误、警告、调试等重要信息全部输出到日志,这样便于维护和排查问题。
接下来本文会详细的介绍django logging配置,以及这些配置的含义与作用。
用到的东西,本文也会尽量详细的解答:
首先先来看看实际中配置:配置settings.py

写在最前
python manage.py runserver >> /home/aea/log/test.log 表示运行django时将console全部重定向到/home/aea/log/test.log
注意:这时你的django控制台的打印会一直是空白,因为已经全部重定向到/home/aea/log/test.log文件,,推荐在生产环境中使用,并关闭debug
保证你配置的所有log文件地址正确且文件存在,否则会报错!
DEBUG = False  #线上环境时要关闭debug
ALLOWED_HOSTS = ['*']   #线上环境时要允许所有ip访问,或有自己的规则

#下面就是logging的配置
LOGGING = {
    'version': 1,  # 指明dictConnfig的版本,目前就只有一个版本,哈哈
    'disable_existing_loggers': False,  # 表示是否禁用所有的已经存在的日志配置
    'formatters': {  # 格式器
        'verbose': {  # 详细
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'standard': {  # 标准
            'format': '[%(asctime)s] [%(levelname)s] %(message)s'
        },
    },
    # handlers:用来定义具体处理日志的方式,可以定义多种,"default"就是默认方式,"console"就是打印到控制台方式。file是写入到文件的方式,注意使用的class不同
    'handlers': { # 处理器,在这里定义了两个个处理器
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'stream': 'ext://sys.stdout',   # 文件重定向的配置,将打印到控制台的信息都重定向出去 python manage.py runserver >> /home/aea/log/test.log
            # 'stream': open('/home/aea/log/test.log','a'),  #虽然成功了,但是并没有将所有内容全部写入文件,目前还不清楚为什么
            'formatter': 'standard'   # 制定输出的格式,注意 在上面的formatters配置里面选择一个,否则会报错
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/home/aea/log/jwt_test.log',  #这是将普通日志写入到日志文件中的方法,
            'formatter': 'standard'
        },
        'default': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': '/home/aea/log/all.log',     #日志输出文件
            'maxBytes': 1024*1024*5,                  #文件大小
            'backupCount': 5,                         #备份份数
            'formatter':'standard',                   #使用哪种formatters日志格式
        },
        # 上面两种写入日志的方法是有区别的,前者是将控制台下输出的内容全部写入到文件中,这样做的好处就是我们在views代码中的所有print也会写在对应的位置
        # 第二种方法就是将系统内定的内容写入到文件,具体就是请求的地址、错误信息等,小伙伴也可以都使用一下然后查看两个文件的异同。
    },
    'loggers': {  # log记录器,配置之后就会对应的输出日志
        # django 表示就是django本身默认的控制台输出,就是原本在控制台里面输出的内容,在这里的handlers里的file表示写入到上面配置的file-/home/aea/log/jwt_test.log文件里面
        # 在这里的handlers里的console表示写入到上面配置的console-/home/aea/log/test.log文件里面
        'django': {
            'handlers': ['console','file'],
            # 这里直接输出到控制台只是请求的路由等系统console,当使用重定向之后会把所有内容输出到log日志
            'level': 'DEBUG',
            'propagate': True,
        },
        'django.request ':{
            'handlers': ['console','file'],
            'level': 'WARNING',  # 配合上面的将警告log写入到另外一个文件
            'propagate': True,
        },
        'django.db.backends': {
            'handlers': ['file'], # 指定file handler处理器,表示只写入到文件
            'level':'DEBUG',
            'propagate': True,
        },
    },
}

下面是对参数和配置的解释

level:级别

一个记录器是日志系统的一个实体,每一个记录器是一个已经命名好的可以将消息为进程写入的“桶”。
每一个记录器都会有一个日志等级,每个等级描述了记录器即将处理的信息的严重性,python定义了以下六个等级:
级别 值 描述
CRITICAL 50 关键错误/消息,描述已经发生的严重问题
ERROR 40 错误,描述已经发生的主要问题
WARNING 30 警告消息,描述已经发生的小问题
INFO 20 通知消息,普通的系统信息列表内容
DEBUG 10 调试,出于调试目的的低层次系统信息
NOTSET 0 无级别

处理器/记录器 关键字参数:

关键字参数 描述
filename 将日志消息附加到指定文件名的文件
filemode 指定用于打开文件模式, 文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format 用于生成日志消息的格式字符串
datefmt 用于输出日期和时间的格式字符串
level 设置记录器的级别
propagate 可以基于每个记录器控制该传播。 如果您不希望特定记录器传播到其父项,则可以关闭此行为。
stream 提供打开的文件,用于把日志消息发送到文件。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。
若同时列出了filename和stream两个参数,则stream参数会被忽略。

format: 日志消息格式

格式 描述
%(name)s 记录器的名称
%(levelno)s 数字形式的日志记录级别
%(levelname)s 日志记录级别的文本名称
%(filename)s 执行日志记录调用的源文件的文件名称
%(pathname)s 执行日志记录调用的源文件的路径名称
%(funcName)s 执行日志记录调用的函数名称
%(module)s 执行日志记录调用的模块名称
%(lineno)s 执行日志记录调用的行号
%(created)s 执行日志记录的时间
%(asctime)s 日期和时间
%(msecs)s 毫秒部分
%(thread)d 线程ID
%(threadName)s 线程名称
%(process)d 进程ID
%(message)s 记录的消息

内置处理器

logging模块提供了一些处理器,可以通过各种方式处理日志消息。使用addHandler()方法将这些处理器添加给Logger对象。另外还可以为每个处理器配置它自己的筛选和级别。
logging.StreamHandler 可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息
logging.FileHandler 将日志消息写入文件filename。
logging.handlers.DatagramHandler(host,port) 发送日志消息给位于制定host和port上的UDP服务器。使用UDP协议,将日志信息发送到网络
logging.handlers.HTTPHandler(host, url) 使用HTTP的GET或POST方法将日志消息上传到一台HTTP 服务器。
logging.handlers.RotatingFileHandler(filename) 将日志消息写入文件filename。如果文件的大小超出maxBytes制定的值,那么它将被备份为filenamel。
logging.handlers.SocketHandler 使用TCP协议,将日志信息发送到网络。
logging.handlers.SysLogHandler 日志输出到syslog
logging.handlers.NTEventLogHandler 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.SMTPHandler 远程输出日志到邮件地址
logging.handlers.MemoryHandler 日志输出到内存中的制定buffer
注意:由于内置处理器还有很多,如果想更深入了解。可以查看官方手册。

django提供的内置记录器

django 在Django层次结构中的所有消息记录器。没有使用此名称发布消息,而是使用下面的记录器之一。
django.request 与请求处理相关的日志消息。5xx响应被提升为错误消息;4xx响应被提升为警告消息。
django.server 与由RunServer命令调用的服务器所接收的请求的处理相关的日志消息。HTTP 5XX响应被记录为错误消息,4XX响应被记录为警告消息,其他一切都被记录为INFO。
django.template 与模板呈现相关的日志消息
django.db.backends 有关代码与数据库交互的消息。例如,请求执行的每个应用程序级SQL语句都在调试级别记录到此记录器。

部署生产环境建议使用的方法

很多时候我们在代码中会增加很多print 来打印一些调试和测试的内容,默认情况下这些内容全部打印在控制台。
问题是生产环境上,进程都是后台运行的,所有我们可以使用,将控制台打印的所有内容全部重定向到日志文件即可。
参考我上面的配置,在console的handler中配置了‘stream’: ‘ext://sys.stdout’,
它会将我们的控制台输出全部重定向写入到文件中去。
命令是:
这条命令含义是:在后台运行进程,并将所有的控制台输出全部重定向到文件

nohup python manage.py runserver >>/home/aea/log/test.log &