不管是纯python项目或者是django项目,日志的使用大同小异,主要分为两个步骤:
- logging 的配置
- logging 的使用
logging的配置
python中有三种配置日志的方式:
使用python代码显示的创建loggers,handlers,formatters,并分别调用他们的配置函数
创建一个日志配置文件,然后使用 fileConfig 方法进行配置
示例:
# 读取日志配置文件内容 logging.config.fileConfig('logging.conf') # 创建一个日志器logger logger = logging.getLogger('simpleExample') # 日志输出 logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')
示例配置文件 logging.conf:
[loggers] keys=root,simpleExample [handlers] keys=fileHandler,consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=fileHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler] class=StreamHandler args=(sys.stdout,) level=DEBUG formatter=simpleFormatter [handler_fileHandler] class=FileHandler args=('logging.log', 'a') level=ERROR formatter=simpleFormatter [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
使用字典配置信息
日志配置四大组件:
日志配置数据结构,这里主要使用 Dict 的方式配置日志。
LOGGING = {
'version': 1,
'disable_existing_loggers': False, # 可选项,默认值为True。该选项用于指定是否禁用已存在的日志器loggers
'formatters': {
'standard': {'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s] %(message)s'}
},
'handlers':{},
'loggers':{},
'root':{} # 可选项,这是root logger的配置信息,其值也是一个字典对象。除非在定义其它logger时明确指定propagate值为no,否则root logger定义的handlers都会被作用到其它logger上
}
Loggers (日志记录器)
用来配置选择哪种 Handles 处理日志
Handles (处理器)
定义处理日志的方式。logging 模块提供了一些处理器,例如:
- handlers.FileHandler(filename):将日志消息写入文件filename。、
- handlers.RotatingFileHandler(filename):将日志消息写入文件filename。如果文件的大小超出maxBytes制定的值,那么它将被备份为filename1。
- StreamHandler:将日志写入到控制台
- TimedRotatingFileHandler:按照时间分割日志文件,可按天、周、分、秒保存日志文件
Filters (过滤器)
Formatters (格式化日志输出)
定义日志输出格式。
示例: 'formatters': { 'standard': { 'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s] %(message)s'} }, %(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的使用
import logging
logger = logging.getLogger("console") # 显示调用配置字典定义好的loggers里面的日志记录器。
logger = logging.getLogger(__name__)
def index(request):
logger.debug("hello")
django中使用logging
django中使用logging,只需在 settings.py 中定义配置字典 LOGGING,示例如下:
settings.py :
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s] %(message)s'}
# 日志格式
},
'filters': {
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
},
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '{}/Log/QWebFX_{}.log'.format(BASE_DIR, datetime.datetime.now().date()), # 日志输出文件
'maxBytes': 1024 * 1024 * 5, # 文件大小
'backupCount': 5, # 备份份数
'formatter': 'standard', # 使用哪种formatters日志格式
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '{}/Log/Error/QWebFX_Error_{}.log'.format(BASE_DIR, datetime.datetime.now().date()),
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standard',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
'request_handler': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '{}/Log/Request/QWebFX_Request_{}.log'.format(BASE_DIR, datetime.datetime.now().date()),
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standard',
},
'scripts_handler': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '{}/Log/Script/QWebFX_Script_{}.log'.format(BASE_DIR, datetime.datetime.now().date()),
'maxBytes': 1024 * 1024 * 5,
'backupCount': 5,
'formatter': 'standard',
}
},
'loggers': {
'django': { # django,打印所有信息到名称为console的handler。
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
'django.request': {
'handlers': ['request_handler'],
'level': 'DEBUG',
'propagate': False,
},
'scripts': {
'handlers': ['scripts_handler'],
'level': 'INFO',
'propagate': False
},
'console': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True
},
# API/Views 模块的日志处理
'views': {
'handlers': ['default', 'error'],
'level': 'DEBUG',
'propagate': True
},
'util': {
'handlers': ['error'],
'level': 'ERROR',
'propagate': True
},
}
}