0

我正在尝试在我的项目中实施主管应用程序。现在一切都按预期工作,但我遇到了日志旋转的奇怪行为。

出于测试目的,我有一个小的 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 正在中断。

主管日志的日志轮换按预期工作(因为它没有多次产生)。有谁知道这里发生了什么?

4

0 回答 0