logging到非阻塞的命名pipe道?

我有一个问题,我不能在任何地方find帮助或帮助。

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

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

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

我的想法直到现在:

  • 输出日志到标准输出,而不是一个文件:不可能在这里,因为我有很多工人输出到不同的文件,但我想一次拖尾(tail -f celery_worker * .log)
  • 使用logrotate:这对我来说是一个“OK”的解决scheme。 我不希望这是一个日常的任务,而不是把一分钟的crontab这个,更多的是,服务器不是我的,所以这将意味着一些工作在pipe理系统端
  • 使用命名pipe道:它看起来一见钟情,但我不知道命名pipe道(Linux FIFO)在哪里阻塞。 因此,当我没有同时尾随所有的pipe道,或者当我刚刚离开我的尾巴时,logging器的写入操作被阻止。

有没有办法有一个非阻塞的命名pipe道,只是抛出时,标准输出,并抛出/ dev / null时不?

或者这种pipe道有技术上的困难吗? 如果有,他们是什么?

谢谢您的回答!

让每个工作人员登录到stdout,但将每个stdout连接到一个实用程序,该实用程序根据大小或时间自动后台打印和旋转日志。 multilog和svlogd就是这样的例子。 对于那些程序,你只需要尾随“当前”日志文件。

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

命名管道将无法正常工作。 充其量,你的作家可以填满他们的管道,然后丢弃随后的日志,这是你想要的行为的反面。

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