我正在使用supervisord来管理需要在后台运行的PHP程序.该程序将事件记录到文件worker_log.在我使用的supervisord.conf中配置这个是很简单的:
stderr_logfile=/var/log/supervisord/worker_log;
但是,我希望将事件写入日志以自己的时间戳.我没有控制PHP程序,所以装饰它的日志不是一个选择.我想我会做的是注释上述日志配置,并通过命令行管道在主管的命令配置中装饰程序:
command=PHP /www/myapp/worker.PHP 2>&1 | sed "s/^/`date` /" > /var/log/supervisord/worker_log;
手动运行这个命令似乎工作正常.然而,超级管理员似乎在某种程度上阻止它正常运行,我无法告诉如何. worker.PHP执行正常,但它的报告是,在此配置中被抑制.而且,由于这个原因,它当然不会添加时间戳.
有没有人知道这一点,为如何完成工时输出工作的目标提供指导?
您可以编写一个专用的包装器脚本,将在调用工作代码之前将过滤器附加到stderr:
// filter to prepend date/time on all stderr output class eventdata_filter extends PHP_user_filter { function filter($in,$out,&$consumed,$closing) { while (($bucket = stream_bucket_make_writeable($in))) { $bucket->data = date('c') . ' ' . $bucket->data; $consumed += $bucket->datalen; stream_bucket_append($out,$bucket); } return PSFS_PASS_ON; } } // register our custom filter stream_filter_register('eventdata','eventdata_filter'); // keep a reference to the attached filter $filter = stream_filter_append(STDERR,'eventdata',STREAM_FILTER_WRITE); // isolate the worker from any variables in this scope,such as $filter function run() { include 'worker.PHP'; } // run the worker run(); // remove the filter stream_filter_remove($filter);