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日志并进行多维度分析。
目录
相关文章
|
11天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
117 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
PyTorch Linux 算法框架/工具
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
这篇文章是关于如何使用Anaconda进行Python环境管理,包括下载、安装、配置环境变量、创建多版本Python环境、安装PyTorch以及使用Jupyter Notebook的详细指南。
249 1
pytorch学习一:Anaconda下载、安装、配置环境变量。anaconda创建多版本python环境。安装 pytorch。
|
19天前
|
安全 网络安全 数据安全/隐私保护
|
7天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
113 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
7天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的控制文件与归档日志文件
本文介绍了Oracle数据库中的控制文件和归档日志文件。控制文件记录了数据库的物理结构信息,如数据库名、数据文件和联机日志文件的位置等。为了保护数据库,通常会进行控制文件的多路复用。归档日志文件是联机重做日志文件的副本,用于记录数据库的变更历史。文章还提供了相关SQL语句,帮助查看和设置数据库的日志模式。
【赵渝强老师】Oracle的控制文件与归档日志文件
|
4天前
|
JSON Shell Linux
配置Python的环境变量可
配置Python的环境变量
20 4
|
5天前
|
Windows Python
如何反向读取Windows系统日志EVTX文件?
以下是如何反向读取Windows系统日志EVTX文件
15 2
|
7天前
|
Oracle 关系型数据库 数据库
【赵渝强老师】Oracle的参数文件与告警日志文件
本文介绍了Oracle数据库的参数文件和告警日志文件。参数文件分为初始化参数文件(PFile)和服务器端参数文件(SPFile),在数据库启动时读取并分配资源。告警日志文件记录了数据库的重要活动、错误和警告信息,帮助诊断问题。文中还提供了相关视频讲解和示例代码。
|
1月前
|
SQL 数据库
为什么 SQL 日志文件很大,我应该如何处理?
为什么 SQL 日志文件很大,我应该如何处理?
|
1月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
288 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。