6

我有一个问题,我在 stackoverflow 或网络上的任何地方都找不到帮助。

我有一个程序(芹菜分布式任务队列),我有多个实例(工作者),每个实例都有一个日志文件(celery_worker1.log,celery_worker2.log)。

重要的错误存储到数据库中,但我喜欢在运行新操作时不时跟踪这些日志,以确保一切正常(日志级别较低)。

我的问题:这些日志占用了大量磁盘空间。我想做的事:只有在我需要的时候才能“观看”日志(tail -f),而不会占用大量空间。

到目前为止我的想法:

  • 将日志输出到标准输出,而不是文件:这里不可能,因为我有很多工作人员输出到不同的文件,但我想一次将它们全部拖尾(tail -f celery_worker*.log)
  • 使用 logrotate: 这对我来说是一个“OK”的解决方案。我不希望这是一项日常任务,但宁愿不为此投入一分钟的 crontab,而且服务器不是我的,因此这意味着在 admin-sys 方面有一些工作
  • 使用命名管道:第一眼看起来不错,但我不知道命名管道(linux FIFO)在哪里阻塞。因此,当我不同时对所有管道进行尾部处理时,或者当我刚刚退出尾部处理时,记录器的写入操作将被阻止。

有没有办法拥有一个非阻塞的命名管道,它只会在有尾时抛出到标准输出,而在没有尾时抛出到 /dev/null?

或者这种类型的管道有技术困难吗?如果有,它们是什么?

谢谢您的回答!

4

2 回答 2

1

您可以尝试共享内存设备man:shm_overview或者其中的一些。您需要将它们组织为循环缓冲区,以便它们存储日志的最后 N kb,并且每当您使用阅读器读取它们时,它都会将所有内容输出到您的控制台。busybox 的 syslog/logread 套装采用了这种方法(参见logread.c)。

于 2013-02-28T00:13:26.210 回答
1

让每个工作人员记录到标准输出,但将每个标准输出连接到一个实用程序,该实用程序会根据大小或时间自动假脱机和轮换日志。 multilogsvlogd就是这样的例子。对于这些程序,您只需跟踪“当前”日志文件。

你是对的,logrotate 并不是你所遇到问题的正确解决方案。

命名管道无法按您的意愿工作。充其量,您的作者可以填满他们的管道,然后丢弃后续日志,这与您想要的行为相反。

于 2013-02-27T21:50:46.110 回答