як створити файл журналу в php?


81

Я хочу створити файл журналу для моєї системи, щоб реєструвати / реєструвати кожну дію, яку вони роблять усередині системи. Але я не уявляю, як це зробити.

Наприклад, у мене є цей php-код, який виконує функцію входу.

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);
    }
}

тепер я хочу створити файл журналу з назвою "дата сьогодні", тоді, коли ці функції використовуються для входу, він напише, що користувач увійшов, як і інші функції. Але я хочу лише один файл на кожен день.

Хтось міг би бути люб’язним, щоб вести мене та вчити, як я повинен робити свої коди?


Краще увійти в db, ваш код знаходиться на 1 рядок від доступу db, навіщо створювати окрему функцію для запису у файл, але що ви пробували?
Лоуренс Чероне

Так, у мене є файл xml, де він викликає збережений процес. Ні, я ще нічого не пробував. Тому що я не знаю, з чого почати. Мені сказали реєструвати події при кожному виклику функції.
maecy m

Відповіді:


154

Щоб писати у файл журналу та створювати новий щодня, ви можете використовувати його date("j.n.Y")як частину імені файлу.

//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);

Отже, ви б помістили це у свій hasAccess()метод.

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);
    }
}

Я спробував розмістити свою систему на комп'ютері під управлінням Linux, і тепер проблема з файлом журналу щодо дозволів. Як я можу це виправити?
maecy m

4
Однозначно не зберігатимуть текстові паролі, крапки, включаючи файли журналів.
гладкі програми

Додаючи до цього: "PHP_EOL - це все одно, що робити" \ n "або" \ r \ n "залежно від якої платформи ОС. Я ненавиджу багато \ n \ n \ n \ n; p - Лоуренс Чероне, 11 листопада 2013 року, 4 : 55 "EOL просто означає Кінець рядка. Доступно з PHP 5.0.2. Детальніше читайте тут: php.net/manual/en/reserved.constants.php
kPieczonka

Особливо файли журналів. Існує безліч додатків, які вимагають збереження пароля у конфігураційному файлі відкритого тексту, що є досить прийнятною нормою. Папки, що містять ці файли, повинні бути розумно заблоковані, хоча вони повинні бути лише паролями, що стосуються служб, і ніколи, ніколи, справжніми паролями користувача "кров-н-кістка".
Роберт Талада,

1
код не захищений від одночасних записів, якщо 2 скрипти намагаються одночасно писати в журнал, а сценарій 1 має стільки даних, що не всі дані записуються в одне write () (тоді файл_put_contents буде автоматично виконайте 2-й запис (), щоб спробувати записати решту даних), і сценарій # 2 пише свій журнал після 1-го сценарію 1-го запису, але перед 2-м записом script1 () журнали будуть зіпсовані - цього можна уникнути потенційна проблема, використовуючи LOCK_EX у поєднанні з FILE_APPEND (або об'єднані, бітлагги), тоді script2 буде чекати повного завершення
script1

17

створити файл журналу в php , для цього вам потрібно передати дані про функцію, і вона створить файл журналу для вас.

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");

9

Будь ласка, ознайомтесь із цією документацією.

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

Приклад:

<?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,
               "operator@example.com");
}

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

4

Будь ласка, перевірте цей код, він добре працює для мене.

$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

У наведеному вище коді рядка error_log достатньо для створення нового файлу журналу у вашій кореневій папці, дані print_r ($ data, true) згадують, що ви справді хочете надрукувати в цьому журналі.
Пасупаті Тангавел

3

Ви можете використовувати вбудовану функцію trigger_error()для активації помилок / попереджень / повідомлень користувачів та set_error_handler()їх обробки. Всередині вашого обробника помилок ви можете використовувати error_log()або file_put_contents()зберігати всі записи у файлах. Щоб мати один файл на кожен день, просто використовуйте щось на зразок sprintf('%s.log', date('Y-m-d'))імені файлу. А тепер ви повинні знати, з чого почати ... :)


1
Як це написати? Ви не можете, якщо б ви могли дати мені зразок коду? Якщо це не надто багато просити. Дякую.
maecy m

3

Погодьтеся з відповіддю @jon. Щойно додано змінений шлях для створення logкаталогу всерединіroot

 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);
}

щойно додав $_SERVER['DOCUMENT_ROOT']


0

Використовуйте функцію нижче

// 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");

Вищевказана функція створить файл входу в файл php_error з належним описом, і буде надіслано електронне повідомлення.


0

Це мій робочий код. Дякую Паулу за посилання. Ви створюєте власний обробник помилок і викликаєте trigger_errorфункцію за правильним $errnoвинятком, навіть якщо це не помилка. Переконайтеся, що ви можете писати в каталог файлів журналу без доступу адміністратора.

<?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);
?>

Як би ви написали це в OOP PHP?
TRS7,

@ TRS7 Я не впевнений, вибачте. Я закликаю set_error_handlerкожен мій php-файл окремо.
xinthose

0

Для друку журналу використовуйте цю функцію, це створить файл журналу в log папці. Створіть папку журналу, якщо вона не існує.

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);                      
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.