php tp框架 自定义日志
调用方法
$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); } public function custom($file_name, $msg, $data = '', $detailed = true, $is_data = false) { if (empty(self::$path)) return true; $data = self::chunkData($msg, $data, $detailed); return self::$obj->custom($data, $file_name, $is_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: 自定义日志目录信息 * DateTime: 2023/9/18 11:31 * @return array[] */ public static function settingLogConfig($type) { // if (ROOT_PATH == 'ROOT_PATH') if (!defined('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: 删除文件 * @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); } /** * note: 自定义路径日志 * @param String $data 日志数据 * @param String $file_name 文件名称 * @param bool $is_date 是否开启日期 * @return Boolean * user: handd * datetime: 2024/8/1下午3:20 */ public function custom($data, $file_name, $is_date = true) { // 获取日志文件 $log_file = $this->get_log_file(); $log_file_arr = explode('/', $log_file); $log_name = $file_name.'.log'; if ($is_date) { $log_name = $file_name.'-'.date('Ymd').'.log'; } 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'.PHP_EOL, $dt->format('Y-m-d H:i:s'), $data); // 写入日志文件 if($is_create) { $res = file_put_contents($log_file, PHP_EOL.$log_data, FILE_APPEND); file_put_contents($log_file, PHP_EOL.'---------------------------------------------------------------'.PHP_EOL, FILE_APPEND); chmod($log_file, 0777); return $res; } return false; } /** * 写入日志 * @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) { $res = file_put_contents($log_file, PHP_EOL.$log_data, FILE_APPEND); file_put_contents($log_file, PHP_EOL.'---------------------------------------------------------------'.PHP_EOL, FILE_APPEND); chmod($log_file, 0777); return $res; } return false; } /** * 创建日志目录 * @param String $log_path 日志目录 * @return Boolean */ private function create_log_path($log_path) { if(!is_dir($log_path)) { $res = @mkdir($log_path, 0777, true); if ($res) { //循环给生成的目录权限 $log_path_array = explode('runtime', $log_path); $log_path1 = $log_path_array[0].'runtime'; $path = end($log_path_array); $path = trim($path, '/'); $path_array = explode('/', $path); $url = []; foreach ($path_array as $k => $v) { $temp_url = ''; for ($i=0; $i<$k+1; $i++) { $temp_url .= '/'.$path_array[$i]; } $url[] = $log_path1.$temp_url; } foreach ($url as $v) { chmod($v, 0777); } } } 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); } }