博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
介绍一个日志记录函数
阅读量:4691 次
发布时间:2019-06-09

本文共 8145 字,大约阅读时间需要 27 分钟。

框架的好处之一是有完整的日志记录系统,但都只是针对框架本身的,比如记录数据库调用信息,记录表单值和框架方法之间的参数和返回值等。但是如果项目之间涉及到跨平台,这个日志系统就显得微乎其微了。比如我之前参加的一个项目,主要是使用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 
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 }

 

 

 

 

转载于:https://www.cnblogs.com/zhgxun/p/4473390.html

你可能感兴趣的文章
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
11.5 内部类
查看>>
Cosine Similarity
查看>>
halt和shutdown 的区别
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>
用户画像展示
查看>>
C#中StreamReader读取中文出现乱码
查看>>
使用BufferedReader的时候出现的问题
查看>>
linux安装图形界面
查看>>
博弈论之入门小结
查看>>
解决IE8下opacity属性失效问题,无法隐藏元素
查看>>
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>