在 logging 模块中,日志级别从低到高的顺序是:
-
DEBUG:最低的日志级别,用于调试和详细信息记录。
-
INFO:用于一般的信息性消息,表示程序正常运行的关键事件。
-
WARNING:用于警告消息,表示潜在的问题或不符合预期的情况,但不会影响程序的正常运行。
-
ERROR:用于错误消息,表示可恢复的错误或异常情况,可能会影响程序的正常运行。
-
CRITICAL:最高的日志级别,用于严重错误消息,表示严重的错误或异常情况,可能导致程序无法继续运行。
在默认情况下,logging 模块的日志级别设置为 WARNING,这意味着只有 WARNING、ERROR 和 CRITICAL 级别的日志消息会被记录和输出,而 DEBUG 和 INFO 级别的消息会被忽略。您可以通过设置适当的日志级别来控制哪些级别的日志消息将被记录和输出。
请注意,当设置日志级别时,当前级别及以上的消息将被记录,而低于当前级别的消息将被忽略。例如,如果将日志级别设置为 INFO,那么只有 INFO、WARNING、ERROR 和 CRITICAL 级别的消息会被记录和输出,而 DEBUG 级别的消息将被忽略。
logging.basicConfig(**kwargs)
**kwargs
中的两个星号 **
是 Python 中的一种语法,用于表示将多个关键字参数(keyword arguments)作为字典传递给函数。在 logging.basicConfig()
中使用 **kwargs
的目的是接受任意数量的关键字参数,并将它们作为配置参数传递给函数。
当调用 logging.basicConfig()
时,可以通过关键字参数的方式传递配置参数。这些关键字参数会被收集到 **kwargs
字典中,然后传递给 basicConfig()
函数进行处理。函数内部会解析这些参数并根据配置进行日志记录的设置。
使用 **kwargs
的优势是可以在调用函数时提供灵活的配置参数,而不需要事先指定固定的参数列表。这样可以根据需要传递不同的配置参数,使函数更具通用性和适应性。
需要注意的是,在使用 **kwargs
时,传递的关键字参数必须符合函数所期望的参数名称和类型。否则,将会引发 TypeError
或其他相关的异常。
logging.basicConfig()
是 logging 模块中用于配置基本日志记录行为的函数。它通常在应用程序的早期调用,用于设置全局的日志配置。
basicConfig()
函数接受一系列关键字参数来配置日志记录的行为。以下是一些常用的参数:
-
level
:指定日志记录的级别,接受以下常量:logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL。默认为 logging.WARNING。 -
format
:指定日志消息的格式,用于控制日志消息的显示方式。格式中可以使用不同的格式化占位符来包含时间戳、级别、消息等信息。默认格式为'%(message)s'
。 -
filename
:指定日志文件的路径。如果提供了该参数,日志消息将被写入到文件中而不是输出到控制台。默认为将日志消息输出到控制台。 -
filemode
:指定日志文件的打开模式,默认为 'a'(追加模式)。可以设置为 'w'(覆盖模式)或其他有效的文件打开模式。 -
stream
:指定日志消息的输出流,默认为sys.stderr
(标准错误输出流)。可以将其设置为其他文件对象或流来自定义日志消息的输出目标。 -
datefmt
:指定时间戳的格式,用于控制时间戳的显示方式。 -
style
:指定格式化字符串的样式,可以是 '%' 或 '{',默认为 '%'。
通过调用 logging.basicConfig()
并传递适当的参数,可以配置 logging 模块的基本行为,包括日志级别、格式、输出目标等。这样配置后,可以使用 logging 模块的其他方法记录日志消息,并根据配置进行输出。
示例:
logging.basicConfig(level=logging.INFO, format='%(asctime)s[%(levelname)s]: %(message)s', filename=filename + '/%s' % train_time, filemode='a')
其中:format='%(asctime)s[%(levelname)s]: %(message)s'为最常用
-
%(asctime)s
是一个占位符,用于插入日志消息的时间戳。asctime
表示时间戳,s
表示字符串。 -
[%(levelname)s]
是用于插入日志级别的占位符。levelname
表示日志级别,s
表示字符串。方括号用于将级别括起来,以增加可读性。 -
%(message)s
是用于插入日志消息内容的占位符。message
表示消息内容,s
表示字符串。
因此,这个格式字符串将生成带有时间戳、日志级别和消息内容的日志消息。例如,一个示例的日志消息可能如下所示:
2022-01-01 10:30:00[INFO]: This is an information message
其中,2022-01-01 10:30:00
是时间戳,INFO
是日志级别,This is an information message
是消息内容。
filename=filename + '/%s' % train_time, /*是用于设置日志文件路径的部分。*/
这行代码使用了 %
运算符来进行字符串格式化。具体来说,'%s' % train_time
将 train_time
变量的值插入到字符串中的 %s
占位符处。
假设 filename
的初始值为一个目录路径,例如 /path/to/logs
,而 train_time
是一个表示训练时间的字符串,例如 20220101_120000
,那么执行该行代码后,filename
的值将被更新为 /path/to/logs/20220101_120000
,即在原始目录路径后面追加了训练时间。
这样,通过将 filename
设置为包含训练时间的路径,您可以将日志记录写入到指定的目录和文件中,使日志文件具有唯一的名称标识训练时间。
filemode='a'
是 logging.basicConfig()
函数中的一个关键字参数,用于设置日志文件的打开模式。
filemode
参数用于指定打开日志文件的模式。在这种情况下,'a'
表示以追加模式打开日志文件。追加模式意味着如果文件已存在,新的日志消息将被追加到文件的末尾,而不会覆盖现有内容。如果文件不存在,将会创建一个新的文件。
使用追加模式有助于保留日志记录的历史信息,而不会丢失之前的日志。这对于持续记录应用程序的日志非常有用,以便后续分析和故障排查。
如果您希望每次运行时都创建一个新的日志文件,并覆盖之前的日志内容,可以将 filemode
设置为 'w'
,表示覆盖模式。
请注意,filemode
参数仅在使用 filename
参数指定了日志文件路径时才有效,以指示如何打开和处理日志文件。如果未提供 filename
参数,则 filemode
参数不起作用,因为日志消息将被输出到控制台而不是文件中。
logging.basicConfig()
是对日志记录器的设置。
logging.basicConfig()
函数用于配置根日志记录器的基本行为,它会对根日志记录器进行一次性的基本配置。在这里,通过调用 basicConfig()
函数,对根日志记录器进行了以下设置:
level=logging.INFO
:设置日志级别为INFO
,即只记录INFO
级别及以上的日志消息。format='%(asctime)s[%(levelname)s]: %(message)s'
:设置日志消息的格式,包括时间戳、日志级别和消息内容。filename=filename + '/%s' % train_time
:设置日志文件的路径和名称,其中filename
是日志文件的目录路径,train_time
是日志文件的名称。filemode='a'
:设置文件模式为追加模式,即将日志消息追加到文件中而不覆盖之前的内容。
这些设置是对根日志记录器的全局配置,会影响所有通过根日志记录器进行的日志记录操作。它们会被应用到所有的日志处理器(handlers),包括之后添加到根日志记录器的处理器。
需要注意的是,basicConfig()
函数只能在应用程序中调用一次,且通常在程序的开始阶段调用。如果在调用 basicConfig()
之前已经创建了其他处理器或进行了其他配置,那么 basicConfig()
函数的设置可能会被忽略。因此,建议在程序的早期调用 basicConfig()
函数进行基本配置,并在需要时使用其他方法对日志记录器和处理器进行更详细的配置。
且filename=filename + '/%s' % train_time
:设置日志文件的路径和名称,其中 filename
是日志文件的目录路径,train_time
是日志文件的名称。
这句话体现了
filename
是用于配置文件处理器(FileHandler)的参数,而不是文件处理器的名称。具体来说,filename
是用于指定日志消息输出文件的路径和名称。
logging.basicConfig()
函数中的 filename
参数指定了日志消息的输出文件名。通过将 filename
设置为特定路径和名称,可以将日志消息写入该文件中。
所以上述对根日志记录器进行基本设置的时候,也设置了文件处理器(FileHandler)。
对于根日志记录器(Root Logger),在使用 logging.basicConfig()
函数进行基本配置时,会自动创建并配置默认的文件处理器(FileHandler),并且设置了默认的日志级别和格式。
对于根日志记录器,logging.basicConfig()
函数的调用确实会进行基本设置,并且会自动配置一个文件处理器(FileHandler)。
level=logging.INFO
参数设置了根日志记录器以及其关联的文件处理器的日志级别为 INFO
,即只记录 INFO
级别及以上的日志消息。
同样地,format='%(asctime)s[%(levelname)s]: %(message)s'
参数设置了根日志记录器和文件处理器的日志消息格式,其中包含了时间戳、日志级别和消息内容。
通过调用 logging.basicConfig()
函数进行基本设置时,会同时设置根日志记录器和与其关联的文件处理器的日志级别和格式。
所以,尽管没有显式地调用 setLevel()
和 setFormatter()
方法来配置文件处理器,但在调用 logging.basicConfig()
函数时,它会自动进行这些设置,使文件处理器具有默认的日志级别和格式。
# 定义一个Handler打印INFO及以上级别的日志到sys.stderr console = logging.StreamHandler() console.setLevel(logging.INFO) # 设置日志打印格式 formatter = logging.Formatter('%(asctime)s[%(levelname)s]: %(message)s') console.setFormatter(formatter) # 将定义好的console日志handler添加到root logger logging.getLogger().addHandler(console)
上述代码新建一个日志处理器(console代表控制台的意思)
对这个控制台日志处理器进行基础设置,(输出级别、打印格式)
最后将这个制台日志处理器添加到根日志记录器root logger中。