将多个进程的stdout重定向到Python日志模块

1 投票
2 回答
975 浏览
提问于 2025-04-16 07:49

我有一个Python脚本,它通过subprocess.Popen启动了多个用户进程。每个进程的输出(stdout)都被重定向到一个独特的文件里。例如,我是这样启动每个进程的:

proc = my_proc  
for p in range(1, max_p, 1):  
    log_file = proc + "_" + str(p) + ".log"  
    log = open(log_file, "w+")  
    subprocess.Popen([my_proc, p], shell = False, stdout = log)  

我想在这些文件变得太大的时候进行轮换。有什么好的方法可以做到这一点吗?我想使用日志模块,但我觉得这不是它的主要用途。

谢谢!

2 个回答

0

logging.handlers.RotatingFileHandler怎么样呢?

1

这不是最符合Python风格的解决方案,但在Linux系统上,我更喜欢使用logrotate来自动管理我的日志文件。你可以检查一下你的系统上是否安装了这个工具(在Ubuntu上,可以在/etc/logrotate.d/目录下找到一些文件,这些文件会通过定时任务自动运行)。这可能比在应用程序内部处理日志轮换更好,也可能不如。

logrotate非常灵活,比如可以压缩旧文件、保留N个文件(通过rotate N命令),当文件大小超过100k时进行轮换,查看man logrotate文档后,你会发现设置起来非常简单。

下面是man文档中的一个示例文件:

   # sample logrotate configuration file
   compress

   /var/log/messages {
       rotate 5
       weekly
       postrotate
           /usr/bin/killall -HUP syslogd
       endscript
   }

   "/var/log/httpd/access.log" /var/log/httpd/error.log {
       rotate 5
       mail www@my.org
       size 100k
       sharedscripts
       postrotate
           /usr/bin/killall -HUP httpd
       endscript
   }

撰写回答