Advertisement

在Python多进程中实现按时间分割的日志记录

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:None


简介:
本文介绍了如何在Python多进程环境中,通过定时机制高效地管理和分割日志文件的方法和技术。 在Python多进程环境中实现日志记录按时间分割的方法如下: 原理是自定义一个继承于`TimedRotatingFileHandler`的日志处理器类,并且重写了`computeRollover()`与`doRollover()`函数,以支持按照整分钟、小时或天来划分日志文件。例如,如果选择按天进行分割,则每个新的日志文件覆盖的时间范围是从前一天的午夜到当天的午夜(即2018年4月10日零点至2018年4月11日零点),这形成了一个半闭区间。 以下是相关代码示例: ```python #!/usr/bin/env python # encoding: utf-8 from logging.handlers import TimedRotatingFileHandler, BackupLogRecordsMixin import os.path import time class CustomTimedRotatingFileHandler(TimedRotatingFileHandler): def __init__(self, filename, when=h, interval=1, backupCount=0, encoding=None, delay=False, utc=False): super().__init__(filename, when, interval, backupCount, encoding, delay) self.utc = utc # 重写computeRollover()函数 def computeRollover(self, currentTime): t = self.rolloverAt - self.interval if self.when == m: return int(currentTime / 60) * 60 + 1 elif self.when == h: return int(currentTime / 3600) * 3600 + 1 else: t += (self.interval - ((t - self.timezone) % self.interval)) if not os.path.exists(self.baseFilename): # 如果日志文件不存在,则创建一个新的,并设置rolloverAt为当前时间加上一个间隔周期。 last_update_time = time.time() else: # 否则,根据最后更新的时间来决定何时进行分割 st_info = os.stat(self.baseFilename) last_update_time = st_info.st_mtime return t def doRollover(self): if self.stream: self.stream.close() self.stream = None currentTime = int(time.time()) dstNow = time.localtime(currentTime)[-1] t = self.rolloverAt - self.interval if self.when == m: dfn = os.path.join( os.path.dirname(self.baseFilename), %s.%02d % (os.path.basename(self.baseFilename), currentTime // 60) ) elif self.when == h: dfn = os.path.join( os.path.dirname(self.baseFilename), %s.%02dh % (os.path.basename(self.baseFilename), currentTime // 3600) ) else: # 根据设定的时间间隔滚动日志文件 if self.utc: timeTuple = time.gmtime() else: timeTuple = time.localtime(currentTime) dfn = os.path.join( os.path.dirname(self.baseFilename), %s.%04d-%02d-%02dT%02h-%02m % ( os.path.basename(self.baseFilename), timeTuple.tm_year, timeTuple.tm_mon, timeTuple.tm_mday, timeTuple.tm_hour, timeTuple.tm_min ) ) if not os.path.exists(dfn) and dfn != self.baseFilename: # 如果新的日志文件不存在,创建它。 open(dfn, a).close() if os.path.exists(self.baseFilename): # 重命名当前的日志文件为dfn try: os.rename(self.baseFilename, dfn) except OSError as why: import sys print(why.args[1]) sys.exit(0) if self.backupCount > 0: for s in self.getFilesToDelete(): os.remove(s) self.mode = a self.stream = open(self.baseFilename, self.mode, encoding=self.encoding) ``` 以上代码展示了一个自定义的日志处理器类,它能够根据需要按分钟、小时或天来分割日志文件,并在每个时间间隔结束后创建新的日志文件。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • Python
    优质
    本文介绍了如何在Python多进程环境中,通过定时机制高效地管理和分割日志文件的方法和技术。 在Python多进程环境中实现日志记录按时间分割的方法如下: 原理是自定义一个继承于`TimedRotatingFileHandler`的日志处理器类,并且重写了`computeRollover()`与`doRollover()`函数,以支持按照整分钟、小时或天来划分日志文件。例如,如果选择按天进行分割,则每个新的日志文件覆盖的时间范围是从前一天的午夜到当天的午夜(即2018年4月10日零点至2018年4月11日零点),这形成了一个半闭区间。 以下是相关代码示例: ```python #!/usr/bin/env python # encoding: utf-8 from logging.handlers import TimedRotatingFileHandler, BackupLogRecordsMixin import os.path import time class CustomTimedRotatingFileHandler(TimedRotatingFileHandler): def __init__(self, filename, when=h, interval=1, backupCount=0, encoding=None, delay=False, utc=False): super().__init__(filename, when, interval, backupCount, encoding, delay) self.utc = utc # 重写computeRollover()函数 def computeRollover(self, currentTime): t = self.rolloverAt - self.interval if self.when == m: return int(currentTime / 60) * 60 + 1 elif self.when == h: return int(currentTime / 3600) * 3600 + 1 else: t += (self.interval - ((t - self.timezone) % self.interval)) if not os.path.exists(self.baseFilename): # 如果日志文件不存在,则创建一个新的,并设置rolloverAt为当前时间加上一个间隔周期。 last_update_time = time.time() else: # 否则,根据最后更新的时间来决定何时进行分割 st_info = os.stat(self.baseFilename) last_update_time = st_info.st_mtime return t def doRollover(self): if self.stream: self.stream.close() self.stream = None currentTime = int(time.time()) dstNow = time.localtime(currentTime)[-1] t = self.rolloverAt - self.interval if self.when == m: dfn = os.path.join( os.path.dirname(self.baseFilename), %s.%02d % (os.path.basename(self.baseFilename), currentTime // 60) ) elif self.when == h: dfn = os.path.join( os.path.dirname(self.baseFilename), %s.%02dh % (os.path.basename(self.baseFilename), currentTime // 3600) ) else: # 根据设定的时间间隔滚动日志文件 if self.utc: timeTuple = time.gmtime() else: timeTuple = time.localtime(currentTime) dfn = os.path.join( os.path.dirname(self.baseFilename), %s.%04d-%02d-%02dT%02h-%02m % ( os.path.basename(self.baseFilename), timeTuple.tm_year, timeTuple.tm_mon, timeTuple.tm_mday, timeTuple.tm_hour, timeTuple.tm_min ) ) if not os.path.exists(dfn) and dfn != self.baseFilename: # 如果新的日志文件不存在,创建它。 open(dfn, a).close() if os.path.exists(self.baseFilename): # 重命名当前的日志文件为dfn try: os.rename(self.baseFilename, dfn) except OSError as why: import sys print(why.args[1]) sys.exit(0) if self.backupCount > 0: for s in self.getFilesToDelete(): os.remove(s) self.mode = a self.stream = open(self.baseFilename, self.mode, encoding=self.encoding) ``` 以上代码展示了一个自定义的日志处理器类,它能够根据需要按分钟、小时或天来分割日志文件,并在每个时间间隔结束后创建新的日志文件。
  • 将当前
    优质
    本指南详细介绍如何在程序运行时获取并记录当前时间的时间戳至日志文件中,便于追踪和分析软件执行过程中的时间信息。 编写一个程序,该程序能够点击按钮获取当前时间的时间戳,并将结果保存到日志文件中。此程序应包含简单的图形用户界面。
  • Linux自动Tomcat
    优质
    本教程详解如何在Linux系统下利用脚本或工具自动按照日期对Tomcat服务器的日志文件进行分割处理。 本段落主要介绍了在Linux环境下如何自动按日期分割Tomcat日志的相关资料,供需要的读者参考。
  • Python Logging模块详解
    优质
    本文详细探讨了Python Logging模块的基本用法及高级特性,包括如何配置日志记录、格式化输出以及实现文件分割等功能。适合希望深入了解Python日志管理机制的开发者阅读。 ### Python Logging 模块书写日志以及日志分割详解 #### 概述 在软件开发过程中,合理地记录日志对于排查问题、监控系统状态至关重要。Python 的 `logging` 模块提供了强大的日志处理功能,它允许开发者自定义日志格式、日志级别以及输出目标等。本段落将详细介绍如何使用 Python 的 `logging` 模块来记录不同级别的日志,并通过示例演示如何实现日志文件的自动分割。 #### 一、Python Logging 模块简介 `logging` 是 Python 内置的一个用于日志记录的标准库。它提供了多种日志级别,包括 `DEBUG`, `INFO`, `WARNING`, `ERROR`, 和 `CRITICAL`。这些级别按照严重性递增排序。通常情况下,开发者会在代码中插入日志语句,这些语句在程序运行时输出到不同的目的地,如控制台或文件。 #### 二、配置日志记录 为了使用 `logging` 模块,首先需要创建一个 `Logger` 实例。然后可以通过添加不同的处理器(Handler)来指定日志消息的输出方式,例如输出到文件或者控制台。此外,还可以为每个处理器指定过滤器(Filter),以便根据日志消息的不同特性进行筛选。 #### 三、日志格式化 在配置处理器时,可以通过设置 `Formatter` 类来定制日志消息的格式。例如: ```python LOG_FORMAT = %(asctime)s------%(levelname)s[:%(lineno)d]-------%(message)s ``` 其中: - `%(asctime)s` 表示时间戳; - `%(levelname)s` 表示日志级别; - `%(lineno)d` 表示代码中的行号; - `%(message)s` 表示日志消息本身。 #### 四、日志文件的分割 当应用程序长时间运行时,单个日志文件可能会变得非常大。这不仅不利于查看,还可能导致性能问题。因此,在实际应用中往往需要定期分割日志文件。`logging` 模块提供了 `TimedRotatingFileHandler` 类来实现这一功能。 示例代码如下: ```python file_run_log = logging.handlers.TimedRotatingFileHandler(run_log, when=midnight, interval=1, backupCount=7) ``` 这里的参数解释如下: - `when=midnight` 表示日志文件在每天的午夜时刻被分割。 - `interval=1` 表示每隔一天执行一次日志分割操作。 - `backupCount=7` 表示保留最近七天的日志文件。 #### 五、日志实例编写 接下来,我们将通过一个具体的例子来展示如何配置日志记录器、处理器以及格式化器,并实现日志文件的自动分割: 1. **创建 Logger**:创建一个名为 `mylog` 的 Logger 实例。 2. **设置日志级别**:这里设置了 `DEBUG` 级别,表示可以记录所有级别的日志信息。 3. **添加处理器**:分别添加了用于记录错误日志和运行日志的处理器。 4. **配置日志输出格式**:定义了 `LOG_FORMAT` 作为所有处理器的日志格式。 5. **添加处理器到 Logger**:最后将这两个处理器添加到 Logger 实例中。 6. **记录日志**:使用 `logger.info()`, `logger.error()` 和 `logger.critical()` 方法记录不同级别的日志信息。 #### 六、总结 通过上述步骤,我们可以轻松地实现 Python 应用程序的日志记录与管理。正确配置日志不仅可以帮助开发者更好地理解程序运行状况,还能在出现问题时提供关键线索。同时,合理分割日志文件可以有效避免因文件过大带来的问题,并确保系统的稳定运行。 希望本段落能为学习 Python 日志处理技术的朋友提供一定的帮助!
  • Linux天(/周)Tomcat文件catalina.out
    优质
    本教程详细讲解了如何在Linux系统中设置cron作业来实现自动按日或每周对Tomcat服务器的主日志文件catalina.out进行切割,便于日志管理。 针对在Linux环境下Tomcat不断输出到catalina.out文件的问题,提供一个按天分割catalina.out的脚本及操作说明。此方法绝对可行。
  • Log4j2配置文件:文件大小并保留指定天数
    优质
    本文章详细介绍了如何通过Log4j2配置文件实现自动按文件大小分割日志,并设置系统仅保存最近若干天内的日志记录,适用于需要高效管理日志文件的开发者和运维人员。 log4j2配置文件可以实现根据文件大小划分日志,并保存特定天数内的日志记录。此外,还可以设置指纹日志的命名规则以及定义日志输出等级等功能。
  • QTTXT功能
    优质
    本简介介绍在Qt框架下如何实现高效的文本文件(TXT)日志记录功能,包括文件操作、数据格式化及错误处理等关键步骤。 使用Qt5在Windows下实现的日志记录功能。代码包含详细注释,可以直接下载并运行。
  • Log4j2异步线
    优质
    本篇技术文章深入探讨了如何利用Log4j2框架实现高效的异步多线程日志记录方法,旨在优化应用程序的日志处理性能。 该工程采用Maven构建,需要有Maven环境支持。同时支持异步打印和多线程打印功能。
  • Qt封装与调用
    优质
    本篇文章主要介绍了如何在Qt框架下设计并实现一个高效灵活的日志记录系统。通过创建定制化的日志类,简化了复杂应用中的调试和维护工作,详细讲解了该类的设计理念、功能模块及具体使用方法。适合希望提升程序可追踪性的开发者参考学习。 在QT下封装了一个打印日志的类,用户只需传入需要记录的日志内容,系统会自动将这些信息写入指定的日志文件(存储路径可以自定义)。每条日志都会包含系统时间信息,使用起来非常方便。
  • Windows 使用 Ping 命令添加戳并.rar
    优质
    本资源介绍如何在Windows系统中利用Ping命令行工具,并通过简单步骤实现向ping请求添加时间戳及自动保存日志的功能,便于网络诊断和维护。 在Windows环境下,`ping`命令是一个常用的网络诊断工具,用于检查网络连接并评估网络延迟。这个压缩包文件可能包含一个脚本或批处理文件,它扩展了基本的`ping`命令功能,增加了时间戳,并记录结果到文本日志中,这样可以更方便地分析网络性能和稳定性。 让我们了解一下基础的`ping`命令。通过发送Internet控制消息协议(ICMP)回显请求数据包到目标主机并接收对应的回显应答来判断网络连接是否正常。它的基本语法是: ``` ping [选项] 目标地址 ``` 常见的选项包括: - `-t`: 持续不断地向目标主机发送请求,直到用户中断。 - `-n count`: 设置发送请求的数量。 - `-l size`: 设置要发送的数据量,单位为字节。 - `-f`: 在数据包中设置不分片标志。 - `-i TTL`: 设置生存时间(TTL)字段的值。 当我们需要在`ping`命令中添加时间戳并记录日志时,可以创建一个批处理文件(`.bat`文件),例如`ping_log.bat`,包含以下内容: ```batch @echo off for L %%i in (1,1,10) do ( ping -n 1 目标IP | find 时间 > nul && echo %date% %time% - 成功 || echo %date% %time% - 失败 ) ``` 在这个批处理文件中,`for L`循环执行10次`ping`操作,每次只发送一个请求(`-n 1`)。`| find 时间`用于过滤出包含“时间”的行。如果成功,则将当前日期和时间与“成功”一词写入日志;如果失败,则写入“失败”。 你可以根据需要修改这个批处理文件,比如改变`ping`的次数、目标IP地址、记录的信息等。运行这个批处理文件时,所有记录的信息将会输出到命令行窗口,并且如果你将输出重定向到一个文本段落件(如`ping_log.txt`),则可以保存这些信息以供后续分析。 在分析日志时,可以关注以下几个方面: 1. **延迟时间**:每个“时间”后面的一串数字就是往返时间(Round-Trip Time,RTT)。 2. **成功率**:观察成功和失败的次数,如果失败次数过多,则可能表示网络连接不稳定或目标主机存在问题。 3. **时间趋势**:通过查看时间戳可以分析不同时间段内的性能表现。 这个压缩包提供的工具是一个实用的网络诊断辅助手段。通过自定义批处理脚本,我们可以根据具体需求定制日志记录以满足不同的监控需求。