php – 由supervisord管理的程序的时间戳记日志

前端之家收集整理的这篇文章主要介绍了php – 由supervisord管理的程序的时间戳记日志前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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);

Btw,如果您不删除过滤器,将导致分段错误(至少在5.4测试).

猜你在找的PHP相关文章