我们都知道在项目中日志是非常重要的,因为项目在服务器中运行出现了Bug没有日志去记录,我们可能根本就不知道存在这个Bug。以前在学校自己搞搞开发没觉得,现在想想日志真的不可或缺。
首先了解日志的5个等级:
- debug:出于调试目的的低层次系统信息
- info:普通的系统信息列表内容
- warning:描述已经发生的小问题
- error:描述已经发生的主要问题
- critical:描述已经发生的严重问题
第一步:配置Django中的setting.py文件
LOGGING = {
'version': 1,
'disable_existing_loggers': False if DEBUG else True, # 是否禁用已经存在的日志器
'formatters': { # 日志信息显示的格式
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)s %(message)s'
# "class": "pythonjsonlogger.jsonlogger.JsonFormatter"
},
'simple': {
'format': '%(levelname)s %(asctime)s %(module)s %(funcName)s %(lineno)d %(message)s'
# "class": "pythonjsonlogger.jsonlogger.JsonFormatter"
}, # 日志记录级别+时间日期+模块名称+函数名称+行号+记录消息
},
'filters': { # 对日志进行过滤
'require_debug_true': { # django在debug模式下才输出日志
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': { # 日志处理方法
'console': { # 向终端中输出日志
'level': 'DEBUG' if DEBUG else 'INFO',
'filters': ['require_debug_true'], # debug为true才会输出
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'info': { # 向文件中输出日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR+'/logs/', "info.log"), # 日志文件的位置
'maxBytes': 300 * 1024 * 1024, # 300M大小
'backupCount': 10,
'formatter': 'verbose',
'encoding': 'utf-8'
},
'demo': { # 专门定义一个收集特定信息的日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_DIR+'/logs/', "demo.log"),
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'verbose',
'encoding': "utf-8"
},
'city': { # 专门定义一个收集特定信息的日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_DIR+'/logs/', "city.log"),
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'verbose',
'encoding': "utf-8"
},
},
'loggers': { # 日志器
"django": { # 默认的logger应用如下配置
"handlers": ["info", "console"],
"propagate": True,
"level": "INFO"
},
'demo_log': { # 名为 'demo'的logger还单独处理
'handlers': ['demo'],
"propagate": True,
'level': 'INFO',
},
'city_log': { # 名为 'city'的logger还单独处理
'handlers': ['city'],
"propagate": True,
'level': 'INFO',
},
}
}
formatters:日志信息显示的格式,可以定义多种格式,上面定义了'verbose'和'simple'两种格式:
例如'verbose'的格式为'%(levelname)s %(asctime)s %(module)s %(lineno)s %(message)s'
在log文件打印的例子就会是这样:INFO 2019-12-05 09:04:28,707 views 234 打印出来了!!!
handlers:日志处理方法,可以定义多种方法,一般我习惯每增加一个Django子应用就新增一个,上面的'demo'和'city'是子应用。
loggers:日志器,我习惯和handlers一一对应编写。
handlers与loggers都存在level,两者不同:
1、loggers中的level表示可以接受的错误级别,就是说loggers接受level或者比level更高级别的错误,由propagate决定:propagate为True, 则向上传播;
2、handlers的level表示日志级别
注:要在项目根目录新建logs目录,用于存放log日志文件,日志文件不需要手动新建,项目运行的时候会自行新建。
第二步:新增exceptions.py文件封装日志
import logging
logger = logging.getLogger('django')
logger_demo = logging.getLogger('demo_log')
logger_city = logging.getLogger('city_log')
第三步:打印日志
logger.info("我打印在控制台上也打印在info.log上")
logger.error("我打印在控制台上也打印在info.log上")
logger_demo.info("我打印在demo.log上")
logger_demo.error("我打印在demo.log上")
logger_city.info("我打印在city.log上")
logger_city.error("我打印在city.log上")
这样就完成了,是不是很简单很easy!!!