【已解决】PHP将log信息写入服务器中的log文件

【背景】

折腾:

【记录】php中如何写类和如何使用类

期间,需要整理出一份,可配置的,通用的,log系统。

支持写入log信息到log文件中。

 

【折腾过程】

1.搜:

php log to file

参考:

PHP: error_log – Manual

PHP: syslog – Manual

How to create logs with PHP – Web Services Wiki

Write to a log file with PHP | Redips spideR Net

下载代码:

Download redips10.tar.gz

2.期间:

【已解决】PHP中函数前面加上at符号@的作用

3.然后用代码:

crifanLib.php

<?php
/*
[Filename]
crifanLib.php

[Function]
crifan's php lib, implement common functions

[Author]
Crifan Li

[Contact]
http://www.crifan.com/contact_me/

[Note]
1.online see code:
http://code.google.com/p/crifanlib/source/browse/trunk/php/crifanLib.php

[TODO]

[History]
[v1.0]
1.initial version, need clean up later

*/

class crifanLib {

    private $logFile;
    private $logFp;

    /*
        Init log file
    */
    function logInit($inputLogFile = null){
        // set default log file name
        // in case of Windows set default log file
        //http://stackoverflow.com/questions/1482260/how-to-get-the-os-on-which-php-is-running
        //http://php.net/manual/zh/function.php-uname.php
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            $defautLogFile = 'C:/php/defLogFile.log';
        }
        // set default log file for Linux and other systems
        else {
            $defautLogFile = '/tmp/defLogFile.log';
        }

        $this->logFile = $inputLogFile ? $inputLogFile : $defautLogFile;
        // open log file for writing only and place file pointer at the end of the file
        // (if the file does not exist, try to create it)
        $this->logFp = fopen($this->logFile, 'a') or exit("Can't open $this->logFile!");
    }

    /*
        Write log info to file
    */
    function logWrite($logContent){
        // if file pointer doesn't exist, then open log file
        if (!is_resource($this->logFp)) {
            $this->logInit();
        }
        // define script name
        $script_name = pathinfo($_SERVER['PHP_SELF'], PATHINFO_FILENAME);
        // define current time and suppress E_WARNING if using the system TZ settings
        // (don't forget to set the INI setting date.timezone)
        $time = @date('[Y-m-d H:i:s] ');
        // write current time, script name and message to the log file
        fwrite($this->logFp, "$time ($script_name) $logContent" . PHP_EOL);
    }

    /*
        Deinit log
    */
    function logDeinit(){
        if (is_resource($this->logFp)) {
            fclose($this->logFp);
        }
    }
}

 ?>

然后测试代码:

<?php
/*
    Author:     Crifan Li
    Version:    2015-07-27
    Contact:    http://www.crifan.com/about/me/
    Function:   Wechat get access token
*/

include_once "crifanLib.php";

//test log
$crifanLib = new crifanLib();
$crifanLib->logInit("/xxx/access_token/crifanLibTest.log");
$crifanLib->logWrite("This is crifanLib log test message.");
$crifanLib->logDeinit();

?>

然后去执行对应的代码:

http://xxx/access_token/wx_access_token.php

页面是没有任何输出的:

run log test but no output

然后的确生成了log文件了:

root@chantyou:php# cd access_token/
root@chantyou:access_token# ll
total 16
-rwxrwxrwx 1 root root 9335 Jul 27 17:51 crifanLib.php
-rwxrwxrwx 1 root root  567 Jul 27 17:52 wx_access_token.php
root@chantyou:access_token# ll
total 20
-rwxrwxrwx 1 root   root   9335 Jul 27 17:51 crifanLib.php
-rw-r--r-- 1 apache apache   77 Jul 27 17:56 crifanLibTest.log
-rwxrwxrwx 1 root   root    567 Jul 27 17:52 wx_access_token.php
root@chantyou:access_token# cat crifanLibTest.log 
[2015-07-27 10:10:33]  (wx_access_token) This is crifanLib log test message.
root@chantyou:access_token# 

【注意】

