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}