php tp框架 自定义日志

发布时间 2023-12-14 15:31:28作者: -韩

调用方法

 $file_log = [
     'order_id' => 123,
];
(new Logs('log'))->infos('日志文案', $file_log);

[2023-12-14 15:24:13] [INFO] [log] {"msg":"日志文案","params":{"order_id":123},"file":null,"function":"getFineComment","class":"app\\api\\controller\\v1\\Test","args":[[]]}

 

 

logs.php

<?php

namespace app\common\logging;

/**
 * Notes: 日志操作入口
 * @package app\common\logging
 * @class Logs
 * @author Hdd 2023-09-13
 */
class Logs
{
    private static $obj;


    private static $default_log = 'default_log';


    const str_replace  = 'replace';

    private static $path;


    public function __construct($type='')
    {
        if (empty($type)) $type = self::$default_log;

        $type = strtolower($type);
        $config_setting = self::settingLogConfig($type);
        $config = $config_setting['log_path_setting'];
        self::$path = $config_setting['path'];

        LogCache::set_config($config);
        self::$obj = LogCache::get_logger($type);
    }


    public function infos($msg, $data = '', $detailed = true)
    {
        if (empty(self::$path)) return true;
        $data = self::chunkData($msg, $data, $detailed);
        return self::$obj->info($data);
    }

    public function warns($msg, $data = '', $detailed = true)
    {
        if (empty(self::$path)) return true;
        $data = self::chunkData($msg, $data, $detailed);
        return self::$obj->warn($data);
    }


    public function errors($msg, $data = '', $detailed = true)
    {
        if (empty(self::$path)) return true;
        $data = self::chunkData($msg, $data, $detailed);
        return self::$obj->error($data);
    }



    private static function chunkData($msg, $content, $detailed)
    {
        $logMsg = [
            'msg' => $msg,
            'params' => $content,
        ];
        //详细日志模式包括文件名,类名,自动传参
        if ($detailed)
        {
            $trace = debug_backtrace();
            if (!empty($trace[1])) {
                $source = $trace[2];
                $logMsg['file']     = $source['file'];
                $logMsg['function'] = $source['function'];
                $logMsg['class']    = $source['class'];
                if (!($source['function'] == 'fire' || $source['function'] == 'execute')) {
                    $logMsg['args']    = $source['args'];
                }
            }
        }
        return json_encode($logMsg, JSON_UNESCAPED_UNICODE);
    }

    /**
     * Notes: 自定义日志目录信息
     * Author : Hdd
     * DateTime: 2023/9/18 11:31
     * @return array[]
     */
    public static function settingLogConfig($type)
    {
        if (ROOT_PATH == 'ROOT_PATH')
        {
            $path = dirname(__DIR__);
            if(strpos($path,'application') !== false)
            {
                $pathArr = explode('application', $path);
                if (!empty($pathArr[0])) {
                    $path = $pathArr[0]. 'runtime/';
                }else{
                    $path = '';
                }
            }else{
                $path = '';
            }
        }else{
            $path = ROOT_PATH.'runtime/';
        }

        $type_arr = ['default_log', 'queue', 'command'];

        $log_path_setting = [];
        foreach ($type_arr as $v) {
            $log_path_setting[$v] = [
                'log_path'  =>  $path.$v.'/', // 日志根目录
                'log_file'  =>  $v.'-'.self::str_replace.'-'.date('Ymd').'.log',  // 日志文件
                'format'    =>  'Ym',    // 日志自定义目录,使用日期时间定义
            ];
        }

        if (!in_array($type, $type_arr)) {
            $log_path_setting[$type] = [
                'log_path'  =>  $path.$type.'/', // 日志根目录
                'log_file'  =>  $type.'-'.self::str_replace.'-'.date('Ymd').'.log',  // 日志文件
                'format'    =>  'Ym',    // 日志自定义目录,使用日期时间定义
            ];
        }

        return ['path'=>$path, 'log_path_setting' => $log_path_setting];
    }

    /**
     * Notes: 删除文件
     * Author : Hdd
     * @param $dir_path
     * @return bool
     * 请注意,删除文件和目录是一个敏感操作,请谨慎使用,并确保有足够的权限和合理的文件操作逻辑
     */
    public function delFile($dir_path)
    {
        if (self::deleteDirectory($dir_path)) {
            return true;
        } else {
            return false;
        }
    }

    private function deleteDirectory($dir)
    {
        if (!is_dir($dir)) {
           //删除文件
            return unlink($dir);
        }
        //删除目录
        $files = array_diff(scandir($dir), array('.', '..'));
        foreach ($files as $file) {
            (is_dir("$dir/$file")) ? self::deleteDirectory("$dir/$file") : unlink("$dir/$file");
        }
        return rmdir($dir);
    }


}

 

