加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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测试).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读