无论是纯python项目或者是django项目,日志的使用大同小异,主要分为两个步骤:html
使用python代码显示的建立loggers,handlers,formatters,并分别调用他们的配置函数python
建立一个日志配置文件,而后使用 fileConfig 方法进行配置django
示例:数据结构
# 读取日志配置文件内容 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
使用字典配置信息spa
日志配置数据结构,这里主要使用 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 (日志记录器)debug
用来配置选择哪一种 Handles 处理日志日志
Handles (处理器)code
定义处理日志的方式。logging 模块提供了一些处理器,例如:
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 记录的消息
import logging logger = logging.getLogger("console") # 显示调用配置字典定义好的loggers里面的日志记录器。 logger = logging.getLogger(__name__) def index(request): logger.debug("hello")
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 }, } }