一个简单的日志记录函数

作者: caixw
修改时间:
 1/**
 2* 记录一条日志,会以以下三种方式依次尝试写日志。
 3* - 向当前参数指定的文件写入日志。
 4* - 尝试向 php.ini 中指定的 error_log 写内容。
 5* - 向系统日志写内容,还是失败的话则返回 false。
 6*
 7* 不用每次调用时都指定 logFile 和 dateFormat 参数
 8* 系统会自动记住上次指定的内容。
 9*
10* PHP5.0 之后请确保已经设置好时区,否则可能会抛出一个错误。
11* example:
12* @code php
13* // 第一次调用,初始化日志,并写入第一条信息。
14* logs('init...', LOG_INFO, '/usr/log.txt', 'y-m-d');
15* // 写日志
16* logs('log msg', LOG_INFO);
17* @endcode
18*
19* @param string $message 日志内容
20* @param int $type 日志类型,参照 syslog 函数的参数
21* @param string $logFile 日志文件
22* @param string $dateFormat 日志的时间格式
23* @return bool  是否成功写入
24* @staticvar array $types 参数 $type 对应的描述信息。
25* @staticvar string $file 保存 $logFile 参数最后次传递的内容。
26* @staticvar string $format 保存 $dateFormat 参数最后传递的内容。
27* @link https://caixw.io/posts/2012/php-logs.html
28*/
29function logs($message, $type, $logFile = null, $dateFormat = null){
30    static $types = array(
31        LOG_EMERG   => 'EMERG',
32        LOG_ALERT   => 'ALERT',
33        LOG_CRIT    => 'CRITICAL',
34        LOG_ERR     => 'ERROR',
35        LOG_WARNING => 'WARNING',
36        // windows下,以下这三个值是一样的
37        LOG_NOTICE  => 'NOTICE',
38        LOG_DEBUG   => 'DEBUG',
39        LOG_INFO    => 'INFO');
40    static $file = null;
41    static $format = 'Y-m-d H:i:s';
42
43    if(!is_null($logFile)){
44        $file = $logFile;
45    }
46    if(!is_null($dateFormat)){
47        $format = $dateFormat;
48   }
49
50    /* 格式化消息 */
51    $type = isset($types[$type]) ? $type : LOG_INFO;
52    $msg = date($format) . ' [' . $types[$type] . '] ' . $message . PHP_EOL;
53
54    if(error_log($msg, 3, $file)){
55        return true;
56    }
57
58    if(error_log($msg, 0)){
59        return true;
60    }
61
62    return syslog($type, $message);
63}