记录到非阻塞命名管道?

时间:2013-02-27 21:45:08

标签: linux bash logging pipe fifo

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

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

重要的错误存储在数据库中,但我喜欢在运行新操作时不时地拖尾这些日志以确保一切正常(loglevel更低)。

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

我的想法直到现在:

  • 将日志输出到stdout,而不是输出到文件:因为我有很多工人输出到不同的文件,所以不能在这里输出日志,但是我想一次性地将它们全部拖尾(tail -f celery_worker * .log)
  • 使用logrotate:对我来说这是一个“OK”的解决方案。我不希望这是一个日常任务,但宁愿不为此花一分钟crontab,而且更多,服务器不是我的,所以这意味着在admin-sys端的一些工作
  • 使用命名管道:它一见钟情,但我不知道命名管道(linux FIFO)阻塞。因此,当我不同时尾随-f所有管道,或者当我刚退出尾部时,记录器的写入操作被阻止。

有没有办法有一个非阻塞的命名管道,它会在尾部时抛出stdout,而在没有时抛出/ dev / null?

或者这种管道存在技术难题吗?如果有,他们是什么?

感谢您的回答!

2 个答案:

答案 0 :(得分:1)

让每个worker登录到stdout,但是将每个stdout连接到一个实用程序,该实用程序根据大小或时间自动调整和旋转日志。 multilogsvlogd就是这样的例子。对于那些程序,您只需拖尾“当前”日志文件。

对于你遇到的问题,logrotate不是一个正确的解决方案。

命名管道无法正常工作。最好的情况是,你的作者可以填满他们的管道,然后丢弃后续的日志,这与你想要的行为相反。

答案 1 :(得分:1)

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