python-logging全局日志配置-滚动删除,只保存最近7天的日志,按级别存入不同文件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 最近有这样一个需求,需要记录一下用户行为,和记下一些错误日志,放入指定文件夹里不同的文件下,方便后续debug。我决定采用python logging模块。并且使用配置文件,并做一个全局的globalLog.py来使用logging。 (关键词:logging,TimedRotatingFileHandler)

最近有这样一个需求,需要记录一下用户行为,和记下一些错误日志,放入指定文件夹里不同的文件下,方便后续debug。我决定采用python logging模块。并且使用配置文件,并做一个全局的globalLog.py来使用logging。 (关键词:logging,TimedRotatingFileHandler)

——————————————第一步——————————————

添加配置文件logger_config.ini。文件的后缀名其实无所谓,conf,ini或者别的都行。我把该文件放置在/{$项目名}/resource/路径下。

重点1:TimedRotatingFileHandler用来配置log的滚动删除,arg里的"midnight", 1, 6,'utf-8' 表示“每一天午夜12点将当天的日志转存到一份新的日志文件中,并且加上时间戳后缀,最多保存6个文件,编码格式UTF-8,支持中文”

重点2:如果要同时输出到2个文件和屏幕上,那么需要使用三个handler,2个为TimedRotatingFileHandler,还有1个是StreamHandler

重点3:level级别如下,级别越低,打印的日志越详细,例如级别为noset,则会打印出所有信息,如果级别为info,那么不会打印出debug信息。我们的例子中,级别为info,日志里不会打印出debug的信息

下面是详细的配置文件: [loggers] keys=root 
[handlers] keys=rotatingFileHandler,streamHandler,errorHandler 
[formatters] keys=simpleFmt 
[logger_root] level=DEBUG 
handlers=rotatingFileHandler,streamHandler,errorHandler 
[handler_rotatingFileHandler] 
class=handlers.TimedRotatingFileHandler level=INFO formatter=simpleFmt args=(os.path.abspath(os.getcwd() + "/resource/ta_log/default.log"),"midnight", 1, 6,'utf-8') 
[handler_errorHandler] class=handlers.TimedRotatingFileHandler level=ERROR formatter=simpleFmt args=(os.path.abspath(os.getcwd() + "/resource/ta_log/error.log"), "midnight", 1, 6,'utf-8') 
[handler_streamHandler] level=INFO class=StreamHandler formatter=simpleFmt args=(sys.stdout,) 
[formatter_simpleFmt] format=%(asctime)s %(pathname)s(%(lineno)d): %(levelname)s %(message)s

——————————————第二步——————————————

编写globalLog.py 作为全局log的管理入口。

后续别的模块下的python文件需要使用日志功能时,需要导入该模块。该模块的原理也很简单,定位到文件路径,然后通过logger的名字获得要用的logger配置,例如我上面的配置文件中 [loggers] keys=root 所以这里就用了root.然后创建一个全局的logger对象,命名为ta_log

#globalLog.py
import logging
import logging.config
import os
def get_logger(name='root'):
    conf_log = os.path.abspath(os.getcwd() + "/resource/logger_config.ini")
    logging.config.fileConfig(conf_log)
    return logging.getLogger(name)
ta_log = get_logger(__name__)

——————————————第三步——————————————

在需要打印日志的地方使用该方法,例如在main.py里通过ta_log.info()打印日志。该方法会打印各个级别的信息进入两个日志文件中。我们在第四步来看一看日志文件的内容

import sys
from globalLog import ta_log
if __name__ == '__main__':
    ta_log.info("start")
    try:
        print(1 / 0)
    except Exception:
        ta_log.error("error:")
        ta_log.exception(sys.exc_info())
    ta_log.debug("end")

——————————————第四步——————————————

运行程序,检查日志文件。 这是default.log,级别是info.没有记录ta_log.debug()的信息

2018-08-31 13:09:34,928 C:/lzw_programming/test/main.py(6): INFO start
2018-08-31 13:09:34,928 C:/lzw_programming/test/main.py(10): ERROR error:
2018-08-31 13:09:34,930 C:/lzw_programming/test/main.py(11): ERROR (<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x0000000003B38888>)
Traceback (most recent call last):
  File "C:/lzw_programming/test/main.py", line 8, in <module>
    print(1 / 0)
ZeroDivisionError: integer division or modulo by zero

这是error.log。级别是error。没有记录ta_log.info()和ta_log.debug()的信息

2018-08-31 13:09:34,928 C:/lzw_programming/testassist/main.py(10): ERROR error:
2018-08-31 13:09:34,930 C:/lzw_programming/testassist/main.py(11): ERROR (<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x0000000003B38888>)
Traceback (most recent call last):
  File "C:/lzw_programming/testassist/main.py", line 8, in <module>
    print(1 / 0)
ZeroDivisionError: integer division or modulo by zero

——————————————第五步——————————————

运行了3天主程序,查看是否滚动产生了新的日志信息,结果是把历史日志信息滚动复制到了新的文件里,后缀名为日期,如图。

image.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
361 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
12天前
|
计算机视觉 Python
如何使用Python将TS文件转换为MP4
本文介绍了如何使用Python和FFmpeg将TS文件转换为MP4文件。首先需要安装Python和FFmpeg,然后通过`subprocess`模块调用FFmpeg命令,实现文件格式的转换。代码示例展示了具体的操作步骤,包括检查文件存在性、构建FFmpeg命令和执行转换过程。
35 7
|
1月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
152 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
17天前
|
SQL
南大通用GBase 8a配置gcware日志等级,减少日志输出,节省磁盘IO
南大通用GBase 8a配置gcware日志等级,减少日志输出,节省磁盘IO
|
1月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
26天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
32 5
|
1月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
1月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
2月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
python知识点100篇系列(15)-加密python源代码为pyd文件
|
1月前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。