2017-03-22 12 views
2

私はLaravelに基づいてOctoberCMSを使用しています。OctoberCMSを使用したタスクスケジューリングログ

データベーステーブルvendor_log_にレコードがあります。

毎日、新しく作成されたレコードのリストを日付の付いた.logファイルに保存するためにLaravelが必要です。

私のカスタムコンポーネントのPlugin.phpファイルでは、私はregisterSchedule関数を作成しました。私はget()現在の日付でテーブル内のレコードを持っているし、file_put_contentsを使用して、それらを.logファイルに追加します。

ただし、ログファイルはログサーバーのパスに保存されていません。スケジュールが発砲していないかどうか、エラーがないかどうかはわかりません。

public function registerSchedule($schedule) 
{ 
    # Generate Daily Log File 
    $schedule->call(function() { 

     # Get Today's Date 
     $date = date("Y-m-d"); 

     # Get Records by Today's Date 
     # Match Record created_at date, exclude time 
     $records = \Db::table('vendor_log_') 
        ->whereDay('created_at', date('d')) 
        ->whereMonth('created_at', date('m')) 
        ->whereYear('created_at', date('Y')) 
        ->get(); 

     # Write records to log file 
     foreach ($records as $line) { 
      file_put_contents("/var/www/mysite/logs/$date.log", $line . PHP_EOL, FILE_APPEND); 
     } 

    })->everyMinute(); 
} 

$lineの出力:

stdClass Object ([user_id] => 1 [id] => 28 [username] => [name] => test [created_at] => 2017-03-22 02:39:13) 

注:私はより速くテストのためのログを生成するために->daily()の代わりに->everyMinute()を使用していました。

ドキュメント:
https://octobercms.com/docs/plugin/scheduling#defining-schedules
https://laravel.com/docs/5.4/scheduling#schedule-frequency-options

+0

によって行うことができますか?文字列変換に対するオブジェクト/配列が正しく動作しない可能性があります。それがエラーを生成するかどうかを確認したい場合は、コントローラなどでこのスクリプトを試すことができますか? –

+1

スケジューラを正しく設定していますか:https://octobercms.com/docs/setup/installation#crontab-setup、つまり正しい行をcrontabに入れてください。パスは正しいですか?どちらの場合でも、 '' regsiterSchedule''メソッドで単純に '' traceLog( 'scheduler'と呼ばれる) ''を呼び出して、実際に呼び出されることを確認してください。 –

+0

@DouwedeHaan私は競合が見つかったと思います、私のサイトは/ publicフォルダにあり、Laravelには/ logの外部に書き込む許可がありません。 –

答えて

2

問題とコメントの要約:

問題は二つの部分から成っ。

  • ログが保存される場所は、DBクラスによって返されたオブジェクトは、最初の問題をすることにより解決した

列として書き込むことができない

  • ユーザーによって書き込み可能ではありません使用されているホスティングのパブリックフォルダにログファイルを書き込みます。あなたは私たちのために$ラインをダンプすることができます文字列にDBオブジェクトを書き込むには

    は、次のコード

    foreach($records as $record) { 
        $array = (array) $record; 
    
        $string = ''; 
    
        foreach($record as $key => $value) { 
         $string .= $key .' '. $value . ','; 
        } 
    
        // strip the trailing comma of the end of the string 
        $line = rtrim($string, ','); 
    
        file_put_contents("/link/to/public/$date.log", $line . PHP_EOL, FILE_APPEND); 
    } 
    
  • +0

    これは正常に動作しています。スケジューラがログファイルに配列を追加しています。しかし、http_build_queryは配列を "id = 28&username =&created_at = 2017-03-22 + 02%3A39%3A13"に変えます。空白またはコンマで区切られた配列の実際の値を使用する方法はありますか? "id 28、username matt、created_at 2017-03-22"などです。 –

    +0

    @MattMcManisはい、私はコードを更新しました。コードブロックを確認してください! –

    +0

    "Undefined variable:record"というエラーが発生しました。 –

    関連する問題