【问题标题】:Redirecting stdout from multiple processes to python Logging module将标准输出从多个进程重定向到 python Logging 模块
【发布时间】:2011-05-17 23:56:45
【问题描述】:

我有一个使用 subprocess.Popen 启动多个用户进程的 python 脚本。每个进程的标准输出都被重定向到一个唯一的文件。例如我按如下方式启动每个进程

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)  

当这些文件变得太大时,我想旋转它们。这样做的最好方法是什么?我想使用日志记录模块,但我认为这不是它的预期用途

谢谢

【问题讨论】:

    标签: python redirect subprocess stdout popen


    【解决方案1】:

    不是pythonic的解决方案;但在 linux 系统上,我更喜欢使用 logrotate 来自动轮换我的日志。检查它是否安装在您的系统上(在 ubuntu 上说有一个名为 /etc/logrotate.d/ 的目录,其中文件通过 cron 自动运行)。与在应用程序中运行日志轮换相比,这可能会也可能不会更受欢迎。

    它非常可配置,例如,允许压缩旧文件通过 rotate N 命令保留 N 个文件,当 cron 超过“大小 100k”时旋转,查看 man logrotate,它的设置非常简单。

    来自手册页的示例文件

       # 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
       }
    

    【讨论】:

    • 谢谢,但是可能有多达 100 个从 python 脚本启动的进程。我需要为每个进程和日志文件输入一个条目吗?
    • 您不需要为每个进程/日志文件输入条目——它支持通配符。例如,如果您的所有日志都存储在目录中,则 /var/log/some_app/*.log 可用于轮换该目录中的所有日志文件。这实际上是我切断的第三个例子。
    【解决方案2】:

    logging.handlers.RotatingFileHandler怎么样?

    【讨论】:

    • 谢谢,但我需要每个进程的记录器。这门课可以吗?
    • 如果每个进程都有一个 id 应该是可能的 - 然后你可以将 id 烘焙到文件名中。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多