2013-07-23 51 views
10

我使用supervisord來管理需要在後臺運行的php程序。該程序將事件記錄到文件worker_log。這是很簡單的在supervisord.conf配置此我使用:supervisord管理的程序的時間戳日誌

stderr_logfile=/var/log/supervisord/worker_log; 

不過,我想對事件被寫入日誌時間戳自己。我無法控制php程序,所以裝飾它的日誌不是一種選擇。我想,我會做的是註釋掉上面的日誌記錄配置和裝飾通過命令行管道程序上司的命令配置:

command=php /www/myapp/worker.php 2>&1 | sed "s/^/`date` /" > /var/log/supervisord/worker_log; 

運行此命令手動它似乎很好地工作。然而,supervisord似乎以某種方式阻止它正常運行,並且我無法說出如何。 worker.php表現良好,但報告在此配置中被抑制。而且,因此,它當然不會添加時間戳。

有沒有人對此有足夠的瞭解,爲如何完成時間戳工人輸出的目標提供指導?

+0

是點由外殼取代它可能是不支持管道的命令參數?或者可能是運行釋放終端時的命令,哪個supervisord不支持? –

回答

7

你可以寫一個專用的包裝腳本,將調用你的工人代碼之前的過濾器安裝到標準錯誤:

// 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); 

順便說一句,如果你不刪除它會導致分段錯誤過濾器(至少,在5.4上測試)。

+0

今天我要試試這個!這是一個非常好的建議,儘管公認是一層不幸的代碼。 –

+0

這不會在時間戳上添加一個致命的錯誤信息,這會跳過所有的用戶級代碼,直接輸出到'輸出信息到STDERR並死亡' – StampyCode

+0

@Stampy是的,這不幸是致命錯誤的本質,因爲那些不能被任何錯誤處理程序=(但是,也許關機處理程序可以工作... –

4

上一個答案(來自Jack)是正確的,因爲您需要另一層代碼來爲每行添加時間戳。 perl中的這一行將獲得相同的結果:

perl -ne '@timeparts=localtime(); printf("%04d/%02d/%02d %02d:%02d:%02d %s",$timeparts[5]+1900,$timeparts[4]+1,@timeparts[3,2,1,0], $_);' 

使用此代替sed腳本。

一個問題,你想盡了辦法也沒工作是,日期計算,並在此sed命令被調用,這樣所有的線將有相同的日誌時間戳

+0

爲什麼不只是'perl -ne'打印標量(localtime)。「」。$ _''?或者'perl -mPOSIX = strftime -ne'print strftime (「%F%T」,本地時間),$ _;'' – Otheus

+0

這也可以起作用。我更喜歡我給出的格式,但這是每個品味的問題 – Nick