为了方便自己查看每天记录的日志,写了一个PHP脚本。
场景是这样的:在laravel项目里面storage/logs目录下,每天会记录请求第三方接口的日志,但是请求的第三方有多个,并且每个第三方请求的日志都会记录到一个文件中,例如2020-08-14请求四个第三方,那么在laravel-2020-08-14.log中就会记录这四个第三方的请求日志,和第三方返回的接口信息。
1、laravel脚本用的是任务调度。执行下面的命令,会在app/console/commands目录下,创建一个GetLog.php文件
php artisan make:command GetLog
2、脚本的内容如下
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class GetLog extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'get:log';
/**
* The console command description.
*
* @var string
*/
protected $description = '获取日志文件中指定产品的指定内容';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->getLogInfo();
}
/**
* 获取日志文件中的内容
*/
private function getLogInfo(){
//获取昨天日志文件名称
$logName = 'laravel-'.date("Y-m-d",strtotime("-1 day")).'.log';
//获取产品日志查询语句
$selectSql = $this->getProductSelectSql($logName);
foreach($selectSql as $key => $value){
exec($value, $result, $var);
if($var != 0){
continue;
}
//去除返回结果左右空格
foreach($result as $res_k => $res_v){
$result[$res_k] = trim($res_v,' ');
}
//将结果记录到指定目录
$monolog = \Log::getMonolog();
$monolog->popHandler();
$logPath = 'logs/logscount/'.date('Y-m-d').'.log';
\Log::useFiles(storage_path($logPath),'info');
\Log::info([$key=>$result]);
//删除每次执行的结果,否则当前执行的查询会追加到上次执行的结果集里面
unset($result);
}
}
/**
* 获取每个产品查询日志的语句
* @param string $logName [待查询的日志文件名称]
* @return array $selectSql [产品查询日志语句]
*/
private function getProductSelectSql($logName){
// grep 'jz' storage/logs/laravel-2020-08-13.log | grep -v '请求成功' | awk '{split($4,a,"message");print a[2]}' | sort | uniq -c | sort -rn
// grep 'xy' storage/logs/laravel-2020-08-13.log | awk '{split($4,a,"errStr");split(a[2],b,",");print b[1]}' | sort | uniq -c | sort -rn
// grep 'ms' storage/logs/laravel-2020-08-13.log | grep -v 'S00001' | grep -v 'S00000' | awk '{split($4,a,"message");split(a[2],b,",");print b[1]}' | sort | uniq -c | sort -rn
// grep 'tc' storage/logs/laravel-2020-08-13.log | grep -v '成功' | grep 'respMsg' | awk '{split($4,a,"respMsg");print a[2]}' | sort | uniq -c | sort -rn
$selectSql = [
'jz' => "grep 'jz' storage/logs/$logName | grep -v '请求成功' | awk "."'{split($4,a,".'"message"'.");print a[2]}'"." | sort | uniq -c | sort -rn",
'xy' => "grep 'xy' storage/logs/$logName | awk "."'{split($4,a,".'"errStr"'.");split(a[2],b,".'","'.");print b[1]}'"." | sort | uniq -c | sort -rn",
'ms' => "grep 'ms' storage/logs/$logName | grep -v 'S00001' | grep -v 'S00000' | awk "."'{split($4,a,".'"message"'.");split(a[2],b,".'","'.");print b[1]}'"." | sort | uniq -c | sort -rn",
'tc' => "grep 'tc' storage/logs/$logName | grep -v '成功' | grep 'respMsg' | awk "."'{split($4,a,".'"respMsg"'.");print a[2]}'"." | sort | uniq -c | sort -rn"
];
return $selectSql;
}
}
3、脚本里面的核心内容,就是 PHP exec函数的使用,请参考官方文档 php 函数