2016-11-21 6 views
3

私のLaravel 5.3アプリケーションには、ログを保存したいが、残りのシステムから別のログファイルに書き込むほうがいいというノイズの多いコンソールコマンドが2つあります。Laravel 5.3特定のコンソールコマンドのログファイルを変更する

現在、私のアプリは、別のログファイルにすべてのコンソールコマンドを書いている$app->configureMonologUsing(function($monolog) { ...

二等賞を使用してbootstrap/app.phpで構成されたファイルにログを書き込みますが、理想的にちょうどこれら二つ。

すべてのコンソールログを別のファイルに再ルーティングするには、これらの手順(https://blog.muya.co.ke/configure-custom-logging-in-laravel-5/https://laracasts.com/discuss/channels/general-discussion/advance-logging-with-laravel-and-monolog)を試してみましたが、動作しなかっただけで、残りのコードで奇妙な問題が発生しました。

これはまだ5.3で推奨されている方法ですが、これからも試していきますが、2つのコンソールコマンドのファイルを変更するより新しい方法や方法があるのか​​疑問に思っています。

+1

を私はそれを試したことがないが、あなたはこの 'ログイン:: useFiles($パスを、と思いますか$レベル) 'は助けることができますか?参照してください:https://laravel.com/api/5.3/Illuminate/Log/Writer.html#method_useFiles – Wistar

+0

@Wistarは提案に感謝しますが、それは違いはありません。 –

+0

(http://stackoverflow.com/questions/32552450/laravel-how-to-log-info-to-separate-fileを参照)は、このメソッドを使用するレポートを持っています。 2番目の答えに示唆されていることを試しましたか? Log :: info([info to log]); ' – Wistar

答えて

0

これも可能ですが、まず既存のハンドラを削除する必要があります。

Monologにはすでにいくつかのログハンドラが設定されていますので、$monolog->popHandler();のものを取り除く必要があります。次にWistar'sの提案を使用して、新しいログを追加する簡単な方法は$log->useFiles('/var/log/nginx/ds.console.log', $level='info');です。複数のハンドラ

については

public function fire (Writer $log) 
{ 
    $monolog = $log->getMonolog(); 
    $monolog->popHandler(); 

    $log->useFiles('/var/log/nginx/ds.console.log', $level='info'); 
    $log->useFiles('/var/log/nginx/ds.console.log', $level='error'); 
    ... 

あなたは(たとえばあなたがSentryを使用している場合)、複数のログハンドラを設定している場合はハンドラが明確である前に、あなたは1以上をポップする必要があるかもしれません。ハンドラを保持したい場合は、ハンドラをすべてループし、保持したいものをreaddする必要があります。

$monolog->popHandler()は、存在しないハンドラをポップしようとすると例外がスローされます。そのためには、jump through hoopsを動作させる必要があります。ログファイルをより細かく制御するために

public function fire (Writer $log) 
{ 
    $monolog = $log->getMonolog(); 

    $handlers = $monolog->getHandlers(); 
    $numberOfHandlers = count($handlers); 
    $saveHandlers = []; 

    for ($idx=0; $idx<$numberOfHandlers; $idx++) 
    { 
     $handler = $monolog->popHandler(); 

     if (get_class($handler) !== 'Monolog\Handler\StreamHandler') 
     { 
      $saveHandlers[] = $handler; 
     } 
    } 

    foreach ($saveHandlers as $handler) 
    { 
     $monolog->pushHandler($handler); 
    } 

    $log->useFiles('/var/log/nginx/ds.console.log', $level='info'); 
    $log->useFiles('/var/log/nginx/ds.console.log', $level='error'); 
    ... 

、代わりに$log->useFiles()のあなたは、このようなものを使用することができます

$logStreamHandler = new \Monolog\Handler\StreamHandler('/var/log/nginx/ds.console.log'); 

$pid = getmypid(); 

$logFormat = "%datetime% $pid [%level_name%]: %message%\n"; 
$formatter = new \Monolog\Formatter\LineFormatter($logFormat, null, true); 
$logStreamHandler->setFormatter($formatter); 

$monolog->pushHandler($logStreamHandler); 

0

彼らは、あなたが

ファーストを取ることができるhereを示唆するように、あなたがLog::useFilesLog::useDailyFilesを使用することができます二つのアプローチです。

Log::useDailyFiles(storage_path().'/logs/name-of-log.log'); 
Log::info([info to log]); 

このアプローチの欠点は、コードの前にデフォルトのMonologが実行されるため、すべてがデフォルトのログファイルにログインすることです。

第2に、デフォルトのログにすべてがあることを避けるために、デフォルトのログクラスを上書きすることができます。これの例はhereです。具体的なログファイルはLog::info()とすることができ、他のすべてのログはデフォルトファイルに書き込むことができます。このアプローチの明らかな欠点は、より多くの作業とコードのメンテナンスが必要なことです。

関連する問題