【发布时间】: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、文件句柄...)而不是文件名进行的。如果多个进程同时轮换文件,则第一个开始轮换的进程将由其他进程重命名其新日志文件。