2017-03-22 30 views
2

我使用的是基于LaravelOctoberCMS使用OctoberCMS的任务调度日志

我有记录在数据库表vendor_log_

每天我都需要Laravel将新创建的记录列表保存为过时的.log文件。

在我的自定义组件的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 called')''来验证它实际上是否被调用。 –

+0

@DouwedeHaan我想我发现了一个冲突,我的网站在/公用文件夹中,而且Laravel没有权限将它写在/ log之外。 –

回答

2

问题的概要和评价:

问题由两个部分组成;

  • 其中保存日志的位置并不
  • 由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

它给出错误“未定义变量:记录”。 –