php – 由supervisord管理的程序的时间戳记日志
发布时间:2020-12-13 16:26:37 所属栏目:PHP教程 来源:网络整理
导读:我正在使用supervisord来管理需要在后台运行的php程序.该程序将事件记录到文件worker_log.在我使用的supervisord.conf中配置这个是很简单的: stderr_logfile=/var/log/supervisord/worker_log; 但是,我希望将事件写入日志以自己的时间戳.我没有控制php程序,
我正在使用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测试). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |