我正在尝试在我的项目中实施主管应用程序。现在一切都按预期工作,但我遇到了日志旋转的奇怪行为。
出于测试目的,我有一个小的 python 脚本,它在运行时将随机字符串写入日志对象,然后将其写入标准输出。
#!/usr/bin/env python2.7
import sys
import random
import string
import logging
from time import sleep
logger = logging.getLogger()
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info('Created global logging object')
while True:
logger.debug(''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(random.randint(1,20))))
sleep(0.00001)
这是我的 supervisord.conf 文件
[unix_http_server]
file=/tmp/supervisor.sock
[inet_http_server]
port=127.0.0.1:9001
[supervisord]
logfile=/home/usr/supervisor/supervisord.log
logfile_maxbytes=10MB
logfile_backups=10
loglevel=debug
pidfile=%(here)s/supervisor.pid
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[program:test_messagess]
command=/home/usr/python-scripts/testing/msgs/main.py
process_name=%(program_name)s_%(process_num)s
numprocs=50
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=/home/trm/python-scripts/testing/msgs/main.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
所以这就是正在发生的事情:Supervisord 启动,脚本开始工作,main.log 文件按预期填充。当 main.log 达到大约 10MB 的大小时
-rw-r--r--. 1 usr usr 10,0M Tra 4 10:04 main.log
日志变得疯狂,每个日志开始有〜1MB(但每次都不同,它不是恒定的)数据并且主管开始重写所有内容
-rw-r--r--. 1 usr usr 962K Tra 4 10:04 main.log.8
-rw-r--r--. 1 usr usr 1,1M Tra 4 10:04 main.log.6
-rw-r--r--. 1 usr usr 1,2M Tra 4 10:04 main.log.5
-rw-r--r--. 1 usr usr 1,1M Tra 4 10:04 main.log.4
-rw-r--r--. 1 usr usr 1019K Tra 4 10:04 main.log.3
-rw-r--r--. 1 usr usr 954K Tra 4 10:04 main.log.2
-rw-r--r--. 1 usr usr 862K Tra 4 10:04 main.log.10
-rw-r--r--. 1 usr usr 987K Tra 4 10:04 main.log.1
-rw-r--r--. 1 usr usr 1,1M Tra 4 10:04 main.log.7
-rw-r--r--. 1 usr usr 904K Tra 4 10:04 main.log.9
-rw-r--r--. 1 usr usr 965K Tra 4 10:04 main.log
我尝试了一些组合(从配置文件中完全删除日志记录参数,将所有内容保留为默认值,仅使用 stderr 而不是 stdout)但似乎没有任何效果。另外,我尝试将消息直接打印到标准输出 -
print ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(random.randint(1,20))))
但同样的问题发生。
我正在使用最新的 3.3.1 版本的主管。
好的,又尝试了一件事,似乎多进程故障 logrotate。我尝试注释掉“numprocess = 50”行,因此不会分叉进程并且日志正在工作
-rw-r--r--. 1 usr usr 10,0M Tra 4 10:16 main.log.2
-rw-r--r--. 1 usr usr 10,0M Tra 4 10:17 main.log.1
-rw-r--r--. 1 usr usr 4,9M Tra 4 10:17 main.log
但这不是真正可以接受的情况,主管的主要用途是产生同一个进程的多个子进程......我也尝试设置“numprocess = 2”,并且再次,logrotate 正在中断。
主管日志的日志轮换按预期工作(因为它没有多次产生)。有谁知道这里发生了什么?