DEBUG:用于调试目的的低级系统信息
INFO:一般系统信息
WARNING:描述已发生的小问题的信息。
ERROR:描述已发生的主要问题的信息。
CRITICAL:描述已发生的严重问题的信息。
Django的日志模块其实就是python的logging模块。它由4部分组成:
Logger 记录仪:生成和记录每条日志信息及级别
Handler处理程序: 根据日志信息级别交由相应处理程序处理(比如生成文件或发送邮件)
Filters 过滤器:日志交由处理程序处理前需要满足的过滤条件(比如Debug=True或False)
Formaters 格式化程序:决定每条日志的打印输出格式,可以有完整版的,也有简单版的
在Django下,在settings中,写入日志范例代码如下:
LOGGING = {
'version': 1, # 保留字
'disable_existing_loggers': False, # 是否禁用已经存在的日志实例
'formatters': { # 定义日志的格式
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]'
},
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
'collect': {
'format': '[%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
}
},
'filters': { # 定义日志的过滤器
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': { # 日志处理程序
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'SF': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,根据文件大小自动切
'filename': os.path.join(BASE_LOG_DIR, "zhiliao_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 500, # 日志大小 50M(最好不要超过1G)
'backupCount': 3, # 备份数为3 xx.log --> xx.log.1 --> xx.log.2 --> xx.log.3
'formatter': 'standard',
'encoding': 'utf-8', # 文件记录的编码格式
},
'TF': {
'level': 'INFO',
'class': 'logging.handlers.TimedRotatingFileHandler', # 保存到文件,根据时间自动切
'filename': os.path.join(BASE_LOG_DIR, "zhiliao_info.log"), # 日志文件
'backupCount': 3, # 备份数为3 xx.log --> xx.log.2018-08-23_00-00-00 --> xx.log.2018-08-24_00-00-00 --> ...
'when': 'D', # 每天一切, 可选值有S/秒 M/分 H/小时 D/天 W0-W6/周(0=周一) midnight/如果没指定时间就默认在午夜
'formatter': 'standard',
'encoding': 'utf-8',
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "zhiliao_err.log"), # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 50M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
'collect': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "zhiliao_collect.log"),
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'collect',
'encoding': "utf-8"
}
},
'loggers': { # 日志实例
'': { # 默认的logger应用如下配置
'handlers': ['SF', 'console', 'error'], # 上线之后可以把'console'移除
'level': 'DEBUG',
'propagate': True, # 是否向上一级logger实例传递日志信息
},
'collect': { # 名为 'collect' 的logger还单独处理
'handlers': ['console', 'collect'],
'level': 'INFO',
}
},
}
格式化字符串的种类
%(name)s:记录器logger的名称
%(levelno)s:日志级别对应的数字
%(levelname)s:日志级别名称
%(pathname)s:日志记录调用的源文件的完整路径
%(filename)s:日志记录调用的源文件名
%(module)s:模块名
%(lineno)d:日志调用的行数
%(funcName)s:函数名
%(created)f:日志创建时间,time.time()
%(asctime)s:日志创建时间,文本类型
%(msecs)d:日志创建时间的毫秒部分
%(relativeCreated)d:日志创建时间 - 加载日志模块的时间 的 毫秒数
%(thread)d:线程ID
%(threadName)s:线程名
%(process)d:进程ID
%(processName)s:进程名
%(message)s:日志消息
过滤器filter用于提供对日志记录从logger传递到handler的附加控制。配置过滤器,在handler中使用。如下所示:
'filters': { # 定义日志的过滤器
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
这个类是确定logger中消息发生的引擎程序,描述特定的日志记录行为,譬如控制台打印、写入日志文件、通过网络进行发送等。与logger一样,handler也具有日志级别,如果日志记录的日志级别未达到或超过handler的级别,则handler将忽略该消息。一个logger可以有多个handler,每个handler可以有不同的日志级别和记录方法,settings中配置,4个参数(如下),加上对应class类的初始化参数:
class(必需):处理程序类的名称
level(可选的):处理程序的级别
formatter(可选的):处理程序的格式化程序
filters(可选的):处理程序的过滤器的列表
level:指定记录日志的级别,没有配置则处理所有级别的日志
propagate:设置该记录器的日志是否传播到父记录器,不设置则是True
filters:指定过滤器列表
handlers:指定处理器列表
import logging
# 实例化logging对象,并以当前文件的名字作为logger实例的名字
logger = logging.getLogger(__name__);#默认日志参数
# 生成一个名字叫做 collect 的日志实例
logger_collect = logging.getLogger('collect');#指定名称日志参数
import logging
# 输出到控制台,设置格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
# 输出到文件,默认是追加模式
# logging.basicConfig(filename='test.log', filemode="a", level=logging.INFO)
logging.debug("输出debug")
logging.info("输出info")
logging.warning("输出warning")
logging.error("输出error")
logging.critical("输出critical")
import logging
# 创建logger对象
logger = logging.getLogger('my_logger')
# 设置日志等级
logger.setLevel(logging.INFO)
# 输出的日志信息格式
formatter = logging.Formatter('%(asctime)s-%(filename)s-line:%(lineno)d-%(levelname)s-%(process)s: %(message)s')
# 写到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)
# 写到文件
file_handler = logging.FileHandler('test.log', encoding='utf-8')
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
# 设置到logger对象中
logger.addHandler(file_handler)
logger.addHandler(console_handler)
if __name__ == "__main__":
logger.debug('this is debug message')
logger.info('this is info message')
logger.error("errorxxxxxxx")
如有疑问,敬请留言。