如何编写一个自定义函数,将错误写入我在Php中的日志文件?

时间:2017-06-09 11:08:44

标签: php logging moodle

我正在研究Moodle项目。我希望有一种方法可以将我的错误写入PHP的Log.txt文件中。

以下是我的代码

class drill_auto_enrolluser extends \ core \ task \ scheduled_task {

public function execute() {

    global $DB;
    $name="";
    $description="";
    $descriptionformat ="";
    $userid="";
    $templateid="";
    $timecreated="";
    $timemodified=0;
    $origtemplateid=NULL;
    $status=0;
    $duedate=0;
    $reviewerid=NULL;     

         $DATA = $DB->get_recordset_sql ("Select name,description,descriptionformat,userid,templateid from vw_new_user_lp");

            foreach ($DATA as $id => $rec) {

                 $record = new \stdClass();                                          
                             $record ->name = $rec->name;
                             $record ->description= $rec->description;
                             $record ->descriptionformat=$rec->descriptionformat;
                             $record ->userid= $rec->userid;    
                             $record->origtemplateid=$origtemplateid;
                             $record ->templateid=$rec->templateid;
                             $record->status= $status;
                             $record->duedate= $duedate;
                             $record->reviewerid= $reviewerid;
                             $record->timecreated= time();
                             $record->timemodified = $timemodified;
                             $record->usermodified = $userid;

                $DB->insert_record('competency', $record);

      }

}

}

1 个答案:

答案 0 :(得分:0)

在这种情况下,您必须知道如何报告错误。这通常通过例外或通过返回值来完成。在第一种情况下,如果未捕获异常,则应用程序将中止(应该是这样)。

例如,假设插入引发了类MoodleDatabaseException的异常(当然,您需要检查实际抛出的异常):

try {
    $DB->insert_record('competency', $record);
} catch (\MoodleDatabaseException $err) {
    myErrorLog($err->getMessage());
}

否则,如果函数返回例如true或false,你会去:

if (true !== $DB->insert_record('competency', $record)) {
    myErrorLog($DB->functionThatReturnsLastErrorMessage());
}

在这两种情况下,您都需要myErrorLog功能。我认为Moodle有一个日志工具和you may want to check it out,可能会询问更详细的后续问题。您可能还会决定使用the Apache error_log facility,具体取决于您的需求。在紧要关头,您可以使用文本日志文件:

function myErrorLog($message = 'no message') {
    $date = date('Y-m-d H:i:s');
    $fp   = fopen('/var/log/moodle-errors.log', 'a');
    if (!$fp) {
         throw new \Exception("Could not open log file! Permission error?");
    }
    fwrite($fp, $date . ' ' . $message . "\n");
    fclose($fp);
}

上面的代码并不担心多用户锁定,这可能会有问题。这对于快速和脏的调试很有用;否则你需要使用提供的任何功能(或者看看集成Log4Php或Monolog,可能;但这看起来像一个要求很高的项目)。

更新

由于我没有太清楚(英语不是我的母语),你留下了 的问题来定义myErrorLog功能所以至于使其在任何地方都可用,但从未定义过两次以避免错误。

对于快速调试,您可以将myErrorLog替换为error_log,这将输出到Apache错误日志文件,从而避免并发问题和权限问题。