介绍一个日志记录函数

框架的好处之一是有完整的日志记录系统,但都只是针对框架本身的,比如记录数据库调用信息,记录表单值和框架方法之间的参数和返回值等。但是如果项目之间涉及到跨平台,这个日志系统就显得微乎其微了。比如我之前参加的一个项目,主要是使用PHP来编写前段,包含几乎全部的业务逻辑,但是不需要操作数据库,因为操作数据库的所有事情都交给Java语言去实现了。而我们PHP组编写代码的其实只有6个人,但是给我们提供数据库操作的Java组就有30 多个人,按道理应该很容易将这个项目做出来。也只有经历过才觉得这之间的痛苦,这其中我们过的并不快乐。要知道,测试有任何问题都是找到我们,丝毫和接口没任何关系。而我们debug的结果是,自己去找Java中提供该接口的那个人。特别浪费时间,效率低并且接口的质量严重不过关。导致项目拖了两年 还久,直到现在都还在死死挣扎之中,我也是现在离开这家公司了。

还是后来有了新组长,他编码比较强,有很多年的工作经验。他来后就给我们写了这个函数,作用很简单,就是用来给Java接口debug的,我们只需要监控该函数产生的日志,就完全知道怎么回事了。

1.第一个函数是调用Java接口,使用PHP的扩展cURL中间件来实现,只需要简单的设置就可以使用了,我们的函数原型是这样的:

 

 1 /**
 2  *
 3  * @name rop调用数据
 4  * @param unknown $method            
 5  * @param unknown $params            
 6  * @param string $version            
 7  * @param string $format            
 8  * @return Ambigous <multitype:, string, mixed>
 9  */
10 function calljava($module, $method, $params , $version = '1.0')
11 {
12     $start = microtime(true);
13     $ret = array(
14         'code' => '999999'
15     );
16     
17     $callurl = geturl($module, $method, $version);
18     if ($callurl) {
19         $postQs = http_build_query($params);
20         $ch = curl_init();
21         curl_setopt($ch, CURLOPT_URL, $callurl);
22         curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
23         curl_setopt($ch, CURLOPT_POST, 1);
24         curl_setopt($ch, CURLOPT_POSTFIELDS, $postQs);
25         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
26         curl_setopt($ch, CURLOPT_TIMEOUT, 60);
27         $output = curl_exec($ch);
28         
29         if ($errno = curl_errno($ch)) {
30             $output = "Error [$errno]: " . curl_error($ch);
31         } else {
32             $ret = json_decode($output, true);
33         }
34         curl_close($ch);
35         $duration = $start - microtime(true);
36         writeLog($callurl, $method, $params, $output, $duration);
37     }
38     return $ret;
39 }

 

2.第二个函数只是将各种接口的地址进行归类

//获取接口调用地址

 

 1 function geturl($module, $method, $version)
 2 {
 3     $callurl = '';
 4     $appKey = '00001';
 5     $sign = '***A9957CCDB2';
 6     switch ($module) {
 7         case 'bidding':
 8             $url = C('INTERFACE_BIDDING_URL') ."/bidKing-rs/router?";
 9             break;
10         case 'auction':
11             $url = C('INTERFACE_AUCTION_URL') ."/bidKing-rs/router?";
12             break;
13         //一堆地址列表
14     }
15     
16     if (! $url) {
17         writeLog('', '', '', '', 0);
18     } elseif (! $method) {
19         writeLog($callurl, '', '', '', 0);
20     } else {
21         $qs = "m=" . $method . "&v=" . $version . "&f=json&ak=" . $appKey . "&s=" . $sign;
22         $callurl = $url . $qs;
23     }
24     return $callurl;
25 }

 

3.第三个函数就比较重要了,虽然简单,但是就是它给接口调用反馈了一个清晰的提示,并且将日志记录到文件中,每个组都可以在浏览器中通过

