logging模块

在Python中,常用的用于写错误日志的库是logging。以下是一个简单的示例,演示如何在Python中使用logging库来记录错误日志:

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
import logging

# 创建日志记录器
logger = logging.getLogger('error_logger')
logger.setLevel(logging.ERROR)

# 创建一个文件处理器,将日志写入文件
file_handler = logging.FileHandler('error.log')
file_handler.setLevel(logging.ERROR)

# 创建一个控制台处理器,将日志输出到控制台
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.ERROR)

# 定义日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# 将处理器添加到日志记录器
logger.addHandler(file_handler)
logger.addHandler(console_handler)

try:
# 在这里写你的代码
# 如果发生了错误
raise Exception('这是一个错误示例')
except Exception as e:
# 记录错误日志
logger.error(str(e))

以上代码创建了一个名为error_logger的日志记录器,并将错误级别设置为logging.ERROR。然后,创建了一个文件处理器(FileHandler)和一个控制台处理器(StreamHandler),分别用于将日志写入文件和输出到控制台。最后,定义了日志的格式,并将处理器添加到日志记录器中。

try块中的代码中,如果发生了错误,可以使用logger.error()方法将错误信息记录到日志文件和控制台中。

请注意,在使用logging库之前,需要先导入logging模块。

格式

logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')这句代码是用于定义日志的格式。

  • %(asctime)s:表示日志记录的时间,即当前时间,以可读的形式显示(例如:”2022-09-30 10:30:15”)。
  • %(levelname)s:表示日志的级别,如DEBUGINFOWARNINGERRORCRITICAL等。
  • %(message)s:表示实际的日志消息。

这样的定义可以让日志以特定的格式显示,方便阅读和分析日志。在这个例子中,日志的格式为:时间 - 日志级别 - 日志消息。例如:2022-09-30 10:30:15 - ERROR - 这是一个错误示例

还可以根据需要自定义日志的格式,使用不同的占位符来输出不同的信息,例如输出日志记录器的名称%(name)s、输出所在的模块%(module)s等等。更多的占位符和格式选项可以参考Python官方文档的Logging.Formatter部分。

分隔存储

如果所有错误日志都写入同一个文件,会导致文件越来越大。为了解决这个问题,可以使用logging库的RotatingFileHandlerTimedRotatingFileHandler来分隔文件存储。下面是示例代码:

1.使用RotatingFileHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import logging
from logging.handlers import RotatingFileHandler

logger = logging.getLogger('error_logger')
logger.setLevel(logging.ERROR)

# 创建一个RotatingFileHandler,最多存储10个日志文件,每个文件最大为1MB
file_handler = RotatingFileHandler('error.log', maxBytes=1048576, backupCount=10)
file_handler.setLevel(logging.ERROR)

# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# 添加处理器到日志记录器
logger.addHandler(file_handler)

try:
# 在这里写你的代码
# 如果发生了错误
raise Exception('这是一个错误示例')
except Exception as e:
logger.error(str(e))

使用RotatingFileHandler时,可以通过maxBytes参数设置每个日志文件的最大大小,通过backupCount参数设置最多存储的日志文件数量。

2.使用TimedRotatingFileHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import logging
from logging.handlers import TimedRotatingFileHandler

logger = logging.getLogger('error_logger')
logger.setLevel(logging.ERROR)

# 创建一个TimedRotatingFileHandler,每天生成一个日志文件
file_handler = TimedRotatingFileHandler('error.log', when='midnight', interval=1)
file_handler.setLevel(logging.ERROR)

# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)

# 添加处理器到日志记录器
logger.addHandler(file_handler)

try:
# 在这里写你的代码
# 如果发生了错误
raise Exception('这是一个错误示例')
except Exception as e:
logger.error(str(e))

使用TimedRotatingFileHandler时,可以通过when参数指定日志文件的轮转时间间隔(例如:midnight表示每天生成一个日志文件),通过interval参数指定轮转时间间隔的数量。

除了midnightTimedRotatingFileHandlerwhen参数还支持以下几种有效的取值:

  • S: 表示每秒生成一个日志文件。
  • M: 表示每分钟生成一个日志文件。
  • H: 表示每小时生成一个日志文件。
  • D: 表示每天生成一个日志文件。
  • W0 ~ W6: 表示每个星期的周一至周日分别生成一个日志文件。
  • midnight: 表示每天的午夜(00:00)生成一个日志文件。

这些取值可以根据需要灵活选择,以满足不同的日志轮转需求。例如,如果需要每小时生成一个日志文件,可以将when参数设置为'H';如果需要每周生成一个日志文件,可以将when参数设置为'W0' ~ 'W6',其中W0表示周一,W1表示周二,依此类推。

注意,这些取值均为大小写敏感。另外,TimedRotatingFileHandler还支持interval参数,用于指定轮转时间间隔的数量。例如,interval=2表示每2个时间单位生成一个日志文件(如每2小时、每2天等)。

更多关于TimedRotatingFileHandler的详细信息,可以查看Python官方文档的Logging.handlers.TimedRotatingFileHandler部分。