Akemi

Python logging模块案例—切割日志与告警发送

2024/11/07

logging模块常规使用(配置默认日志记录器)

1
2
3
4
5
6
7
8
9
10
11
12
13
#coding=utf-8
import logging

# 配置默认日志记录器:设置开启的日志级别
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s-%(levelname)s-%(message)s',
datefmt='%Y-%m-%d-%H:%M:%S')
# 记录日志,调用logging日志记录器
logging.debug("debug...")
logging.info("info...")
logging.info("warning...")
logging.info("error...")
logging.info("critical...")

logging模块常规使用(创建自定义日志记录器)

要使用自定义日志记录器,至少需要两个组件,一个是日志记录器一个是文件处理器

日志记录器就是从logging.getLogger方法里实例化来的,
文件处理器有很多类型,通过不同方法实例化,比如FileHandler写入文件的、rotating切割日志的、SMTP配置邮件的

除了日志记录器和文件处理器,还有一个控制台处理器,一个格式化器

控制台处理器就是高于设定等级的告警,会被直接抛出到控制台中
格式化器是自定义格式,相当于nginx中的log_format参数

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
#coding=utf-8
import logging

# 创建记录器
logger=logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# 创建控制台处理器——达到这个等级,才会在控制台中被输出
console_handler=logging.StreamHandler()
console_handler.setLevel(logging.WARNING)

# 创建文件处理器——将日志写入文件
file_handler=logging.FileHandler('app.log',encoding='utf-8')
file_handler.setLevel(logging.DEBUG)

# 创建格式化器——对日志进行格式化
# asctime——当前时间,name——记录器名称,即my_logger
log_formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s',datefmt='%Y-%m-%d_%H:%M:%S')

# 将控制台处理器与格式化器绑定
console_handler.setFormatter(log_formatter)
file_handler.setFormatter(log_formatter)

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

# 测试记录日志
logger.debug('debug test')
logger.info('info test')
logger.warning('warning test')
logger.error('error test')
logger.critical('critical test')

with open('app.log','r') as f:
for line in f.readlines():
print(line,end='')

logging模块-日志文件切割(使用旋转日志处理器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#coding=utf-8
import logging
from logging.handlers import RotatingFileHandler

# 使用logging RotatingFileHandler方法进行日志切割

# 创建一个新日志记录器
logger=logging.getLogger('rotating_logger')
logger.setLevel(logging.DEBUG)

# 创建旋转文件处理器
# maxBytes——最大日志大小,单位为B
# backupCount——最大日志数量
handler=RotatingFileHandler('my.log',maxBytes=2000,backupCount=5,encoding="utf-8")
# 文件处理器绑定日志记录器
logger.addHandler(handler)

for i in range(1000):
logger.debug(f'test {i} 次')

logging模块-告警邮件发送(使用SMTP处理器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#coding=utf-8
from logging.handlers import SMTPHandler
import logging

# 初始化一个日志记录器
logger=logging.getLogger("smtp_mail_logger")
logger.setLevel(logging.ERROR)

# 配置邮件处理器
mail_handler=SMTPHandler(mailhost=('smtp.163.com',25),
fromaddr='alertwarning@163.com',
toaddrs=['1320991378@qq.com'],
subject='错误日志',
credentials=('alertwarning@163.com','GAANBCIHILSARBYD'),
secure=())

# 绑定日志记录器和邮件处理器
logger.addHandler(mail_handler)

logger.debug("debug test")
logger.error("error test")

CATALOG