簡體   English   中英

Python RotatingFileHandler 也在記錄存檔文件 - 如何將多個進程記錄到單個文件

[英]Python RotatingFileHandler is logging also to archived file - how to log multiple processes to single file

這是我的日志配置:

[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

有任何想法嗎?

我最終以一種非常優雅的解決方案結束了恕我直言,並解決了使用syslogHandler而不是RotatingFileHandler 在單個文件中記錄多個進程並在 linux 級別上記錄的問題。 我做了一些測試,syslogHandler 的行為一直很好。

這里的基本概念和代碼片段:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM