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

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

介绍一个日志记录函数相关推荐

  1. 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被

    2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出"方法 metho ...

  2. php调试和日志记录函数

    网站程序开发过程经常需要调试,发布阶段也需要记录运行日志,方便发现问题和还原事件.这就要求有调试和日志记录功能. 下面分别写了用于调试的函数和用于记录错误的函数. 使用方法很简单,且自动根据日期生成日 ...

  3. php日志记录函数,php记录日志函数(DLOG)

    直接上源码: 配置2个参数: 'DLOG_DIR'=>'./log/' ,//后台程序日志存放目录 'DLOG_LEVEL'=>array('debug','run','error','f ...

  4. keil debug如何在watch直接修改变量值_python日志记录系列教程,内置logging模块(一),直接使用logging模块的基础日志记录

    前言:成熟的软件开发不可避免的要进行日志记录,python内置模块logging提供了强大的日志记录能力,本文将从多个角度,由浅入深的介绍logging的常见使用方法和一些基本概念,本此系列文章分为两 ...

  5. Elmah 日志记录组件

    http://www.cnblogs.com/jys509/p/4571298.html 简介 ELMAH(Error Logging Modules and Handlers)错误日志记录模块和处理 ...

  6. MVC使用 Elmah 日志记录组件

    简介 ELMAH(Error Logging Modules and Handlers)错误日志记录模块和处理程序,是一种应用广泛的错误日志工具是完全可插拔.它可以动态添加到一个正在运行的ASP.NE ...

  7. 基于.NetCore3.1系列 —— 日志记录之初识Serilog

    前言 对内置日志系统的整体实现进行了介绍之后,可以通过使用内置记录器来实现日志的输出路径.而在实际项目开发中,使用第三方日志框架(如:Log4Net.NLog.Loggr.Serilog.Sentry ...

  8. hbase记录日志wal_SQL Server事务日志–第1部分–日志结构和预写日志记录(WAL)算法

    hbase记录日志wal SQL Server transaction log is one of the most critical and in the same time one of the ...

  9. easylogging++的那些事(四)源码分析(二)日志记录宏(一)CLOG宏(一)宏展开

    CLOG 宏展开 Info 日志宏 CLOG(INFO, xxx) Trace 日志宏 CLOG(TRACE, XXX) Debug 日志宏 CLOG(DEBUG, XXX) Fatal 日志宏 CL ...

  10. 如何在 Java 中进行日志记录

    您可以使用本指南为您的应用程序发现.理解和使用正确的 Java 日志库,例如 Log4j2.Logback 或 java.util.logging. 日志"似乎"是一个非常简单的主 ...

最新文章

  1. 为什么浏览器不能跨域
  2. WEB入门之十九 UI
  3. 深度学习(三十七)——CenterNet, Anchor-Free, NN Quantization
  4. centos7 安装小记
  5. 安装cocoaPod 的问题
  6. DHCP服务、NFS、vsftp服务的简单搭建
  7. jQuery 树形控件 TreeView 的 Bug
  8. springMVC文件上传的三种方法
  9. Bit,Byte,WORD,DWORD区别和联系
  10. java 僵尸进程_僵尸进程ZOMBIE
  11. 飞控计算机的作用,自动飞控计算机测试系统
  12. 【福利贴】教你如何移动联通电信免流
  13. java opennlp_在java中使用opennlp提取名词短语
  14. 【Python】ValueError: Invalid format specifier
  15. maya正交视图锁定与解锁
  16. 免费实时汇率查询Api接口
  17. 你绝对没用过的三电源切换电路
  18. 聊聊端口映射和内网穿透
  19. 夏培肃完成了第一台电子计算机运算器,,学生支部述职报告2017
  20. 计算机考研题目汇总【持续更新】

热门文章

  1. 媒体管理工具Media Encoder 2022 for Mac
  2. Capture One Pro 22 for Mac(RAW图像处理软件)
  3. noteless的博客导航页 所有文章的导航页面
  4. Django生命周期,FBV,CBV
  5. mysql 新增字段 添加字段 删除字段 修改字段 级联删除 级联更新 等
  6. 网工必考的8个dos命令
  7. 几篇关于 Redis集群方面的知识学习
  8. 瞬间几千次的重复提交,我用 SpringBoot+Redis 扛住了~
  9. 为什么要在2021年放弃Jenkins?我已经对他失去耐心了...
  10. 最新消息,网易公司内部开始使用昵称!学阿里?