Python 的 logging
模块是 Python 标准库的一部分,它提供了一个灵活的框架来将日志信息发送到不同的目的地,如控制台、文件、远程服务器等。使用 logging
模块,你可以控制日志信息的级别,并且可以针对不同的应用模块进行日志管理。
1. 日志级别
DEBUG
: 调试信息,用于问题诊断。
INFO
: 一般信息,用于记录程序运行状态。
WARNING
: 警告信息,表示有潜在问题。
ERROR
: 错误信息,表示严重问题。
CRITICAL
: 临界信息,表示非常严重的问题。
日志级别默认为 WARNING
,从大到小为:
CRITICAL > ERROR > WARNING > INFO > DEBUG
输出的日志是设置的日志级别及其以上级别:
如果设置的日志级别为 WARNING,则只会显示 WARNING 及其以上级别的信息:WARNING
, ERROR
, CRITICAL
2. 简单🌰 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import logginglog_file = 'demo_log.log' log_format = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s : %(message)s' logging.basicConfig(filename=log_file, level=logging.DEBUG, format =log_format, filemode='w' ) 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' )
结果:
1 2 3 4 2024-08-08 11:33:40,649 - demo_log0.py[line:16] - INFO : This is an info message 2024-08-08 11:33:40,649 - demo_log0.py[line:17] - WARNING : This is a warning message 2024-08-08 11:33:40,649 - demo_log0.py[line:18] - ERROR : This is an error message 2024-08-08 11:33:40,649 - demo_log0.py[line:19] - CRITICAL : This is a critical message
3. 高级🌰 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 import logging, oslog_path = os.path.join(os.path.dirname(__file__), 'demo_log.log' ) logger = logging.getLogger('__name__' ) logger.setLevel(logging.DEBUG) fh = logging.FileHandler(log_path, mode='w' ) fh.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.ERROR) log_formatter = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s : %(message)s' formatter = logging.Formatter(log_formatter) ch.setFormatter(formatter) fh.setFormatter(formatter) logger.addHandler(ch) logger.addHandler(fh) logger.error('error message' ) logger.debug('debug message' )
在这个示例中,我们创建了一个 Logger
对象,并设置了两个 Handler:一个输出到控制台的 StreamHandler
和一个输出到文件的 FileHandler
。我们还定义了一个 Formatter
来格式化日志消息,并将其应用到了两个 Handler 上。最后,我们添加了日志消息,它们会根据设置的日志级别被输出到相应的目的地。
4. 封装后使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 import logging, osdef demo_log2 (): log_path = os.path.join(os.path.dirname(__file__), 'demo_log.log' ) logger = logging.getLogger('__name__' ) logger.handlers.clear() logger.setLevel(logging.DEBUG) fh = logging.FileHandler(log_path, mode='a' ) fh.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.ERROR) log_formatter = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s : %(message)s' formatter = logging.Formatter(log_formatter) ch.setFormatter(formatter) fh.setFormatter(formatter) logger.addHandler(ch) logger.addHandler(fh) return logger
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import demo_log2def calc_sum (a, b ): logger = demo_log2.demo_log2() try : sum = a / b logger.debug(f'{a} / {b} = {sum } ' ) return sum except ZeroDivisionError as e: logger.error(f'被除数不能为 0: {e} ' ) if __name__ == '__main__' : calc_sum(1 ,1 ) calc_sum(1 ,0 )
输出结果:
控制台输出结果:
1 2024-08-08 15:13:56,611 - demo_user_log.py[line:13] - ERROR : 被除数不能为 0: division by zero
日志文件输出结果:
1 2 2024-08-08 15:13:56,611 - demo_user_log.py[line:10] - DEBUG : 1 / 1 = 1.0 2024-08-08 15:13:56,611 - demo_user_log.py[line:13] - ERROR : 被除数不能为 0: division by zero