需求
在Django
项目中实现控制台输出到日志文件,并且设置固定的大小以及当超过指定大小后覆盖最早的信息。
系统日志
使用Django自带的配置,可以自动记录Django的系统日志。
可以使用logging
模块来配置。下面是一个完整的示例代码,展示了如何在Django
的settings.py
文件中配置日志记录。
确保在INSTALLED_APPS
中包含了logging.config
。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 配置日志
'logging.config',
]
在settings.py
中添加以下日志配置:
# 添加LOGGING配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {lineno} {process:d} {thread:d} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
# 控制台输出
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# 文件日志输出
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'django.log'),
'maxBytes': 1024 * 1024 * 5, # 最大文件大小为5MB
'backupCount': 5, # 保留5个备份文件
'formatter': 'verbose'
},
},
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': 'INFO',
},
},
}
在这个配置中:
handlers
部分定义了两种处理方式:控制台输出和文件输出。文件输出使用了RotatingFileHandler
类,它可以限制日志文件的大小,并在达到最大值时自动创建新的日志文件,同时保留一定数量的旧日志文件。
formatters
部分定义了日志消息的格式。
loggers
部分指定了哪些日志应该被记录,以及它们使用的处理方式和级别。
此配置使得Django
能够同时向控制台和指定的日志文件输出信息,日志文件的最大大小被限制为5MB,并且最多保留5个备份文件。当日志文件大小超过设定值时,最早的日志会被新日志覆盖。
formatter
可选择的输出格式见looging的官方文档。
实测结果
控制台输出
INFO "POST /login/ HTTP/1.1" 302 0
INFO:django.server:"POST /login/ HTTP/1.1" 302 0
INFO "GET /index/ HTTP/1.1" 200 5510
INFO:django.server:"GET /index/ HTTP/1.1" 200 5510
文件输出
INFO 2024-09-26 15:36:11,223 basehttp 124 26760 32436 "GET / HTTP/1.1" 200 5510
INFO 2024-09-26 15:36:11,238 basehttp 124 26760 15316 "GET /static/js/bootstrap.min.js HTTP/1.1" 200 37045
INFO 2024-09-26 15:36:11,239 basehttp 124 26760 23132 "GET /static/css/bootstrap.min.css HTTP/1.1" 200 121200
INFO 2024-09-26 15:36:11,239 basehttp 124 26760 23012 "GET /static/js/jquery.min.js HTTP/1.1" 200 84284
自定义日志
自定义一个类。
自定义类
import logging
from logging.handlers import RotatingFileHandler
class MyLogging(logging.Logger):
def __init__(self, name="mylog", level="DEBUG", file=None,
fmt="%(asctime)s %(name)s %(filename)s [%(lineno)d] %(levelname)s:%(message)s"):
# 直接超继承Logger中的name
super().__init__(name)
# 配置日志级别
self.setLevel(level)
# 初始化格式
formatter = logging.Formatter(fmt)
# 初始化处理器
# 如果file为空,执行stream_handler, 不空,都执行
# 自定义日志写入文件
if file:
# 创建日志记录器,指明日志保存路径,每个日志文件的最大值,保存的日志文件的个数上限。
# file_handler = logging.FileHandler(file)
file_handler = RotatingFileHandler(file, maxBytes=1024 * 1024, backupCount=5)
# 设置handler级别
file_handler.setLevel(level)
# 添加handler
self.addHandler(file_handler)
# 添加日志处理器
file_handler.setFormatter(formatter)
# 自定义日志在后台Console中打印
stream_handler = logging.StreamHandler()
stream_handler.setLevel(level)
self.addHandler(stream_handler)
stream_handler.setFormatter(formatter)
if __name__ == "__main__":
logger = MyLogging(file='./log.txt')
logger.debug('hello world')
logger.info('welcome to use logging')
在settings.py
中实例化
from static.utils.my_logging import MyLogging
# 启用日志文件
logger = MyLogging(file=os.path.join(BASE_DIR, 'sys_log.txt'))