前言
django的日志配置是比较简单的,通常是通过总配置文件 settings.py
文件中的LOGGING
配置字典来完成的。
LOGGING
允许你定义日志的格式、处理器(handlers)以及日志记录器(loggers),配置好后,你就可以在django应用的任何地方通过Python的logging
模块来调用日志功能了。
配置与使用
配置
settings.py - LOGGING 的配置
# ================================================= #
# ********************* 日志配置 ******************* #
# ================================================= #
SERVER_LOGS_FILE = os.path.join(BASE_DIR, "logs", "server.log")
ERROR_LOGS_FILE = os.path.join(BASE_DIR, "logs", "error.log")
LOGS_FILE = os.path.join(BASE_DIR, "logs")
if not os.path.exists(os.path.join(BASE_DIR, "logs")): # 如果目录不存在就创建
os.makedirs(os.path.join(BASE_DIR, "logs"))
# 格式:[2020-04-22 23:33:01][micoservice.apps.ready():16] [INFO] 这是一条日志:
# 格式:[日期][模块.函数名称():行号] [级别] 信息
STANDARD_LOG_FORMAT = (
"[%(asctime)s][%(name)s.%(funcName)s():%(lineno)d] [%(levelname)s] %(message)s"
)
CONSOLE_LOG_FORMAT = (
"[%(asctime)s][%(name)s.%(funcName)s():%(lineno)d] [%(levelname)s] %(message)s"
)
LOGGING = {
"version": 1, # 版本号
"disable_existing_loggers": False, # 是否禁用已经存在的日志器
"formatters": { # 格式化器
"standard": {"format": STANDARD_LOG_FORMAT}, # 标准日志输出格式
"console": { # 控制台输出日志配置
"format": CONSOLE_LOG_FORMAT, # 日志输出的格式
"datefmt": "%Y-%m-%d %H:%M:%S", # 时间格式
},
"file": { # 文件输出日志配置
"format": CONSOLE_LOG_FORMAT,
"datefmt": "%Y-%m-%d %H:%M:%S",
},
},
"handlers": { # 处理器
"file": {
"level": "INFO", # 日志文件,将设置为记录INFO级别及以上
"class": "logging.handlers.RotatingFileHandler", # 使用RotatingFileHandler处理服务器日志
"filename": SERVER_LOGS_FILE, # 写入文件的路径名称
"maxBytes": 1024 * 1024 * 100, # 100 MB
"backupCount": 5, # 最多备份5个
"formatter": "standard", # 使用标准日志格式(上面的 formatters有配置,引用名称即可)
"encoding": "utf-8",
},
"error": {
"level": "ERROR",
"class": "logging.handlers.RotatingFileHandler",
"filename": ERROR_LOGS_FILE,
"maxBytes": 1024 * 1024 * 100, # 100 MB
"backupCount": 3, # 最多备份3个
"formatter": "standard",
"encoding": "utf-8",
},
"console": {
"level": "INFO",
"class": "logging.StreamHandler", # 使用StreamHandler处理服务器日志,控制台一般用 StreamHandler
"formatter": "console",
},
},
"loggers": { # 日志器,配置这个可以在其他模块通过logging模块调用使用
"": {
"handlers": ["console", "error", "file"], # 将日志发送到 console、error和file处理器(console控制台输出 file日志写入文件,以上有配置)
"level": "INFO", # 日志记录等级 INFO 及以上
},
"django": {
"handlers": ["console", "error", "file"],
"level": "INFO",
"propagate": False,
},
'django.db.backends': {
'handlers': ["console", "error", "file"],
'propagate': False,
'level': "INFO"
},
"uvicorn.error": {
"level": "INFO",
"handlers": ["console", "error", "file"],
},
"uvicorn.access": {
"handlers": ["console", "error", "file"],
"level": "INFO"
},
},
}
调用日志器
其他模块调用日志器,自定义输出日志的内容,帮助排查定位
from django.http import HttpResponse
from rest_framework.views import APIView
class LogTestView(APIView):
permission_classes = []
def get(self, request):
import logging
# 获取日志记录器 这个是在settings.py配置的
django_logger = logging.getLogger('django')
backends_logger = logging.getLogger('django.db.backends')
uvicorn_error_logger = logging.getLogger('uvicorn.error')
django_logger.info("调用django日志器输出")
backends_logger.info("调用django.db.backends日志器输出")
uvicorn_error_logger.info("调用uvicorn.error日志器输出")
return HttpResponse("测试")
日志输出示例:
补充说明:
1. django是有内置的标准日志输出,我们在settings中配置LOGGING是覆盖了django的默认日志
2. 我们在settings中配置的控制台输出日志格式,如果项目部署在docker下,可以使用docker logs 查看日志,和在控制台看日志是一致的
补充日志格式
1. 日志等级
DEBUG : 10
INFO:20
WARN:30
ERROR。40
CRITICAL:50
数字越大,等级越高!!
2. 日志用处
DEBUG(调试):用于开发阶段的调试,开启后,会记录程序运行过程中的所有详细信息,用于排查代码逻辑问题;在生产环境一般不建议长期开启,会产生大量的日志数据
INFO(信息)::通常用来记录系统运行的关键事件或正常流程信息,或者是自定义输出日志帮助自己排查问题
WARN(警告):记录可能潜在的问题或者非预期情况,但不影响系统整体运行的情况;可以提前发现可能存在的风险,避免小问题逐渐恶化成严重故障
ERROR(错误):记录系统出现错误或异常情况,这些情况可能会导致功能无法正常使用或部分服务中断
CRITICAL(致命): 显示应用程序中发生了严重的错误,比如程序失败
3. 日志格式
示例:format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s'
filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中
pathname:打印当前执行程序的路径,其实就是sys.argv[0]
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
4. format参数中的格式化串
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息