python logging 详解
Python的logging模块提供了灵活的日志记录功能,可以记录各种级别的日志消息,并可以将日志消息输出到文件、控制台、网络等不同的位置。
下面是Python logging模块的详细使用方法:
1. 导入logging模块
import logging
2. 配置日志记录器
可以通过BasicConfig()方法来配置日志记录器的基本属性,例如日志级别、输出格式、输出位置等。
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)s %(message)s',
filename='myapp.log',
filemode='w')
其中:
- level:设置日志级别,可以设置为DEBUG、INFO、WARNING、ERROR、CRITICAL。
- format:设置日志输出格式,可以自己定义输出格式,例如’%(asctime)s %(levelname)s %(message)s’,表示输出时间、日志级别和消息内容。
- filename:设置日志输出文件名,如果不设置则默认输出到控制台。
- filemode:设置日志输出文件的打开模式,可以设置为’w’表示覆盖写,'a’表示追加写。
3. 记录日志消息
可以使用logging模块提供的不同方法来记录不同级别的日志消息,例如:
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
4. 自定义日志记录器
可以通过Logger类来自定义日志记录器,例如:
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler('myapp.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
其中:
- getLogger():获取日志记录器,可以设置记录器名称。
- setLevel():设置日志级别。
- FileHandler():设置日志输出位置,可以设置输出文件名。
- Formatter():设置日志输出格式。
- addHandler():添加处理器。
5. 日志轮换
可以使用logging模块提供的RotatingFileHandler或TimedRotatingFileHandler类来实现日志轮换,例如:
handler = logging.handlers.RotatingFileHandler('myapp.logmaxBytes=1024*1024, backupCount=5)
handler.setFormatter(formatter)
logger.addHandler(handler)
其中:
- RotatingFileHandler():创建日志轮换处理器,可以设置最大文件大小和备份数量。
- maxBytes:设置日志文件最大大小,超过这个大小就会自动创建新的日志文件。
- backupCount:设置备份数量,超过这个数量就会删除最早的日志文件。
TimedRotatingFileHandler类可以按照时间轮换日志文件,例如:
handler = logging.handlers.TimedRotatingFileHandler('myapp.log', when='midnight', backupCount=5)
handler.setFormatter(formatter)
logger.addHandler(handler)
其中:
- TimedRotatingFileHandler():创建按时间轮换的日志处理器。
- when:设置轮换时间,可以设置为’midnight’、‘H’、'M’等不同的时间间隔。
6. 日志过滤器
可以通过Filter类来设置日志过滤器,只有符合条件的日志消息才会被记录,例如:
class MyFilter(logging.Filter):
def filter(self, record):
return 'important' in record.getMessage()
handler = logging.FileHandler('myapp.log')
handler.addFilter(MyFilter())
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is an important warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
其中:
- Filter():创建日志过滤器。
- filter():实现过滤器的逻辑,返回True表示记录该日志消息,返回False表示忽略该日志消息。
7. 日志异常跟踪
可以通过exc_info参数来记录异常信息,例如:
try:
raise ValueError('This is an exception message')
except ValueError:
logger.error('Exception occurred', exc_info=True)
其中:
- exc_info=True:记录异常信息,包括异常类型、异常消息和异常堆栈。
以上就是Python logging模块的详细使用方法,通过灵活配置和使用,可以实现各种不同场景下的日志记录和管理。
8. 日志输出到控制台和文件
在默认情况下,日志信息只会输出到文件中,如果需要同时输出到控制台,可以添加StreamHandler处理器,例如:
import sys
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(formatter)
logger.addHandler(handler)
其中:
- StreamHandler():创建输出到控制台的处理器,可以设置输出流。
- sys.stdout:设置输出流为标准输出。
9. 使用配置文件
可以通过配置文件来设置日志记录器的属性,例如:
[loggers]
keys=root,sampleLogger
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[logger_sampleLogger]
level=DEBUG
handlers=fileHandler
qualname=sampleLogger
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('myapp.log', 'w')
[formatter_simpleFormatter]
format=%(asctime)s %(levelname)s %(message)s
datefmt=%Y-%m-%d %H:%M:%S
其中:
- loggers:设置日志记录器的名称。
- handlers:设置日志处理器的名称。
- formatters:设置日志格式化器的名称。
- logger_*:设置日志记录器的属性,例如日志级别、处理器、传递性等。
- handler_*:设置日志处理器的属性,例如处理器类型、日志级别、格式化器等。
- formatter_*:设置日志格式化器的属性,例如输出格式、时间格式等。
可以通过fileConfig()方法来加载配置文件,例如:
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('sampleLogger')
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')
10. 使用第三方库
除了Python自带的logging模块之外,还有一些第三方库可以实现更多的功能和扩展,例如:
- loguru:提供了更加灵活和方便的日志记录方式。
- structlog:提供了更加可定制化和扩展性的日志记录方式。
- coloredlogs:提供了彩色输出和更加易读的日志信息。
- logbook:提供了更加高效和线程安全的日志记录方式。
这些第三方库都有其自己的特点和优势,可以根据具体需求选择适合的库来实现日志记录和管理。
11. format格式详解
logging模块中的format参数用于设置日志的格式化输出方式,可以自定义输出的内容和格式。下面是format参数的详解:
- %(asctime)s:日志记录时间,格式为“年-月-日 时:分:秒,毫秒”。
- %(name)s:日志记录器的名称。
- %(levelname)s:日志级别名称。
- %(message)s:日志消息内容。
- %(pathname)s:当前执行代码的路径。
- %(filename)s:当前执行代码的文件名。
- %(funcName)s:当前执行函数的名称。
- %(lineno)d:当前执行代码的行号。
- %(thread)d:当前执行线程的ID。
- %(threadName)s:当前执行线程的名称。
- %(process)d:当前执行进程的ID。
- %(processName)s:当前执行进程的名称。
例如,设置日志格式为’%(asctime)s %(levelname)s %(message)s’,表示输出时间、日志级别和消息内容。
还可以通过添加格式控制符来进一步定制输出格式,例如:
- %(levelname)-8s:设置日志级别名称的宽度为8个字符,左对齐。
- %(message).50s:设置日志消息内容的最大宽度为50个字符,超过部分截断。
- %(asctime)s,%(msecs)03d:设置日志记录时间的毫秒部分为3位数字,例如“2021-09-23 10:23:45,123”。
- %(filename)s:%(lineno)d:设置当前执行代码的文件名和行号,例如“test.py:20”。
通过灵活使用格式控制符,可以实现各种不同的输出格式和显示效果,方便日志记录和查看。
12. 总结
Python的logging模块提供了灵活的日志记录功能,可以记录各种级别的日志消息,并可以将日志消息输出到文件、控制台、网络等不同的位置。通过灵活配置和使用,可以实现各种不同场景下的日志记录和管理。在实际应用中,需要根据具体需求选择合适的日志记录方式和工具,以方便运维和调试。