laravel5.5 PHP脚本执行Linux语句

47 篇文章 4 订阅
17 篇文章 2 订阅

为了方便自己查看每天记录的日志,写了一个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 函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值