как создать лог файл в php?

Я хочу создать файл журнала для моей системы, чтобы регистрировать/регистрировать каждое действие, которое они делают внутри системы. Но я понятия не имею, как это сделать.

Например, у меня есть этот 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);
    }
}

теперь я хочу создать файл журнала под названием «Сегодняшняя дата», затем, когда эти функции используются для входа в систему, он напишет, что пользователь вошел в систему, то же самое с другими функциями. Но мне нужен только один файл на каждый день.

Может ли кто-нибудь быть достаточно любезен, чтобы направлять и учить меня, как мне делать свои коды?


person maecy m    schedule 11.11.2013    source источник
comment
Лучше логировать в бд, ваш код в 1 строке от доступа к бд, зачем создавать отдельную функцию для записи в файл, а что вы пробовали?   -  person Lawrence Cherone    schedule 11.11.2013
comment
Да, у меня есть файл xml, в котором он вызывает сохраненную процедуру. Нет, я еще ничего не пробовал. Потому что я не знаю, с чего начать. Мне сказали регистрировать события всякий раз, когда вызывается функция.   -  person maecy m    schedule 11.11.2013


Ответы (9)


Чтобы писать в файл журнала и создавать новый каждый день, вы можете использовать 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);
    }
}
person Lawrence Cherone    schedule 11.11.2013
comment
Я попытался установить свою систему на компьютер под управлением Linux, и теперь возникла проблема с файлом журнала, касающимся разрешений. Как я могу это исправить? - person maecy m; 22.11.2013
comment
Определенно не будет хранить пароли в виде простого текста, точка, включая файлы журналов. - person smoothware; 19.05.2018
comment
В дополнение к этому: PHP_EOL похож на выполнение \n или \r\n в зависимости от платформы ОС. Я ненавижу много \n\n\n\n's; p — Лоуренс Чероне Доступно с PHP 5.0.2. Подробнее читайте здесь: php.net/manual/en/reserved.constants.php< /а> - person kPieczonka; 23.09.2019
comment
Особенно файлы журналов. Существует множество приложений, которые запрашивают сохранение пароля в текстовом конфигурационном файле, что является общепринятой нормой. Папки, содержащие эти файлы, должны быть заблокированы с точки зрения разрешений, и это должны быть только пароли для конкретных служб, а не настоящие пароли пользователей. - person Robert Talada; 16.06.2020
comment
код не застрахован от одновременных записей, если есть 2 сценария, пытающихся записать в журнал одновременно, а в сценарии 1 так много данных, что не все данные записываются в одну операцию write() (после чего file_put_contents будет автоматически выполнить 2-ю запись (), чтобы попытаться записать оставшиеся данные), и сценарий № 2 записывает свой журнал после 1-й записи 1-го сценария, но перед 2-й записью script1 (), журналы будут искажены - вы можете избежать этого потенциальная проблема при использовании LOCK_EX в сочетании с FILE_APPEND (или вместе, битовые флаги), тогда script2 будет ждать полного завершения script1 - person hanshenrik; 08.07.2020
comment
file_put_contents — это плохая функция, которая иногда приводит к сбою кода, следующего за ней. - person Pyromonk; 03.02.2021

создайте файл журнала в 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");
person JON    schedule 11.11.2017

Пожалуйста, сверьтесь с этой документацией.

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,
               "[email protected]");
}

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

Согласен с ответом @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']

person Manish    schedule 12.05.2018

Пожалуйста, проверьте этот код, он отлично работает для меня.

$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
person Pasupathi Thangavel    schedule 04.01.2017
comment
В приведенном выше коде строки error_log достаточно, чтобы создать новый файл журнала в вашей корневой папке, данные print_r($data,true) указывают, что вы действительно хотите напечатать в этом файле журнала. - person Pasupathi Thangavel; 04.01.2017

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

person Paulo Freitas    schedule 11.11.2013
comment
Как мне это написать? Вы не возражаете, если вы могли бы дать мне пример кода? Если не слишком много, чтобы спросить. Спасибо. - person maecy m; 11.11.2013

Это мой рабочий код. Спасибо Paulo за ссылки. Вы создаете собственный обработчик ошибок и вызываете функцию 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);
?>
person xinthose    schedule 15.02.2017
comment
Как бы вы написали это в ООП PHP? - person TRS7; 12.07.2019
comment
@ TRS7 Я не уверен, извините. Я вызываю set_error_handler в каждом из моих php-файлов отдельно. - person xinthose; 15.07.2019

Используйте функцию ниже

// 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 с правильным описанием, и электронная почта будет отправлена.

person vritika    schedule 16.04.2014

Для печати журнала используйте эту функцию, это создаст файл журнала в папке 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);                      
    }
person Ashwani Panwar    schedule 22.10.2019