python 日志讲解
基本用法
import logging
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')
将日志记录到文件中
import logging
# 配置日志文件和日志级别
logging.basicConfig(filename='logger.log', level=logging.INFO)
logging.debug('debug message')
logging.info('info message')
logging.warn('warn message')
logging.error('error message')
logging.critical('critical message')
更加完善的日志功能
- Logger 即记录器,Logger提供了日志相关功能的调用接口。
Logger对象从不直接实例化,而是通过模块级的功能logging.getLogger(name)创建Logger实例。调用 logging.getLogger(name) 功能时,如果传入的name参数值相同,则总是返回同一个Logger对象实例的引用
- Handler 即处理器,将(记录器产生的)日志记录发送至合适的目的地。
Handler 将日志信息发送到设置的位置,可以通过Logger对象的addHandler()方法为Logger对象添加0个或多个handler。这种往往应用到用户输出到不同地方需要不同的样式,等级的情况
常用的Handler为StreamHandler, FileHandler, 和NullHandle
- Filter 可用于Logger对象或Handler对象,用于提供比日志等级更加复杂的日志过滤方式。
如果把filter设置为filter=logging.Filter('A.B'),则logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ 产生的日志信息可以通过过滤,但'A.BB', 'B.A.B'均不行
- Formatter 即格式化器,指明了最终输出中日志记录的格式。
默认的日志格式为%(asctime)s - %(levelname)s - %(message)s
默认的时间格式为%Y-%m-%d %H:%M:%S
通过代码实现
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import logging
# create logger
logger = logging.getLogger('simple_example')
# Set default log level
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.WARN)
ch2 = logging.FileHandler('logging.log')
ch2.setLevel(logging.INFO)
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
file_log_handler = RotatingFileHandler("./logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch
ch.setFormatter(formatter)
ch2.setFormatter(formatter)
# add ch to logger
# The final log level is the higher one between the default and the one in handler
logger.addHandler(ch)
logger.addHandler(ch2)
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
通过配置文件配置并使用日志模块
通过配置文件配置日志模块时,配置文件通常使用.ini格式,日志模块需要调用fileConfig
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import logging
import logging.config
logging.config.fileConfig('logging_config.ini')
# create logger
logger = logging.getLogger('root')
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
logging_config.ini配置文件如下
[loggers]
keys=root,simpleExample
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_simpleExample]
level=INFO
handlers=consoleHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
通过Dict对象配置并使用日志模块
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import logging
import logging.config
config = {
'version': 1,
'formatters': {
'simple': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'formatter': 'simple'
},
'file': {
'class': 'logging.FileHandler',
'filename': 'logging.log',
'level': 'DEBUG',
'formatter': 'simple'
},
},
'loggers':{
'root': {
'handlers': ['console'],
'level': 'DEBUG',
# 'propagate': True,
},
'simple': {
'handlers': ['console', 'file'],
'level': 'WARN',
}
}
}
logging.config.dictConfig(config)
print 'logger:'
logger = logging.getLogger('root')
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
print 'logger2:'
logger2 = logging.getLogger('simple')
logger2.debug('debug message')
logger2.info('info message')
logger2.warn('warn message')
logger2.error('error message')
logger2.critical('critical message')