将多个进程的stdout重定向到Python日志模块
我有一个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
}