Wie erstelle ich eine Logdatei in PHP?

78

Ich möchte eine Protokolldatei für mein System erstellen, um jede Aktion im System zu registrieren / protokollieren. Aber ich habe keine Ahnung, wie es geht.

Zum Beispiel habe ich diesen PHP-Code, der die Anmeldefunktion ausführt.

public function hasAccess($username,$password){
    $form = array();
    $form['username'] = $username;
    $form['password'] = $password;


    $securityDAO = $this->getDAO('SecurityDAO');
    $result = $securityDAO->hasAccess($form);
    //var_dump($form);
    //var_dump($result);
    if($result[0]['success']=='1'){
        $this->Session->add('user_id', $result[0]['id']);
        //$this->Session->add('username', $result[0]['username']);
        //$this->Session->add('roleid', $result[0]['roleid']);
        return $this->status(0,true,'auth.success',$result);
    }else{
        return $this->status(0,false,'auth.failed',$result);
    }
}

Jetzt möchte ich eine Protokolldatei mit dem Titel "Das Datum heute" erstellen. Wenn diese Funktionen zum Anmelden verwendet werden, wird geschrieben, dass sich der Benutzer angemeldet hat, genau wie bei anderen Funktionen. Aber ich möchte nur eine einzige Datei für jeden Tag.

Könnte jemand so freundlich sein, mir zu zeigen, wie ich meine Codes machen soll?

maecy m
quelle
Besser bei db anmelden, Ihr Code ist 1 Zeile vom Datenbankzugriff entfernt. Warum sollten Sie eine separate Funktion zum Schreiben in eine Datei erstellen, aber was haben Sie versucht?
Lawrence Cherone
Ja, ich habe eine XML-Datei, in der der gespeicherte Prozess aufgerufen wird. Nein, ich habe noch nichts ausprobiert. Weil ich nicht weiß, wo ich anfangen soll. Mir wurde gesagt, dass ich die Ereignisse protokollieren soll, wenn eine Funktion aufgerufen wird.
Maecy m

Antworten:

150

Um in eine Protokolldatei zu schreiben und jeden Tag eine neue zu erstellen, können Sie diese date("j.n.Y")als Teil des Dateinamens verwenden.

//Something to write to txt log
$log  = "User: ".$_SERVER['REMOTE_ADDR'].' - '.date("F j, Y, g:i a").PHP_EOL.
        "Attempt: ".($result[0]['success']=='1'?'Success':'Failed').PHP_EOL.
        "User: ".$username.PHP_EOL.
        "-------------------------".PHP_EOL;
//Save string to log, use FILE_APPEND to append.
file_put_contents('./log_'.date("j.n.Y").'.log', $log, FILE_APPEND);

Sie würden das also in Ihre hasAccess()Methode einfügen.

