【问题标题】:How to create a logfile in php如何在php中创建日志文件
【发布时间】:2013-11-22 19:15:17
【问题描述】:

我想为我的系统创建一个日志文件来注册/记录他们在系统内执行的每个操作。但我不知道该怎么做。

例如,我有这个执行登录功能的 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);
    }
}

现在我想创建一个名为“今天的日期”的日志文件,然后当该功能用于登录时,它会写入该用户已登录,与其他功能相同。但我每天只想要一个文件。

谁能指导和教我如何编写代码?

【问题讨论】:

    标签: php logfile


    【解决方案1】:

    您可以使用内置函数trigger_error() 来触发用户错误/警告/通知,并使用set_error_handler() 来处理它们。在错误处理程序中,您可能希望使用error_log() 或file_put_contents() 将所有记录存储在文件中。要每天拥有一个文件,只需使用 sprintf('%s.log', date('Y-m-d')) 之类的名称作为文件名。现在你应该知道从哪里开始... :)

    【讨论】:

    • 怎么写?你介意给我一个示例代码吗?如果问的不是太多。谢谢。
    【解决方案2】:

    要写入日志文件并每天创建一个新文件,您可以使用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 的计算机上,但现在关于权限的日志文件存在问题。我该如何解决?
    • 绝对不会存储纯文本密码、句号,包括日志文件。
    • 补充:“PHP_EOL 就像做“\n”或“\r\n”取决于哪个操作系统平台。我讨厌很多\n\n\n\n ;p – Lawrence Cherone 13 年 11 月 11 日在 4:55 “EOL 仅代表行尾。自 PHP 5.0.2 起可用。在这里阅读更多:php.net/manual/en/reserved.constants.php
    • 特别是日志文件。有很多应用程序要求将密码存储在纯文本配置文件中,这是一个相当普遍接受的规范。包含这些文件的文件夹需要锁定权限,并且这些应该只是特定于服务的密码,永远不会是真正的血腥用户密码。
    • 如果有 2 个脚本试图同时写入日志,并且脚本 1 的数据太多以至于并非所有数据都写入一个单个 write() (因此 file_put_contents 将自动执行第二次 write() 以尝试写入剩余数据),脚本 #2 在第一次脚本第一次写入之后写入其日志,但在脚本 1 的第二次 write() 之前,日志将被破坏-您可以通过将 LOCK_EX 与 FILE_APPEND 结合使用(或一起使用,位标志)来避免该潜在问题,然后 script2 将等待 script1 完全完成
    【解决方案3】:

    请查看此文档。

    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】:

      使用下面的函数

      // 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 中创建一个带有正确描述的日志,并发送电子邮件。

      【讨论】:

        【解决方案5】:

        请检查此代码,它适用于我。

        $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
        

        【讨论】:

        【解决方案6】:

        这是我的工作代码。感谢Paulo 的链接。您创建一个自定义错误处理程序并使用正确的$errno 异常调用trigger_error 函数,即使它不是错误。确保您可以在没有管理员访问权限的情况下写入日志文件目录。

        <?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 我不确定,抱歉。我在每个 php 文件中分别调用 set_error_handler。
        【解决方案7】:

        create a logfile in 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");
        

        【讨论】:

          【解决方案8】:

          同意@jon 的回答。刚刚添加修改路径在root里面创建log目录

           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);
          }
          
          wh_log('log to file');
          

          刚刚添加$_SERVER['DOCUMENT_ROOT']

          【讨论】:

            【解决方案9】:

            打印日志使用此功能,这将在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);                      
                }
            

            【讨论】:

              【解决方案10】:

              自定义日志功能(用于php服务器):

              特点:

              日志将对公众隐藏(不可见)(无需在服务器上进行设置)

              易于阅读的日志数据

              function log_it($info)
              {
              $filename = $_SERVER['DOCUMENT_ROOT'] . '/' . '1LOGS.php';
              $dieCode = "<?php die();?>";
              $fileStart = @file_get_contents($filename, false, null, 0, 14);
              if ($fileStart) {
                  if ($fileStart !== $dieCode)
                      file_put_contents($filename, $dieCode . file_get_contents($filename));
              } else file_put_contents($filename, $dieCode);
              
              if (is_string($info) || is_int($info) || is_float($info)) $txt = '    ' . $info;
              elseif (is_array($info) || is_object($info)) $txt = PHP_EOL . '    ' . print_r($info, true);
              else $txt = '    ' . 'Data Type: ' . gettype($info);
              file_put_contents(
                  $filename,
                  PHP_EOL . '>>> ( Date:' . date("Y:m:d H:i:s") . ' )' . $txt,
                  FILE_APPEND
              );
              }
              

              告知是否有改进空间

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-05-08
                • 2019-04-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-08-30
                相关资源
                最近更新 更多