logCache.php

<?php

namespace app\common\logging;


/**
 * Notes: 日志写入
 * @package app\common\model
 * @class LogCache
 * @author Hdd 2023-09-13
 *
 *  Description:
 *  1.自定义日志根目录及日志文件名称。
 *  2.使用日期时间格式自定义日志目录。
 *  3.自动创建不存在的日志目录。
 *  4.记录不同分类的日志,例如信息日志,警告日志,错误日志。
 *  5.可自定义日志配置,日志根据标签调用不同的日志配置。
 *
 *  Func
 *  public  static set_config 设置配置
 *  public  static get_logger 获取日志类对象
 *  public  info              写入信息日志
 *  public  warn              写入警告日志
 *  public  error             写入错误日志
 *  private add               写入日志
 *  private create_log_path   创建日志目录
 *  private get_log_file      获取日志文件名称
 *  public static logType     自定义日志配置
 */

class LogCache
{
    private $_log_path = '.';    // 日志文件
    private $_log_file = 'default.log';    // 日志自定义目录
    private $_format = 'Y/m/d';    // 日志标签
    private $_tag = 'default';    // 总配置设定
    private static $_CONFIG;

    /**
     * 设置配置
     * @param  Array $config 总配置设定
     */
    public static function set_config($config=array())
    {
        self::$_CONFIG = $config;
    }

    /**
     * 获取日志类对象
     * @param  Array $config 总配置设定
     * @return Obj
     */
    public static function get_logger($tag='default')
    {
        // 根据tag从总配置中获取对应设定,如不存在使用default设定
        $config = isset(self::$_CONFIG[$tag])? self::$_CONFIG[$tag] : (isset(self::$_CONFIG['default'])? self::$_CONFIG['default'] : array());
        // 设置标签
        $config['tag'] = $tag!='' && $tag!='default'? $tag : '-';
        // 返回日志类对象
        return new LogCache($config);

    }


    /**
     * 初始化
     * @param Array $config 配置设定
     */
    public function __construct($config=array())
    {
        // 日志根目录
        if(isset($config['log_path'])){
            $this->_log_path = $config['log_path'];
        }
        // 日志文件
        if(isset($config['log_file'])){
            $this->_log_file = $config['log_file'];
        }
        // 日志自定义目录
        if(isset($config['format'])){
            $this->_format = $config['format'];
        }
        // 日志标签
        if(isset($config['tag'])){
            $this->_tag = $config['tag'];
        }
    }


    /**
     * 写入信息日志
     * @param  String $data 信息数据
     * @return Boolean
     */
    public function info($data)
    {
        return $this->add('INFO', $data);
    }


    /**
     * 写入警告日志
     * @param  String  $data 警告数据
     * @return Boolean
     */
    public function warn($data)
    {
        return $this->add('WARN', $data);
    }


    /**
     * 写入错误日志
     * @param  String  $data 错误数据
     * @return Boolean
     */
    public function error($data)
    {
        return $this->add('ERROR', $data);
    }

    /**
     * 写入日志
     * @param  String  $type 日志类型
     * @param  String  $data 日志数据
     * @return Boolean
     */
    private function add($type, $data)
    {
        // 获取日志文件
        $log_file = $this->get_log_file();

        $log_file_arr = explode('/', $log_file);
        $log_name = str_replace(Logs::str_replace, strtolower($type), end($log_file_arr));
        array_pop($log_file_arr);
        $log_file_arr[] = $log_name;
        $log_file = str_replace('//', '/', implode('/', $log_file_arr));

        // 创建日志目录
        $is_create = $this->create_log_path(dirname($log_file));

        // 创建日期时间对象
        $dt = new \DateTime();
        // 日志内容
        $log_data = sprintf('[%s] %-5s %s %s'.PHP_EOL, $dt->format('Y-m-d H:i:s'), "[$type]", "[$this->_tag]", $data);

        // 写入日志文件
        if($is_create)
        {
            return file_put_contents($log_file, PHP_EOL.$log_data, FILE_APPEND);
        }

        return false;

    }

    /**
     * 创建日志目录
     * @param  String  $log_path 日志目录
     * @return Boolean
     */
    private function create_log_path($log_path)
    {
        if(!is_dir($log_path))
        {
            return @mkdir($log_path, 0777, true);
        }
        return true;
    }

    /**
     * 获取日志文件名称
     * @return String
     */
    private function get_log_file()
    {
        // 创建日期时间对象
        $dt = new \DateTime();
        // 计算日志目录格式
        return sprintf("%s/%s/%s", $this->_log_path, $dt->format($this->_format), $this->_log_file);
    }





}