【问题标题】:How to create one uwsgi log file per day?如何每天创建一个 uwsgi 日志文件?
【发布时间】:2015-04-05 06:24:04
【问题描述】:

我使用带有参数--daemonize /logs/uwsgi.log的uwsgi

然而,这个文件变得越来越大,我想把它分成更小的部分。最好每天一个。我已经为 nginx 做到了,使用日期变量很容易指定日志文件名。是否可以为 uwsgi 做同样的事情?

类似:

[uwsgi]
daemonize=/logs/uwsgi-$year-$month-$day.log

或者是否有其他方法可以获得相同的结果,而无需过多参与其他过程?

【问题讨论】:

    标签: logging uwsgi log-rotation


    【解决方案1】:

    uWSGI 本身只能“按大小拆分”,使用 --log-maxsize 选项。

    基于时间的方法使用经典的 logrotate 或 apache rotatelogs (http://httpd.apache.org/docs/2.2/programs/rotatelogs.html),您可以将它们与 uWSGI logpipe 插件结合使用。

    最后,您可以在 uWSGI 实例的午夜触发重新加载的类似 nginx 的行为(您甚至可以使用嵌入式 cron 工具):

    [uwsgi]
    daemonize = /logs/uwsgi-@(exec://date +%%Y-%%m-%%d).log
    log-reopen = true
    

    【讨论】:

    • 使用该守护程序行,我得到一个名为“/logs/uwsgi-.log”的日志文件,缺少日期部分。它需要一些特定的版本或插件吗?
    • 2.x 版本肯定可以工作,也许你的路径中没有“日期”命令?
    • 问题是我使用的 uwsgi (1.9.x) 版本太旧。升级解决了问题,现在您的解决方案似乎有效。 (至少它创建了一个带有今天日期的文件)。谢谢!
    【解决方案2】:

    每小时重新加载 uwsgi 感觉很重,我想要一个更有效的解决方案。 uWSGI 有一个内置的轮换机制,但是(截至目前)只能在日志达到一定大小时自动触发。 uWSGI 支持通过 fifo 强制日志轮换,这导致我采用了以下解决方案,该解决方案避免了重新加载,并且完全在 uwsgi 中处理。以下 ini 应该在 uWSGI 1.9.11+ 中工作:

    [uwsgi]
    # Directory for demo purposes
    uwsgi-directory = /var/uwsgi
    master-fifo = %(uwsgi-directory)/uwsgi.fifo
    logto = %(uwsgi-directory)/logs/uwsgi.log
    
    # Destination for rotated log
    log-backupname = %(uwsgi-directory)/logs/uwsgi.log.rotated
    
    log-master = true
    log-reopen = true
    
    # Cron to trigger log rotation each hour
    cron2 = hour=-1,minute=0,unique=1 echo L > %(master-fifo) && sleep 5 && mv %(log-backupname) %(logto).$(/bin/date -u -d '-1 hour' +%%Y-%%m-%%d-%%H)
    

    每小时零分钟,uwsgi 将向 uwsgi fifo 写入“L”(触发日志轮换)。然后它将休眠几秒钟,然后将旋转的日志移动到文件名中具有所需的日期格式。睡眠可能是无关紧要的,但是我想确保 uwsgi 有时间轮换日志。此外,如果 uwsgi 在一小时内的任何其他时间重新启动,cron 会在零分钟显式触发以避免日志轮换。

    通过适应旧样式的 uwsgi cron 选项或使用 crontab,这可能与旧版本的 uWSGI 一起使用。

    【讨论】:

      【解决方案3】:

      根据 roberto 的回答,这里是轮换日志的配置。它将保留多达 14 个日志文件。每日 3:15 轮换。

      [uwsgi]
      set-placeholder = log_dir=/var/log
      set-placeholder = log_prefix=myservice-
      set-placeholder = log_num=14
      pidfile = /var/run/uwsgi-myservice.pid
      logto = %(log_dir)/%(log_prefix)@(exec://date +%%Y-%%m-%%d).log
      log-reopen = true
      unique-cron = 15 3 -1 -1 -1 { sleep 66 && kill -HUP $(cat %(pidfile)) && ls -tp %(log_dir)/%(log_prefix)* | grep -v '/$' | tail -n +%(log_num)  | xargs -d '\n' -r rm --; } &
      

      需要睡眠,因为重新加载后 uwsgi 将再次执行 cronjob,因为它会匹配当前时间。所以我们需要在重新加载之前休眠 60 秒以上。它还会在每次轮换时重新加载配置文件,这种行为可能是不希望的。

      为什么需要这样的 hack?好吧,就我而言,我无权在系统中正确配置日志记录,但我有权更改 uwsgi 配置。

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多