记录日志到非阻塞的命名管道?

6
我有一个问题,在stackoverflow或网络上都找不到帮助。
我有一个程序(celery分布式任务队列),我有多个实例(workers),每个实例都有一个日志文件(celery_worker1.log,celery_worker2.log)。
重要的错误存储在数据库中,但是我想时不时地查看这些日志,以确保一切正常(日志级别较低)。
我的问题:这些日志占用了大量磁盘空间。 我想做的是:只有在需要时才能“观看”日志(tail -f),而不会占用大量空间。
我的想法到目前为止:
- 将日志输出到标准输出,而不是输出到文件:在这里不可能,因为我有许多工作人员将输出到不同的文件,但我想同时尾随它们所有(tail -f celery_worker * .log) - 使用logrotate:对我来说这是一个“可以”的解决方案。我不想让这成为日常任务,但也不想为此设置一个分钟crontab,而且更多的是,服务器不是我的,所以这意味着管理员系统需要进行一些工作 - 使用命名管道:乍一看好像很好,但我不知道命名管道(Linux FIFO)会阻塞。因此,当我不同时尾随所有管道时,或者当我只是退出我的尾随时,记录器的写操作被阻止。
是否有一种非阻塞命名管道的方法,它只是在尾随时抛出stdout,并在不是的情况下抛出/dev/null?
或者这种类型的管道存在技术困难吗?如果有,那是什么?
感谢您的答案!

可能是 Linux 非阻塞 FIFO(按需记录日志) 的重复。 - Piotr Dobrogost
2个回答

1
每个工作进程都将日志记录到标准输出,但是将每个标准输出连接到一个实用程序上,该实用程序基于大小或时间自动进行缓存和轮换日志。 multilogsvlogd 就是这样的示例程序。对于这些程序,你只需要追踪“当前”日志文件即可。
你说得对,logrotate并不是解决你所面临问题的完美方案。
命名管道不能按照你的要求工作。最多,你的写入者可以填满管道,然后丢弃后续的日志,这与你想要的行为相反。

谢谢@pilcrow的回答。通过一个命令在后台启动了所有5个工作进程,我不想一直打开一个带有标签的屏幕,那么如何让它们记录到不同的stdout?你确认"非阻塞命名管道在没有读取时会重定向到/dev/null"是不存在的吗?谢谢 - Noé Malzieu
@noe,关于共享或独立的stdout...那取决于情况。我们对它们的调用了解不足以作出判断。关于不存在此类命名管道语义,是正确的。 - pilcrow

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接