laravel 自定义日志目录

  • Post author:
  • Post category:其他


环境:laravel5 以上 ,新版的 laravel8 不支持(

laravel8日志类

laravel自带的Log::info日志功能有限,只能单个文件记录或者按照日期记录。

实际开发过程中,经常需要按功能来记录日志。为了方便,使用Logger自定义封装一些日志功能。

Logs日志类实际项目中使用了两三年了,还是相对稳定。

<?php
/**
 * laravel的日志类不够用,根据项目日志习惯二次封装Monolog日志类
 */

namespace App\Tools;

use Illuminate\Support\Facades\DB;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

class Logs
{

    // 文件记录类型 1:文件目录/日期/文件名  2:所有日志一个文件夹

    public function __construct()
    {

    }


    /**
     * @param $message
     * @param array $data
     * @param string $filename
     * @param string $isDate 是否按月份分文件夹
     */
    private static function _save($message, $data = [], $filename = 'log', $isDate = false)
    {
        $log = new Logger('mylog');
        if (PHP_SAPI == 'cli') {
            // 命令行访问脚本的,加一个cli标识和用户浏览器访问的区分开
            $filename .= '_cli';
        }

        $filename = $filename . '.log';

        if ($isDate) {
            // 是否要按日显示
            $path = storage_path('logs/' . date('Ym'));
        } else {
            $path = storage_path('logs/');
        }

        // 有时候运维没给号权限,容易导致写入日志失败
        self::mkDirs($path);

        $path = $path . '/' . $filename;
        if (gettype($data) != 'array') {
            $message .= ":" . $data;
            $data = [];
        }

        $log->pushHandler(new StreamHandler($path, Logger::INFO));
        $log->addInfo($message, $data);

//        $log->addError($message, $data);
    }

    public static function info($message, $data = [], $filename = 'info', $isDate = false)
    {
        self::_save($message, $data, $filename,$isDate);
    }

    /**
     * @param $message
     * @param array $data
     * @param string $filename
     */
    public static function error($message, $data = [], $filename = 'error')
    {
        // 错误日志不会太多,按单文件记录可以了,默认$isDate=false
        self::_save($message, $data, $filename, false);
    }


    /**
     * 给日志文件夹权限
     * @param $dir
     * @param int $mode
     * @return bool
     */
    public static function mkDirs($dir, $mode = 0777)
    {

        if (is_dir($dir) || @mkdir($dir, $mode)) {
            return TRUE;
        }
        if (!self::mkdirs(dirname($dir), $mode)) {
            return FALSE;
        }
        return @mkdir($dir, $mode);
    }


    /**
     * 记录laravel sql执行
     * @param string $file_name
     * @param bool $is_date
     */
    public static function sql($file_name = 'sql',$is_date = false)
    {
        DB::listen(function ($sql) use($file_name,$is_date) {
            foreach ($sql->bindings as $i => $binding) {
                if ($binding instanceof \DateTime) {
                    $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
                } else {
                    if (is_string($binding)) {
                        $sql->bindings[$i] = "'$binding'";
                    }
                }
            }
            $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);
            $query = vsprintf($query, $sql->bindings);
            Logs::info('sql:', $query, $file_name, $is_date);
        });
    }
}

在业务层调用:

Logs::info('AAA',['a','b'],'order',true);
Logs::error('AAA',['a','b']);

// 记录执行sql到文件,方便调试
// 在User 查询之前,添加代码 Logs::sql();
Logs::sql();

User::find(1);

// sql.log 文件生成sql:
[2020-08-18 14:28:15] mylog.INFO: sql::select * from `qs_2c_user` where `qs_2c_user`.`userid` = 1 limit 1 [] []

生成日志文件



版权声明:本文为qq_24935119原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。