public function hasAccess($username,$password){
    $form = array();
    $form['username'] = $username;
    $form['password'] = $password;

    $securityDAO = $this->getDAO('SecurityDAO');
    $result = $securityDAO->hasAccess($form);

    //Write action to txt log
    $log  = "User: ".$_SERVER['REMOTE_ADDR'].' - '.date("F j, Y, g:i a").PHP_EOL.
            "Attempt: ".($result[0]['success']=='1'?'Success':'Failed').PHP_EOL.
            "User: ".$username.PHP_EOL.
            "-------------------------".PHP_EOL;
    //-
    file_put_contents('./log_'.date("j.n.Y").'.txt', $log, FILE_APPEND);

    if($result[0]['success']=='1'){
        $this->Session->add('user_id', $result[0]['id']);
        //$this->Session->add('username', $result[0]['username']);
        //$this->Session->add('roleid', $result[0]['roleid']);
        return $this->status(0,true,'auth.success',$result);
    }else{
        return $this->status(0,false,'auth.failed',$result);
    }
}
Lawrence Cherone
quelle
Ich habe versucht, mein System auf einen Linux-basierten Computer zu stellen, und jetzt gibt es ein Problem mit der Protokolldatei bezüglich der Berechtigungen. Wie kann ich es reparieren?
Maecy m
4
Ich würde definitiv keine Klartext-Passwörter speichern, Punkt, einschließlich Protokolldateien.
Smoothware
Hinzu kommt: "PHP_EOL ist wie" \ n "oder" \ r \ n "abhängig von der Betriebssystemplattform. Ich hasse viele \ n \ n \ n \ n; p - Lawrence Cherone 11. November 13 um 4 : 55 "EOL steht einfach für End of Line. Verfügbar seit PHP 5.0.2. Lesen Sie hier mehr: php.net/manual/en/reserved.constants.php
kPieczonka
Besonders Protokolldateien. Es gibt viele Anwendungen, die verlangen, dass ein Passwort in einer Klartext-Konfigurationsdatei gespeichert wird. Dies ist eine ziemlich gut akzeptierte Norm. Die Ordner, die diese Dateien enthalten, müssen jedoch in Bezug auf die Berechtigungen gesperrt werden, und dies sollten immer nur dienstspezifische Kennwörter sein, niemals echte Blood-n-Bone-Benutzerkennwörter.
Robert Talada
1
Der Code ist nicht sicher gegen gleichzeitiges Schreiben, wenn zwei Skripte gleichzeitig versuchen, in das Protokoll zu schreiben, und Skript 1 so viele Daten enthält, dass nicht alle Daten in einem einzigen write () geschrieben werden (worauf file_put_contents dies tut Führen Sie automatisch ein zweites Schreiben () durch, um zu versuchen, die verbleibenden Daten zu schreiben. Skript 2 schreibt sein Protokoll nach dem ersten Schreiben des ersten Skripts. Vor dem zweiten Schreiben von Skript 1 () werden die Protokolle jedoch entstellt. Sie können dies vermeiden potenzielles Problem durch Verwendung von LOCK_EX in Kombination mit FILE_APPEND (oder zusammen Bitflags), dann wartet script2, bis script1 vollständig beendet ist
hanshenrik
15

Erstellen Sie eine Protokolldatei in PHP , um dies zu tun, müssen Sie Daten auf Funktion übergeben und es wird eine Protokolldatei für Sie erstellen.

function wh_log($log_msg)
{
    $log_filename = "log";
    if (!file_exists($log_filename)) 
    {
        // create directory/folder uploads.
        mkdir($log_filename, 0777, true);
    }
    $log_file_data = $log_filename.'/log_' . date('d-M-Y') . '.log';
    // if you don't add `FILE_APPEND`, the file will be erased each time you add a log
    file_put_contents($log_file_data, $log_msg . "\n", FILE_APPEND);
} 
// call to function
wh_log("this is my log message");
JON
quelle
8

Bitte überprüfen Sie mit dieser Dokumentation.

http://php.net/manual/en/function.error-log.php

Beispiel:

<?php
// Send notification through the server log if we can not
// connect to the database.
if (!Ora_Logon($username, $password)) {
    error_log("Oracle database not available!", 0);
}

// Notify administrator by email if we run out of FOO
if (!($foo = allocate_new_foo())) {
    error_log("Big trouble, we're all out of FOOs!", 1,
               "[email protected]");
}

// another way to call error_log():
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
?>
Surabhil Sergy
quelle
4

Bitte überprüfen Sie diesen Code, es funktioniert gut für mich.

$data = array('shopid'=>3,'version'=> 1,'value=>1');  //here $data is dummy varaible

error_log(print_r($data,true), 3, $_SERVER['DOCUMENT_ROOT']."/your-file-name.log");

//In $data we can mention the error messege and create the log
Pasupathi Thangavel
quelle
In der obigen Codezeile reicht die Zeile error_log aus, um eine neue Protokolldatei in Ihrem Stammordner zu erstellen. In den Daten print_r ($ data, true) wird angegeben, was Sie wirklich in dieser Protokolldatei drucken möchten.
Pasupathi Thangavel
3

Sie können die integrierte Funktion verwenden trigger_error(), um Benutzerfehler / Warnungen / Hinweise auszulösen und set_error_handler()zu behandeln. In Ihrem Fehlerbehandler möchten Sie möglicherweise alle Datensätze in Dateien verwenden error_log()oder file_put_contents()speichern. Um eine einzelne Datei für jeden Tag zu haben, verwenden Sie einfach so etwas wie einen sprintf('%s.log', date('Y-m-d'))Dateinamen. Und jetzt solltest du wissen, wo du anfangen sollst ... :)

Paulo Freitas
quelle
1
Wie schreibe ich es? Stört es Sie, wenn Sie mir einen Beispielcode geben könnten? Wenn es nicht zu viel verlangt. Vielen Dank.
Maecy m
3

Stimmen Sie der @ jon-Antwort zu. Gerade hinzugefügt, geändert den Pfad, um das logVerzeichnis innerhalb der zu erstellenroot

 function wh_log($log_msg) {
    $log_filename = $_SERVER['DOCUMENT_ROOT']."/log";
    if (!file_exists($log_filename))
    {
        // create directory/folder uploads.
        mkdir($log_filename, 0777, true);
    }
    $log_file_data = $log_filename.'/log_' . date('d-M-Y') . '.log';
    file_put_contents($log_file_data, $log_msg . "\n", FILE_APPEND);
}

