ThinkPHP接入log4php日志监控系统
一、配置常量
1、LOG_4_PHP
常量LOG_4_PHP表示thinkphp中是否记录日志标识
默认为FALSE,LOG_4_PHP =TRUE时表示已log4php格式记录日志,其中thinkphp中的日志记录未做任何修改
2、PUBLIC_PATH
表示thinkphp中公共文件建Plubic的路径
需在thinkphp入口文件inedx.php配置define('PUBLIC_PATH',__DIR__.'/Public/');
注:暂定设置Plubic文件夹的路径,若对系统有影响,可进行修改优化
二、引入文件
1、将附件中log4php文件夹引入thinkphp框架中的Vendor(thinkphp引入外部类存放位置)文件夹下(ThinkPHP/Library/);
2、将附件中resources文件夹引入thinkphp框架中Public文件夹下;
其中resources文件下的AppenderRollingFile.xml为log4php配置文件,其配置方法如下:
配置文件格式:
<param name="ConversionPattern" value="[系统简称] [%logger] [%date{Y-m-d H:i:s,u}] [%-5p] %l - %message^^%newline"/>
配置文件位置:
<param name="file" value="/u02/logs/tp.log" />
配置文件最大值:
<param name="maxFileSize" value="100MB" />
具体配置格式详见AppenderRollingFile.xml
三、修改thinkphp日志类
1、修改thinkphp框架中的Log.class.php(ThinkPHP/Library/Think/):
将类中的save()方法“$message = implode('',self::$log);“行进行隐藏,同时将“self::$storage->write($message,$destination);”修改为
“self::$storage->write(self::$log,$destination);”
2、修改thinkphp框架中的File.class.php(ThinkPHP/Library/Think/Log/Driver/):
将类中的write()方法改写为:
/** * 日志写入接口 * @access public * @param array $log 日志信息 * @param string $destination 写入目标 * @return void */ public function write($log,$destination='') { $now = date($this->config['log_time_format']); if(empty($destination)){ $destination = $this->config['log_path'].date('y_m_d').'.log'; } // 自动创建日志目录 $log_dir = dirname($destination); if (!is_dir($log_dir)) { mkdir($log_dir, 0755, true); } //检测日志文件大小,超过配置大小则备份日志文件重新生成 if(is_file($destination) && floor($this->config['log_file_size']) <= filesize($destination) ){ rename($destination,dirname($destination).'/'.time().'-'.basename($destination)); } if (C("LOG_4_PHP")){ Vendor('log4php.Logger'); \Logger::configure(PUBLIC_PATH.'resources/AppenderRollingFile.xml'); $logger = \Logger::getLogger('THINKPHP_LOG'); foreach ($log as $key => $value){ $info = json_encode($value); $level = substr($value, 0, strpos($value, ':')); if ($level == 'INFO' || $level == 'DEBUG' || $level == 'SQL'){ $logger->debug($info); }elseif ($level == 'NOTIC' || $level == 'WARN'){ $logger->warn($info); }elseif ($level == 'ERR' || $level == 'CRIT'){ $logger->error($info); }elseif ($level == 'EMERG' || $level == 'ALERT'){ $logger->fatal($info); }else{ $logger->info($info); } } } $message = implode('',$log); error_log("[{$now}] ".$_SERVER['REMOTE_ADDR'].' '.$_SERVER['REQUEST_URI']."\r\n{$message}\r\n", 3,$destination); }