2017-06-09 3 views
1

私はMoodleプロジェクトに取り組んでいます。PHPのLog.txtファイルにエラーを書き込む方法がありますか?PHPでログファイルにエラーを書き込むカスタム関数を書くにはどうすればよいですか?

は以下

クラスdrill_auto_enrolluserは\コア\タスクの\ 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); 

     } 

} 

}あなたは、エラーが報告された方法を知っている必要があります。この場合

+0

何を試しましたか?コードはどこですか? – LSerni

+0

こんにちは、私は自分のMoodle PHPコードを追加しました。 –

答えて

0

を拡張する私のコードです。これは、通常、例外または戻り値によって行われます。最初のケースでは、例外が検出されなかった場合、アプリケーションは異常終了します(異常終了したはずです)。機能は、例えばtrueを返した場合、それ以外の

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

:インサートは、クラスMoodleDatabaseException(もちろん、あなたは例外が実際にスローされるものをチェックする必要がある)の例外をスローすることを想定例えば

、または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関数を定義するの問題が残っています、エラーを避けるために2回定義することは決してありません。

クイックデバッグでは、myErrorLogerror_logに置き換えることができます。このエラーはApacheエラーログファイルに出力され、並行性の問題とアクセス権の問題を回避します。

+0

返信いただきありがとうございます、私はModleエラーログ機能を使用したくありません。私はあなたのカスタム関数を試してみます。 –

+0

ありがとう、LSemi..あなたの英語の単語は理解しやすいです。私は許可問題に直面しています。警告:fopen(/moodle_error.txt):ストリームを開けませんでした:/ home/onlin200/public_html/mod/certificate/classes /task/errorlogging_function.php 13行 スケジュールされたタスクが失敗しました:コンピテンシーコース(mod_certificate \ task \ drill_auto_enrolluser)でユーザーを自動登録すると、ログファイルを開くことができませんでした。許可エラー? –

+0

あなたは/に書いていますが、Webサーバーには許可がありません。 /tmp/moodle-errors.txtを試してみるか、パスの前にドットを追加してください:./moodle_error.txt。 – LSerni

関連する問題