gerade hinzugefügt $_SERVER['DOCUMENT_ROOT']

Manish
quelle
0

Verwenden Sie die folgende Funktion

// Enable error reporting
ini_set('display_errors', 1);
//Report runtime errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
//error_reporting(E_ALL & ~E_NOTICE);
// Tell php where your custom php error log is
ini_set('error_log', 'php_error.log');

$dateTime=date("Y-m-d H:i:s");
$ip= $_SERVER['REMOTE_ADDR'];
$errorString="Error occured on time $dateTime by ip $ip";
$php_error_msg.=$errorString;
// Append the error message to the php-error log
//error_log($php_error_msg);
error_log("A custom error has been triggered",1,"email_address","From: email_address");

Die obige Funktion erstellt eine Anmeldedatei php_error mit der richtigen Beschreibung und es wird eine E-Mail gesendet.

vritika
quelle
0

Dies ist mein Arbeitscode. Danke an Paulo für die Links. Sie erstellen einen benutzerdefinierten Fehlerbehandler und rufen die trigger_errorFunktion mit der richtigen $errnoAusnahme auf, auch wenn es sich nicht um einen Fehler handelt. Stellen Sie sicher, dass Sie ohne Administratorzugriff in das Protokolldateiverzeichnis schreiben können.

<?php
    $logfile_dir = "C:\workspace\logs\\";   // or "/var/log/" for Linux
    $logfile = $logfile_dir . "php_" . date("y-m-d") . ".log";
    $logfile_delete_days = 30;

    function error_handler($errno, $errstr, $errfile, $errline)
    {
        global $logfile_dir, $logfile, $logfile_delete_days;

        if (!(error_reporting() & $errno)) {
            // This error code is not included in error_reporting, so let it fall
            // through to the standard PHP error handler
            return false;
        }

        $filename = basename($errfile);

        switch ($errno) {
            case E_USER_ERROR:
                file_put_contents($logfile, date("y-m-d H:i:s.").gettimeofday()["usec"] . " $filename ($errline): " . "ERROR >> message = [$errno] $errstr\n", FILE_APPEND | LOCK_EX);
                exit(1);
                break;

            case E_USER_WARNING:
                file_put_contents($logfile, date("y-m-d H:i:s.").gettimeofday()["usec"] . " $filename ($errline): " . "WARNING >> message = $errstr\n", FILE_APPEND | LOCK_EX);
                break;

            case E_USER_NOTICE:
                file_put_contents($logfile, date("y-m-d H:i:s.").gettimeofday()["usec"] . " $filename ($errline): " . "NOTICE >> message = $errstr\n", FILE_APPEND | LOCK_EX);
                break;

            default:
                file_put_contents($logfile, date("y-m-d H:i:s.").gettimeofday()["usec"] . " $filename ($errline): " . "UNKNOWN >> message = $errstr\n", FILE_APPEND | LOCK_EX);
                break;
        }

        // delete any files older than 30 days
        $files = glob($logfile_dir . "*");
        $now   = time();

        foreach ($files as $file)
            if (is_file($file))
                if ($now - filemtime($file) >= 60 * 60 * 24 * $logfile_delete_days)
                    unlink($file);

        return true;    // Don't execute PHP internal error handler
    }

    set_error_handler("error_handler");

    trigger_error("testing 1,2,3", E_USER_NOTICE);
?>
xinthose
quelle
Wie würden Sie dies in OOP PHP schreiben?
TRS7
@ TRS7 Ich bin mir nicht sicher, sorry. Ich rufe set_error_handlerjede meiner PHP-Dateien separat auf.
Xinthose
0

Verwenden Sie diese Funktion, um ein Protokoll zu drucken. Dadurch wird eine Protokolldatei im logOrdner erstellt. Erstellen Sie einen Protokollordner, falls dieser nicht vorhanden ist.

logger("Your msg in log ", "Filename you want ", "Data to be log string or array or object");


function logger($logMsg="logger", $filename="logger", $logData=""){     
            $log  = date("j.n.Y h:i:s")." || $logMsg : ".print_r($logData,1).PHP_EOL .                  
            "-------------------------".PHP_EOL;
            file_put_contents('./log/'.$filename.date("j.n.Y").'.log', $log, FILE_APPEND);                      
    }
Ashwani Panwar
quelle