2013-02-27 82 views
5

我有一个问题,我不能在stackoverflow或web上找到任何帮助。我有一个程序(芹菜分布式任务队列),我有多个实例(工人),每个有一个日志文件(celery_worker1.log,celery_worker2.log)。记录到非阻塞命名管道?

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

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

我的想法到现在为止:

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

有没有办法建立一个非阻塞的命名管道,当只有抛出时stdout抛出,并抛出/ dev/null时,不是?

或者这种类型的管道是否存在技术难题?如果有,它们是什么?

谢谢你的回答!

+0

可能重复的[Linux非阻塞FIFO(按需日志记录)](http://stackoverflow.com/questions/7360473/linux-non-blocking-fifo-on-demand-logging) – 2015-01-29 21:26:32

回答

1

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

您说得对,logrotate对于您遇到的问题并不完全正确。

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

+0

谢谢@pilcrow为你的答案。所有5名员工都通过一个命令在后台启动,我不想拥有一个总是打开标签的屏幕,那么如何让他们登录到不同的标准输出? 你是否确认“非阻塞命名管道在未读取时重定向到/ dev/null”不存在这样的情况? 谢谢 – 2013-02-27 22:38:25

+0

@noe,关于共享或单独的标准输出...取决于。我们对他们的调用不够了解。关于这种命名管道语义不存在,是正确的。 – pilcrow 2013-02-28 03:08:53

1

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