接口路径查看自己的接口究竟产生了一些什么信息,还能看到是不是自己的错误或者疏漏。

 

  1 /**
  2  *
  3  * @name 记录日志
  4  * @param unknown $url:调用的url地址            
  5  * @param unknown $method:调用的方法            
  6  * @param unknown $request:传参            
  7  * @param unknown $response:返回信息            
  8  * @param unknown $duration:消耗时间            
  9  * @param string $type:日志类型,Info,
 10  *            Warning, Error
 11  */
 12 function writeLog($url, $method, $request, $response, $duration)
 13 {
 14     $uri = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : '';
 15     $serverip = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'unknown';
 16     
 17     $log = "[" . date('Y-m-d H:i:s') . "]";
 18     if (! $url || ! $method || ! $request) {
 19         $log .= "\r\n-------------------------------\r\n";
 20         $log .= "Log Type: User Request Error!!!";
 21         $log .= "\r\n-------------------------------\r\n";
 22         $log .= "Error Message: Some necessary parameters are empty";
 23         $log .= "\r\n-------------------------------\r\n";
 24         $log .= "Solution: \r\ncallurl:" . $url . "\r\nmethod:" . $method . "\r\nrequest:" . var_export($request, true);
 25     } else {
 26         if (! $response) {
 27             $log .= "\r\n-------------------------------\r\n";
 28             $log .= "Log Type: System Response Error!!!";
 29             $log .= "\r\n-------------------------------\r\n";
 30             $log .= "Error Message: Server Response is empty";
 31         } else {
 32             $rjson = json_decode($response, true);
 33             if ($rjson['code'] == 1) {
 34                 $log .= "\r\n-------------------------------\r\n";
 35                 $log .= "Log Type: System Error!!";
 36                 $log .= "\r\n-------------------------------\r\n";
 37                 $log .= "Error Message: " . $rjson['message'];
 38                 $log .= "\r\n-------------------------------\r\n";
 39                 $log .= "Solution: " . $rjson['solution'];
 40             } elseif (in_array($rjson['code'], array(
 41                 8,
 42                 23,
 43                 25,
 44                 27,
 45                 30,
 46                 32,
 47                 33
 48             ))) {
 49                 $log .= "\r\n-------------------------------\r\n";
 50                 $log .= "Log Type: User Request Error!!!";
 51                 $log .= "\r\n-------------------------------\r\n";
 52                 $log .= "Error Message: " . $rjson['message'];
 53                 $log .= "\r\n-------------------------------\r\n";
 54                 $log .= "Solution: " . $rjson['solution'];
 55             } elseif ($rjson['code'] != '000000') {
 56                 $log .= "\r\n-------------------------------\r\n";
 57                 $log .= "Log Type: Error";
 58                 $log .= "\r\n-------------------------------\r\n";
 59                 $log .= "Error Message: " . $rjson['message'];
 60                 $log .= "\r\n-------------------------------\r\n";
 61                 $log .= "Solution: " . $rjson['solution'];
 62             }
 63         }
 64     }
 65     $log .= "\r\n-------------------------------\r\n";
 66     $log .= "REQUEST URI: " . $uri;
 67     $log .= "\r\n-------------------------------\r\n";
 68     $log .= "Call Method: " . MODULE_NAME . '/' . CONTROLLER_NAME . '/' . ACTION_NAME;
 69     $log .= "\r\n-------------------------------\r\n";
 70     $log .= "Interface Url: " . $url. '&'. http_build_query($request);;
 71     $log .= "\r\n-------------------------------\r\n";
 72     $log .= "Interface Method: " . $method;
 73     $log .= "\r\n-------------------------------\r\n";
 74     $log .= "Request Data: \r\n" . var_export($request, true);
 75     $log .= "\r\n-------------------------------\r\n";
 76     $log .= "Response Data: \r\n" . var_export(json_decode($response, true), true);
 77     $log .= "\r\n-------------------------------\r\n";
 78     $log .= "Duration time: " . abs($duration);
 79     $log .= "\r\n-------------------------------\r\n";
 80     $log .= "User Client IP: " . get_client_ip();
 81     $log .= "\r\n-------------------------------\r\n";
 82     $log .= "Server IP: " . $serverip;
 83     $log .= "\r\n-------------------------------\r\n\r\n";
 84     
 85     $logpath = LOG_PATH;
 86     
 87     if (! is_dir($logpath)) {
 88         mkdir($logpath);
 89     }
 90     if(! is_dir($logpath .'/byMember')){
 91         mkdir($logpath.'/byMember');
 92     }
 93     if(! is_dir($logpath .'/byHour')){
 94         mkdir($logpath.'/byHour');
 95     }
 96     if(! is_dir($logpath .'/byInterface')){
 97         mkdir($logpath.'/byInterface');
 98     }
 99     if(! is_dir($logpath .'/byModule')){
100         mkdir($logpath.'/byModule');
101     }
102     $logfile = $logpath . '/byHour/' . date('YmdH') . '.log.txt';
103     $f = fopen($logfile, 'a+');
104     fwrite($f, $log);
105     fclose($f);
106     $logfile = $logpath . '/byInterface/' . $method . '.log.txt';
107     $f = fopen($logfile, 'a+');
108     fwrite($f, $log);
109     fclose($f);
110     $logfile = $logpath . '/byModule/' . MODULE_NAME . '-' . CONTROLLER_NAME . '-' . ACTION_NAME . '.log.txt';
111     $f = fopen($logfile, 'a+');
112     fwrite($f, $log);
113     fclose($f);
114     if(isset($_SESSION['user']['MEMBERID']))
115     {
116         $logfile = $logpath . '/byMember/' . $_SESSION['user']['MEMBERID'].'.log.txt';
117         $f = fopen($logfile, 'a+');
118         fwrite($f, $log);
119         fclose($f);
120     }
121 }

 

 

 

 

posted @ 2015-05-03 10:25  zhgxun  阅读(398)  评论(0编辑  收藏  举报