gpt4 book ai didi

python 3 : timedrotatingfilehandler log rotation issue with same log file with multiple scripts

转载 作者:行者123 更新时间:2023-12-03 16:32:41 27 4
gpt4 key购买 nike

请帮助解决来自多个进程的 python3 日志记录到同一个日志文件的问题。
我有 dameon 主脚本,它在后台运行,每 15 秒调用一些其他 python 脚本,并且每个 python 脚本都使用相同的 TimedRotatingFileHandler 属性编写,并且所有日志都写入相同的日志文件。
一切正常,除了日志轮换。

lib/
├── __init__.py
├── FIRST.py
└── SECOND.py
└── THIRD.py
main_daemon.py
主 python 守护程序文件看起来像
t1 = t2 = t3 = Thread()
my_thread = MYthreads(t1, t2, t3)
################# Daemon Class #################
class Daemon(Daemon):
def run(self):
while True:
my_thread.start_my_class()
time.sleep(15)

ProcessManager = Daemon('daemon.pid')
ProcessManager.start()
lib/__init__.py文件看起来不错
class MYthreads:
def __init__(self, t1, t2, t3):
self.t1 = t1
self.t2 = t2
self.t3 = t3

def start_my_class(self):
for file in List_files(path1):
self.t1 = Thread(target=FIRSTprocess, args=(file,))
self.t1.start()
self.t1.join()
for file in List_files(path2):
self.t2 = Thread(target=SECONDprocess, args=(file,))
self.t2.start()
self.t2.join()
for file in List_files(path3):
self.t3 = Thread(target=THIRDprocess, args=(file,))
self.t3.start()
self.t3.join()
这里的目标是从 lib/目录中的单独 python 文件导入的函数。
每个 python 文件将日志写入相同的日志文件。
在 lib/目录中的每个 python 文件中定义的日志记录..
logger = logging.getLogger('mylogger')
#TimedRoatingFile handler definition
Timed_formatter = logging.Formatter('%(message)s')
Timed_handler = logging.handlers.TimedRotatingFileHandler('my_log', 'midnight', 1, 90)
Timed_handler.setFormatter(Timed_formatter)
logger.addHandler(Timed_handler)
#syslog handler definition
if syslog_streaming and curr_os != 'Windows':
log_formatter = logging.Formatter('%(name)s: %(message)s')
Sys_handler = logging.handlers.SysLogHandler(address = '/dev/log')
Sys_handler.setFormatter(log_formatter)
logger.addHandler(Sys_handler)
logger.handlers = [logger.handlers[0], logger.handlers[1]]
else:
logger.handlers = [logger.handlers[0], ]
# Set lev to DEBUG, applied to both
logger.setLevel(logging.DEBUG)
所以,我在所有 python 文件中定义了相同的日志属性,并将它们写入同一个日志文件,并将所有这些函数导入 __init__.py并通过 while 循环每 15 秒调用一次类。
日志记录和日志写入工作正常......甚至系统日志记录也工作正常。
问题:
日志轮换工作不正常。我必须使用时间轮换处理程序,因为我的要求是每天晚上 12 点进行翻转。
当我在上午 12 点之后检查日志文件时,创建了备份文件,但是在 00 小时之前写了一整天的日志丢失了,我只能在新日期的 00 小时生成几行日志,而旧日期的日志都丢失了。
-rw-r--r--. 1 usertony usertony    1097 Sep  7 01:15 my_log.2020-09-06
-rw-r--r--. 1 usertony usertony 1097 Sep 8 00:00 my_log.2020-09-07
-rw-r--r--. 1 usertony usertony 96 Sep 9 00:00 my_log.2020-09-08

最佳答案

问题
您的进程正在竞争写入同一文件,从而导致竞争条件,从而导致翻转期间出现问题。
解决方案
您需要在这些线程之外定义记录器:
https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes
笔记
我不建议用你的类覆盖 Daemon 类。如果继承是您的类的目标名称,则是上下文(即: FileLoggingDeamon )。
引用
从多个进程记录到单个文件:https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes
https://stackoverflow.com/a/9993857/806876

关于 python 3 : timedrotatingfilehandler log rotation issue with same log file with multiple scripts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63844088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com