日志分析神器接口文档
接口主要功能:
1、获取线上日志所在目录下的所有日志文档名称
2、获取指定日志内容
接口安全说明:
1、接口文档名为随机生成,以减少别有用心之人的随机试探(自定义接口时,可根据自身情况命名);
2、每次请求均需验证密钥(密钥为软件随机生成,无规律)
自定义接口要求
1、开发语言不限
2、请求与返回参数类型为Json格式
3、日志目录的绝对路径和密钥必须存在于代码中
具体请求参数与返回数据参照如下:
请求参数
{ verifycode : '5412ad5asdf4', //校验码(由软件生成后,赋值到自定义接口文档的密钥变量中,以便每次请求验证使用), retype : 'dir', //请求类型('dir':请求目录, 'cont':请求日志内容), logfile : 'www-2023-01-01.log', //日志文档名(请求日志内容时必填,包含格式), position : 0, //读取文档起始位置(请求日志内容时必填) limit : 1000, //获取条数(请求日志内容时必填) }
返回参数(Json):
{ 'status':0, //返回状态码 ( 0:失败,200:成功) 'data':[], //数据数组 (目录:[['日志名称.log','file','日志大小字节'],***] 日志内容:['一行日志','再一行日志',***]) 'message':'' //返回状态提示语 }
其它说明:
不清除的地方可参考以下PHP接口文档代码,每行均做了注释
//============PHP代码实列==========================
//日志目录绝对路径 $logDir = '{!-logdir-}'; //密钥 $verifyCode = '{!-verifycode-}'; //默认返回数据格式 $reArr = ['status'=>0,'data'=>[],'message'=>'']; //接收参数(verifycode:校验码,retype:请求类型(dir,cont),logfile:日志文档名,position:读取文档起始位置,limit:获取条数 $paramArr = json_decode(file_get_contents('php://input'),true); //密钥 $inputVerifyCode = isset($paramArr['verifycode'])?$paramArr['verifycode']:''; if($inputVerifyCode!=$verifyCode){ //验证密钥失败 $reArr['message'] = '校验失败'; }else{ $reArr['status']=200;//校验成功 //请求类型 $reType = isset($paramArr['retype'])?$paramArr['retype']:''; //请求目录 if($reType=='dir'){ $logFileList = []; //获取目录下的信息 $dirList = scandir($logDir); //遍历目录 foreach($dirList as $fileName){ $newFilePath = $logDir.DIRECTORY_SEPARATOR.$fileName; //如果是文档则继续 if(is_file($newFilePath)){ //获取日志大小 $logSize = filesize($newFilePath); //组合成特有格式,并追加到数组变量中 $logFileList[] = array($fileName,'file',$logSize); } } $reArr['data'] = $logFileList; $reArr['message'] = '目录获取成功'; //请求内容 }else if($reType=='cont'){ //获取参数 $fileName = isset($paramArr['logfile'])?$paramArr['logfile']:''; $position = isset($paramArr['position'])?$paramArr['position']:0; $limit = isset($paramArr['limit'])?$paramArr['limit']:0; $rContent = ''; $contList = []; //组合新路径 $newFilePath = $logDir.DIRECTORY_SEPARATOR.$fileName; //每次读取量,避免日志太大卡住 $maxReadLen = 4194304; if(is_file($newFilePath)){ $fo = fopen($newFilePath,'r'); // 移动文件指针到指定位置 fseek($fo, $position); while (!feof($fo)) { // 每次读取4194304个字节 $content = fread($fo, $maxReadLen); $rContent .= $content; //将内容以每行换行符处,转换为数组 $contList = explode(PHP_EOL,$rContent); //如果超过获取量,则停止继续读取文档 if($limit>0 and count($contList)>$limit){ //截取数组,避免最后一条日志不完整 $contList = array_slice($contList,0,$limit); break; } } fclose($fo); // 关闭文件 } //获取当次获取总量 $getTotal = strlen(implode(PHP_EOL,$contList)); $reArr['total'] = $getTotal; //去除空元素列表 $reArr['data'] = array_values(array_filter($contList)); $reArr['message'] = '日志获取成功'; } } //将数组转换为Json并输出 echo json_encode($reArr); exit;