前言
Logging模块是Python标准库中的一个模块,用于记录和输出代码执行时的信息、警告、错误等日志。
0、logging模块的作用
Logging模块是Python标准库中用于记录和输出代码执行时的日志信息的一个工具。它可以记录程序在运行过程中发生的各种事件和错误,如异常、警告、调试信息等,并将这些信息输出到不同的目标位置,如控制台、文件、网络等,以便开发者和管理员更好地理解和调试程序。
Logging模块的作用可以总结为以下几点:
- 支持多种日志级别:Logging模块支持多种不同的日志级别,包括DEBUG、INFO、WARNING、ERROR、CRITICAL等,开发者可以根据需要选择适合的级别记录不同程度的信息。
- 自定义日志格式:Logging模块提供了灵活的配置选项,允许开发者自定义日志的格式,包括日期、时间、日志级别、模块名、函数名等等信息,使得开发者可以根据自己的需要记录和查看日志信息。
- 支持多种输出方式:Logging模块可以将日志信息输出到不同的目标位置,包括控制台、文件、网络等,同时也支持多种输出格式,如JSON、CSV等。
- 帮助调试和故障排查:Logging模块可以帮助开发者更快地定位和解决问题,如调试程序、发现潜在问题、监控系统运行状况等。
总之,Logging模块可以帮助开发者更好地理解和调试程序,同时也可以帮助管理员监视和维护应用程序。它是Python编程中非常重要的一个工具。
一、logging.basicConfig()
logging.basicConfig():logging.basicConfig()是Logging模块中用于配置基本日志行为的函数。它通常是Logging模块的第一个被调用的函数,用于配置日志输出的基本信息。
logging.basicConfig()函数可以接受一些关键字参数,用于指定日志输出的格式、级别和目标位置等信息。常用的参数如下:
# define: 顾名思义,basciConfig是用来设置一些日志的的配置参数 # 参数介绍: # filename: 指定保存日志的文件名 # filemode: 指定打开文件的模式,默认为'a',即追加模式,也可以设置为'w', 即每次写日志的时候会覆盖之前的日志。 # format: 指定输出的格式和内容,详见三 # datefmt: 指定时间格式 # level:指定日志的记录级别,默认为logging.WARNING, 详见第二点 # eg:经常使用的参数是filename、level、format,其他一般采取默认。 import logging logging.basicConfig(filename='Hello.log', level=logging.ERROR, format = '[%(asctime)s]-%(thread)d-%(levelname)s(%(name)s): %(message)s - %(filename)s:%(lineno)d')
需要注意的是,logging.basicConfig()函数只能在第一次调用Logging模块的时候生效,而且是全局生效的,也就是说一旦设置了基本的配置参数,后续的所有Logging输出都会受到影响。因此,如果需要更细粒度地控制Logging模块的行为,应该使用Logger和Handler等更高级的组件来完成。
二、日志等级
- Logging模块中定义了5个不同等级的日志级别,分别是:
# 日志由低到高 # DEBUG: 记录最详细的日志信息。调试bug时使用。 # INFO: 记录一些设置的关键节点信息。正常操作信息。 # WARNING: 警告,记录一些以后可能会出错的信息,但是现在可以正常运行。 # ERROR: 错误,记录由于更严重的问题而导致软件无法执行某些功能时的信息。 # CRITICAL: 严重,记录发生严重错误,程序本身可能无法继续运行时的信息。即致命错误信息。 # 默认的等级是WARNING,即warning级别及以上的日志会输出。 import logging # 设置日志级别为DEBUG logging.basicConfig(level=logging.DEBUG) # 输出不同级别的日志信息 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')
- 默认情况下,Logging模块只会输出WARNING级别及以上的日志信息,也就是说,只有当出现警告、错误、严重错误等情况时,Logging模块才会输出日志信息。
- 上述代码中,设置了日志级别为DEBUG,因此Logging模块将输出所有等级的日志信息。而如果将日志级别设置为WARNING,只有WARNING、ERROR、CRITICAL级别的日志信息才会输出。
总之,在使用Logging模块时,开发者可以根据需要选择不同的日志级别,以便更好地控制和调试程序。
三、输出格式参数format。
Logging模块中,可以通过format参数来指定输出日志的格式。format参数是一个字符串,其中包含变量和文字。当Logging模块输出日志时,它将根据format字符串来生成日志信息。
format字符串中可以包含以下变量:
# 日志级别:%(levelno)s # 日志级别名称:%(levelname)s # 当前程序的路径:%(pathname)s # 当前程序名称:%(filename)s # 日志所属的当前函数:%(fileName)s # 日志的时间:%(asctime)s # 线程的名称:%(threadName)s # 日志的信息:%(message)s # 日志的当前行号:%(lineno)d # 线程的ID:%(thread)d # 进程的ID:%(process)d # 例如,如果要输出日志的时间、日志级别和日志信息,可以使用以下的format参数: import logging logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.INFO) logging.info('This is an info message.')
上述代码中,format字符串包含了三个变量:asctime、levelname和message。其中asctime代表时间,levelname代表日志级别,message代表日志信息。输出结果类似于:
2023-03-17 14:20:34,123 INFO: This is an info message.
四、进阶使用
4-1、日志输出到文件
日志输出到文件:默认情况下,Logging模块将日志输出到控制台。如果需要将日志输出到文件中,可以通过指定filename参数来实现:
import logging logging.basicConfig(filename='example.log', level=logging.INFO) logging.info('This is an info message.')
4-2、日志旋转
日志旋转:如果需要定期清理和归档日志文件,可以使用logging.handlers模块中的RotatingFileHandler或TimedRotatingFileHandler来实现。
import logging.handlers handler = logging.handlers.TimedRotatingFileHandler('example.log', when='midnight', backupCount=7) handler.setLevel(logging.INFO) logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', handlers=[handler]) logging.info('This is an info message.')
- 上述代码中,使用TimedRotatingFileHandler来处理日志,设置when参数为’midnight’,表示在每天午夜生成新的日志文件,backupCount参数表示最多保存7个旧日志文件。
4-3、日志过滤
日志过滤:如果需要过滤某些日志信息,可以使用Logging模块中的Filter类来实现。例如:
import logging class MyFilter(logging.Filter): def filter(self, record): return 'important' in record.getMessage() handler = logging.StreamHandler() handler.setLevel(logging.INFO) handler.addFilter(MyFilter()) logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', handlers=[handler]) logging.info('This is an info message.') logging.info('This is an important message.')
上述代码中,自定义了一个MyFilter类,过滤不包含’important’字符串的日志信息。
4-4、使用Logger对象
使用Logger对象:除了使用Logging模块中的basicConfig函数外,还可以使用Logger类来创建和处理日志信息。例如:
import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) handler = logging.StreamHandler() handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info('This is an info message.')
- 上述代码中,使用Logger类来创建logger对象,并添加handler和formatter。这种方式可以更灵活地控制日志的处理和输出。
- 总之,在使用Logging模块时,开发者需要考虑到各种因素,如日志的处理方式、格式、输出位置、过滤等,以便更好地记录和调试程序。
参考文章:
总结
✌,小论文终于有了一点点进展,总算不会觉得那么难过了。