要记得给对应的(此处是Linux服务器中的对应的文件夹添加写权限:

root@chantyou:php# ll
total 48
drwxr-xr-x 2 root root 4096 Jul 27 17:55 access_token
-rwxr-xr-x 1 root root 1091 Sep 25  2014 errorCode.php
-rw-r--r-- 1 root root 2230 Jun 10 14:16 MicromsgVerify.php
-rwxr-xr-x 1 root root 4288 Sep 25  2014 pkcs7Encoder.php
-rwxr-xr-x 1 root root  452 Sep 15  2014 Readme.txt
-rwxr-xr-x 1 root root  724 Sep 22  2014 sha1.php
drwxr-xr-x 2 root root 4096 Jul 20 12:34 wechat_encypt
-rwxr-xr-x 1 root root 5327 Sep 15  2014 WXBizMsgCrypt.php
-rwxrwxrwx 1 root root 2455 Jul 16 18:06 wx_didaosuzhou.php
-rwxr-xr-x 1 root root 1346 Sep 22  2014 xmlparse.php
root@chantyou:php# chmod ugo+wx access_token/   
root@chantyou:php# ll
total 48
drwxrwxrwx 2 root root 4096 Jul 27 17:55 access_token
-rwxr-xr-x 1 root root 1091 Sep 25  2014 errorCode.php
-rw-r--r-- 1 root root 2230 Jun 10 14:16 MicromsgVerify.php
-rwxr-xr-x 1 root root 4288 Sep 25  2014 pkcs7Encoder.php
-rwxr-xr-x 1 root root  452 Sep 15  2014 Readme.txt
-rwxr-xr-x 1 root root  724 Sep 22  2014 sha1.php
drwxr-xr-x 2 root root 4096 Jul 20 12:34 wechat_encypt
-rwxr-xr-x 1 root root 5327 Sep 15  2014 WXBizMsgCrypt.php
-rwxrwxrwx 1 root root 2455 Jul 16 18:06 wx_didaosuzhou.php
-rwxr-xr-x 1 root root 1346 Sep 22  2014 xmlparse.php

否则会报错的:

Can’t open /xxx/access_token/crifanLibTest.log file!

 

4.不过突然想起来:

之前已经学过了,

file_put_contents

就可以替代了:fopen,fwrite,fclose了。

所以再去优化为:

crifanLib.php

<?php
/*
[Filename]
crifanLib.php

[Function]
crifan's php lib, implement common functions

[Author]
Crifan Li

[Contact]
http://www.crifan.com/contact_me/

[Note]
1.online see code:
http://code.google.com/p/crifanlib/source/browse/trunk/php/crifanLib.php

[TODO]

[History]
[v2015-07-27]
1.add logInit, logWrite

[v1.0]
1.initial version, need clean up later

*/

class crifanLib {

    private $logFile;
    private $logFp;

    /*
        Init log file
    */
    function logInit($inputLogFile = null){
        // set default log file name
        // in case of Windows set default log file
        //http://stackoverflow.com/questions/1482260/how-to-get-the-os-on-which-php-is-running
        //http://php.net/manual/zh/function.php-uname.php
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            $defautLogFile = 'C:/php/defLogFile.log';
        }
        // set default log file for Linux and other systems
        else {
            $defautLogFile = '/tmp/defLogFile.log';
        }

        $this->logFile = $inputLogFile ? $inputLogFile : $defautLogFile;
    }

    /*
        Write log info to file
    */
    function logWrite($logContent){
        // define script name
        $scriptName = pathinfo($_SERVER['PHP_SELF'], PATHINFO_FILENAME);
        // define current time and suppress E_WARNING if using the system TZ settings
        // (don't forget to set the INI setting date.timezone)
        $timeStr = @date('[Y-m-d H:i:s]');
        
        // write current time, script name and message to the log file
        file_put_contents($this->logFile, "$timeStr ($scriptName) $logContent" . PHP_EOL, FILE_APPEND);

    }
}

 ?>

测试文件为:

<?php
/*
    Author:     Crifan Li
    Version:    2015-07-27
    Contact:    http://www.crifan.com/about/me/
    Function:  test crifanLib log
*/

include_once "crifanLib.php";

//test log
$crifanLib = new crifanLib();
$crifanLib->logInit("/xxx/logTest.log");
$crifanLib->logWrite("This is crifanLib log test message using file_put_contents");

?>

效果是:

root@chantyou:access_token# ll
total 16
-rw-r--r-- 1 root root 9524 Jul 27 18:16 crifanLib.php
-rwxrwxrwx 1 root root  561 Jul 27 18:18 wx_access_token.php
root@chantyou:access_token# ll
total 20
-rw-r--r-- 1 root   root   9524 Jul 27 18:16 crifanLib.php
-rw-r--r-- 1 apache apache   76 Jul 27 18:19 logTest.log
-rwxrwxrwx 1 root   root    561 Jul 27 18:18 wx_access_token.php
root@chantyou:access_token# cat logTest.log 
[2015-07-27 12:05:47] (wx_access_token) This is crifanLib log test message using file_put_contents
root@chantyou:access_token# 

如图:

php write log file show result

 

注:

期间参考:

PHP: is_resource – Manual

 

【总结】

1.此处可以通过:

  • fopen创建log文件
  • fwrite写入文件信息
  • fclose关闭文件

去实现log信息写入到文件中的。

2.更好的做法是:

直接用更方便的

  • file_put_contents直接输出内容到log文件

即可。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量