记录到非阻塞命名管道?

Noé*_*ieu 5 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?

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

谢谢您的回答!

pil*_*row 1

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

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

命名管道不会按您想要的方式工作。最好的情况是,您的编写者可以填满管道,然后丢弃后续日志,这与您想要的行为相反。