【问题标题】:Python RotatingFileHandler is logging also to archived file - how to log multiple processes to single filePython RotatingFileHandler 也记录到存档文件 - 如何将多个进程记录到单个文件
【发布时间】:2022-01-17 13:31:45
【问题描述】:

这是我的日志配置:

[loggers]
keys=root,lan,publan

[handlers]
keys=nullHandler,consoleHandler,fileHandler,pubfileHandler

[formatters]
keys=full,simple

[logger_lan]
level=INFO  
handlers=fileHandler  
qualname=lan

[logger_publan]
level=INFO
handlers=pubfileHandler
qualname=publan

[logger_root]
level=ERROR
handlers=nullHandler

[handler_fileHandler]  
class=handlers.RotatingFileHandler
formatter=full
level=INFO
args=('/home/userx/lan/LAN_runtime_and_exception.log', 'a', 1000, 5)

[handler_pubfileHandler]
class=handlers.RotatingFileHandler
formatter=simple
level=INFO
args=('/home/userx/lan/LAN.log', 'a', 100000000, 1)

[handler_nullHandler]
class=NullHandler
level=DEBUG

[handler_consoleHandler]
class=StreamHandler
level=ERROR
formatter=full
args=(sys.stdout,)

[formatter_full]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_simple]
format=%(asctime)s - %(message)s
datefmt=%d-%m-%Y %H:%M:%S

我有大约 10 个不同的文件,每个文件都有完全相同的日志记录设置:

import logging
import logging.config

#logging stuff
os.umask(0o002)
logging.config.fileConfig('logging.conf', disable_existing_loggers=False)
logger = logging.getLogger('lan')

#calling logger
logger.error("some error occured")

到目前为止一切顺利,现在问题来了。重新启动我的应用程序后,所有日志记录都正确发送到最后一个文件LAN_runtime_and_exception.log,但稍后的某个时间 - 几个小时,几天,我不知道确切的触发器和时间,我观察到倒数第二个文件LAN_runtime_and_exception.log.1 也增加了一些来自具有日志记录集的 10 个文件之一的记录。我无法找到为什么会这样。我的目标是始终只增加最新的文件。

-rw-rw-r--  1 root    loggroup  17209 Dec 14 08:49 LAN_runtime_and_exception.log
this file is also incrementing >>>> -rw-rw-r--  1 userx loggroup   1035 Dec 13 14:42 LAN_runtime_and_exception.log.1
-rw-rw----  1 userx loggroup  99974 Dec 13 00:38 LAN_runtime_and_exception.log.2
-rw-rw-r--  1 root    loggroup   8550 Dec  6 07:48 LAN_runtime_and_exception.log.3
-rw-rw-r--  1 userx loggroup  99947 Dec  5 12:45 LAN_runtime_and_exception.log.4
-rw-rw-r--  1 root    loggroup   1246 Nov 28 21:37 LAN_runtime_and_exception.log.5

有什么想法吗?

【问题讨论】:

  • “我有大约 10 个不同的文件,每个文件都有完全相同的日志记录设置”——这些不同的进程,还是在同一个进程中导入的不同模块?
  • “我观察到倒数第二个文件 LAN_runtime_and_exception.log.1 也增加了一些记录”是该文件 previously 存在的一个以前没有程序写入的文件,还是程序已经写入的最近轮换的?
  • @AKX 实际上,这两种变体,我都有几个文件,由一个主要作为模块导入,我也有作为不同进程运行的文件,然后是主要的。问题是一段时间后,主进程一直登录到最后一个文件,而第二个进程突然开始登录到最后一个日志文件 -> LAN_runtime_and_exception.log.1
  • @MisterMiyagi 这是以前存在的文件,我认为当最后一个文件达到其旋转条件(大小)时问题开始发生,然后所有进程而不是写入最后一个,它们拆分日志记录
  • 请注意,RotatingFileHandler 的旋转不是进程安全的,写入是通过文件标识(inode、文件句柄...)而不是文件名进行的。如果多个进程同时轮换文件,则第一个开始轮换的进程将由其他进程重命名其新日志文件。

标签: python logging


【解决方案1】:

我最终以一个非常优雅的解决方案结束了恕我直言,并解决了使用syslogHandler 而不是ofRotatingFileHandler 在单个文件中记录多个进程的问题,现在使用rsyslog 在Linux 级别登录。我做了一些测试,syslogHandler 的行为一直很好。

这里的基本概念和代码sn-p:

logging.conf(INI 格式)

[handler_syslogHandler]
class=handlers.SysLogHandler
formatter=full
level=INFO
args=(('localhost',handlers.SYSLOG_UDP_PORT),handlers.SysLogHandler.LOG_LOCAL7) <<- modify here as you wish

/etc/rsyslog.conf

#Custom Logging 
local7.* /var/log/mylog/mylog.log

/etc/logrotate.d/mylog

/var/log/mylog/*.log
{
    rotate 7
    daily
    missingok
    notifempty
    delaycompress
    compress
    postrotate
    invoke-rc.d rsyslog rotate > /dev/null
    endscript
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 2021-08-01
    • 2023-03-19
    • 2013-02-12
    • 2019-12-17
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多