hehex / hehep-hlogger
hehep-hlogger 是一个PHP日志基础组件,仿python logging模块,支持处理器、过滤器、格式器、上下文
v1.0.0
2024-08-31 07:22 UTC
Requires
- php: >=7.1
This package is auto-updated.
Last update: 2025-04-29 01:36:41 UTC
README
介绍
- hehep-hlogger 是一个PHP 日志工具组件,仿python logging模块
- 支持处理器、过滤器、格式器、上下文
安装
- gitee下载:
git clone git@gitee.com:chinahehex/hehep-hlogger.git
- github下载:
git clone git@github.com:chinahehex/hehep-hlogger.git
- 命令安装:
composer require hehex/hehep-hlogger
组件配置
$conf = [ 'defaultLogger'=>"hehe", // 预定义上下文 'contexts'=>[ 'default'=>[ 'class'=>'hehe\core\hlogger\contexts\TraceContext', 'skipClasses'=>[],// 跳过的类名, 'skipFuns'=>[],// 跳过的函数名, ] ], // 预定义日志过滤器 'filters'=>[ 'info'=>[ //'class'=>'',// 过滤器类名,未填则默认为LogFilter 'levels'=>['info'], 'categorys'=>['admin\controller*'] ] ], // 预定义日志格式器 'formatters'=>[ 'default'=>[ //'class'=>'',// 消息格式器类名,未填则默认为LogFormatter 'tpl'=>'{date:Y-m-d:H:i} :{msg},file:{file}, line:{line},{class}->{fn} {n}', ] ], // 预定义日志处理器 'handlers'=>[ 'default'=>[ 'class'=>'FileHandler', 'logFile'=>'/home/hehe/www/logs/hehep.log', 'formatter'=>'default' ] ], // 预定义日志记录器 'loggers'=>[ 'hehe'=>[ 'bufferLimit'=>0,// 缓冲日志数量 'handlers'=>['default'], 'levels'=>['info','error','warning','exception','debug'],// 设置filter 后,此设置项将无效 'categorys'=>['admin\controller\*'],// 设置filter 后,此设置项将无效 'filter'=>'info',// 定义过滤器 'formatter'=>'default',// 定义日志格式器 'context'=>['default'],// 定义上下文 ], ] ];
基本示例
- 记录日志
use hehe\core\hlogger\LogManager; use hehe\core\hlogger\Log; // 创建日志管理器 $hlogger = new LogManager([]); // 记录日志 $hlogger->info('info log message'); $hlogger->error('error log message'); // 设置默认"default"处理器参数 Log::setHandler('default',['logFile'=>'/home/hehe/www/logs/hehep.log']); Log::info('info log message'); Log::error('error log message');
日志管理器
- 说明
用于管理日志相关的操作,比如
配置日志处理器,日志格式器,日志过滤器,日志记录器,
创建日志记录器,日志处理器,日志格式器,志过滤器的对象,
记录不同级别日志
- 日志管理器示例
use hehe\core\hlogger\LogManager; use hehe\core\hlogger\Log; // 创建日志管理器 $hlog = new LogManager([]); // 默认日志记录器记录日志 $hlog->info('info log message'); $hlog->error('error log message'); // 获取日志记录器hehe,单例对象 $heheLogger = $hlog->getLogger('hehe'); // 创建新日志记录器 $heheLogger = $hlog->newLogger('hehe'); // 创建日志过滤器 $levelFilter = $hlog->levelFilter('error,info'); $heheLogger->addFilter($levelFilter); // 创建日志处理器 $fileHandler = $hlog->fileHandler('/home/hehe/www/logs/hehep.log'); $heheLogger->addHandler($fileHandler); // 创建日志格式器 $lineFormatter = $hlog->lineFormatter('{date:Y-m-d:H:i},{level},{userid} :{msg} ,file:{file}, line:{line},{class}->{fn}{n}'); $heheLogger->setFormatter($lineFormatter); // 新增上下文变量 $heheLogger->addContext(function(){ return [ 'userid'=>1 ]; }); // 写入日志 $heheLogger->info('info log message'); $heheLogger->error('error log message');
- 预定义配置
use hehe\core\hlogger\LogManager; use hehe\core\hlogger\Log; // 创建日志管理器 $hlog = new LogManager([]); // 设置默认"default"处理器参数 $hlog->setHandler('default',['logFile'=>'/home/hehe/www/logs/xxxx.log']); // 设置名称为“hehe”格式器 $hlog->setFormatter('hehe',[ 'class'=>'lineFormatter', 'tpl'=>'{date:Y-m-d:H:i} :{msg},file:{file}, line:{line},{class}->{fn} {cate} {n}' ]); // 设置名称为“hehe”日志过滤器 $hlog->setFilter('hehe',[ 'levels'=>'error,info', 'categorys'=>'admin\controller*', ]); // 设置名称为“hehe”日志处理器 $hlog->setHandler('hehe',[ 'class'=>'FileHandler', 'logFile'=>'/home/hehe/www/logs/xxxx.log', 'formatter'=>'hehe', //'filter'=>'hehe' ]); // 设置名称为“hehe”日志记录器 $hlog->setLogger('hehe',[ 'handlers'=>'hehe', 'filters'=>'hehe', 'levels'=>'error,info', ]); // 获取预定义hehe日志记录器单例对象 $heheLogger = $hlog->getLogger('hehe'); // 获取预定义hehe日志记录器新对象 $heheLogger = $hlog->newLogger('hehe'); // 写入日志 $heheLogger->error('error log message');
日志记录器
- 说明
类名:hehe\core\hlogger\base\Logger
作用:用于记录日志,可以设置日志级别,日志过滤器,日志处理器,
属性:
'bufferLimit'=>0,// 缓冲日志数量
'handlers'=>['default'],// 日志处理器
'levels'=>['info','error','warning','debug'],// 设置允许的消息级别
'categorys'=>['admin\controller*'],// 设置允许的日志类别
'filter'=>'info',// 定义过滤器
'formatter'=>'default',// 定义日志格式器
- 创建日志记录器
use hehe\core\hlogger\LogManager; $hlog = new LogManager([]); // 获取预定义hehe日志记录器单例对象 $heheLogger = $hlog->getLogger('hehe'); // 获取预定义hehe日志记录器新对象 $heheLogger = $hlog->newLogger('hehe'); // 获取一个空的日志记录器对象 $heheLogger = $hlog->newLogger(); $heheLogger = $hlog->newLogger([ 'bufferLimit'=>2, 'levels'=>'error,info', 'categorys'=>'',// 'admin\controller*' 'filters'=>'default,hehe', 'handlers'=>'default,hehe', ]); // 记录器新增日志过滤器 $filter = $hlog->levelFilter('error,info'); $heheLogger->addFilter($filter); // 记录器新增日志处理器 $handler = $hlog->fileHandler('user/xxx.log'); $heheLogger->addHandler($handler); // 设置记录器日志格式器 $hlogger->setFormatter($hlog->lineFormatter('{date:Y-m-d:H:i},{level},:{msg} ,file:{file}, line:{line},{class}->{fun}{n}')); // 记录日志 $heheLogger->info('info log message');
日志消息对象
- 说明
类名:hehe\core\hlogger\base\Message
作用:用于存储日志消息,级别,上下文对象
- 示例代码
use hehe\core\hlogger\base\Message; $msg = new Message(); // 获取原始日志字符串 $msg->getMsg(); // 获取日志经过格式化处理后的日志字符串 $msg->getMessage(); // 获取日志级别 $msg->getLevel(); // 获取上下文对象 $context = $msg->getContext(); // 获取上下文对象值 $pid = $context->getValue('pid'); // 增加上下文对象值 $context->addValue('username','hehe'); $context->addValue('userid',function(){ // 获取用户id }); // $context->addValue('userid',['类对象','对象方法名']); // 获取用户传入的额外参数,如Log::error("error message",['id'=>1]) $context->getExtra();
日志处理器
- 说明
基类:hehe\core\hlogger\handlers\LogHandler
作用:持久化日志信息,比如文件处理器,数据库处理器,邮件处理器等等
全局属性:
'filter'=>'',// 日志过滤器
'formatter'=>'',// 日志格式器
预定义处理器
use hehe\core\hlogger\LogManager; $conf = [ // 预定义日志处理器定义 'handlers'=>[ // 日志文件处理器 'default'=>[ 'class'=>'FileHandler', 'logFile'=>'/home/hehe/www/logs/hehep.log',// 日志文件 'filter'=>'',// 日志过滤器 'formatter'=>'default'// 日志格式器 ], 'default1'=>[ 'class'=>'FileHandler', 'logFile'=>'/home/hehe/www/logs/hehep.log',// 日志文件 'filter'=>[// 日志过滤器 'levels'=>['error'], 'categorys'=>['admin\controller*'] ], 'formatter'=>[// 日志格式器 'tpl'=>'{date:Y-m-d:H:i} :{msg} ,file:{file}, line:{line},{class}->{fun} {n}', ] ] ], // 预定义其他配置 ];
自定义处理器
namespace hehe\core\hlogger\handlers; use hehe\core\hlogger\base\LogHandler; use hehe\core\hlogger\base\Message; class FileHandler extends LogHandler { // 构造函数 public function __construct(string $logFile = '',array $propertys = []) { $this->logFile = $logFile; parent::__construct($propertys); } // 同时处理多条日志消息 public function handleMessages(array $messages) { foreach ($messages as $message) { $this->handleMessage($message); } } // 处理日志消息 public function handleMessage(Message $message):void { // 获取格式化后消息 $log_format_msg = $message->getMessage(); // 获取原始日志消息 $raw_msg = $message->getMsg(); // 获取日志上下文对象 $context = $message->getContext(); // 获取当前进程ID $pid = $context->getValue('pid'); // 增加上下文对象值 $context->addValue('username','hehe'); $context->addValue('userid',function(){ // 获取用户id }); // $context->addValue('userid',['类对象','对象方法名']); // 获取用户传入的额外参数,如Log::error("error message",['id'=>1]) $context->getExtra(); } }
创建处理器对象
use hehe\core\hlogger\LogManager; $hlog = new LogManager([]); $logger = $hlog->newLogger(); // 创建预定义“default1”日志处理器 $handler = $hlog->newHandler('default1'); // 创建空的日志处理器对象 $handler = $hlog->newHandler(); $handler->addFilter($hlog->levelFilter('error,info')); $handler->setFormatter($hlog->lineFormatter('{date:Y-m-d:H:i} :{msg} ,file:{file}, line:{line},{class}->{fn} {n}')); $logger->addHandler($handler); // 记录日志 $logger->error('error log message');
可用处理器集合
文件处理器
- 说明
基类:hehe\core\hlogger\handlers\FileHandler
属性:
'logFile'=>'',// 日志文件
'useLock'=>false,// 是否使用文件锁(flock),默认为false
- 示例代码
use hehe\core\hlogger\LogManager; $hlog = new LogManager(); $logger = $hlog->newLogger(); // 创建处理器, 默认日志文件为/home/hehe/www/logs/hehep.log, $handler = $hlog->fileHandler('/home/hehe/www/logs/hehep.log'); $handler = $hlog->fileHandler([ 'logFile'=>'/home/hehe/www/logs/hehep.log', 'useLock'=>false,// 是否使用文件锁(flock),默认为false ]); $logger->addHandler($handler); $logger->info('info log message');
文件大小轮转处理器
- 说明
类名:hehe\core\hlogger\handlers\ByteRotatingFileHandler, 继承自RotatingFileHandler
属性:
'logFile'=>'',// 日志文件
'maxByte'=>0,// 最大文件容量,单kb,日志文件超过该值时,将创建新的日志文件
'rotatefmt'=>'{filename}',// 轮转文件格式,变量可以取自日志上下文, filename:当前日志文件名
'rotatefmtParams'=>['filename'=>'\w+'],// 轮转文件格式参数,可设置变量的正则表达式
'backupCount'=>0,// 最大备份文件数量,默认为0,表示不限制
'backupfmt'=>'{filename}_up{index}',// 备份文件格式,变量可以取自日志上下文, filename:当前轮转文件名 ,index:自增序号 日期格式
'backupfmtParams'=>['index'=>'\d+'],// 备份文件格式参数,可设置变量的正则表达式
轮转文件名支持上下文变量,如:{filename}_{pid},pid:当前进程id
备份文件名支持上下文变量,如:{filename}_{pid},pid:当前进程id
- 示例代码
use hehe\core\hlogger\LogManager; $hlog = new LogManager(); $logger = $hlog->newLogger(); // 创建处理器, 默认日志文件为/home/hehe/www/logs/hehep.log, 日志文件大小为5M $handler = $hlog->byteRotatingFileHandler('/home/hehe/www/logs/hehep.log',1024 * 5); $handler = $hlog->byteRotatingFileHandler([ 'logFile'=>'/home/hehe/www/logs/hehep.log', // 最大文件容量,单kb,5M 'maxByte'=>1024 * 5, // filename:当前日志文件名 ,date:为当前日期,"YmdHi" 日期格式 'rotatefmt'=>'{filename}_{date:YmdHi}', ]); $logger->addHandler($handler); $logger->info('info log message');
文件日期轮转处理器
- 说明
类名:hehe\core\hlogger\handlers\TimedRotatingFileHandler, 继承自RotatingFileHandler
属性:
'logFile'=>'',// 日志文件
'rotateMode'=>'d',// 日志轮转模式,支持d(天),h(小时),m(月),s(分钟),w(周),y(年),默认为d,表示按天轮转
'rotatefmt'=>'{filename}_{date:YmdHi}_hehe',// 轮转文件格式,变量可以取自日志上下文,
// filename:当前日志文件名 ,date:为当前日期,"YmdHi" 日期格式
'rotatefmtParams'=>['filename'=>'\w+'],// 轮转文件格式参数,可设置变量的正则表达式
'maxFile'=>0,// 最大文件数量,默认为0,表示不限制'
'maxByte'=>0,// 最大文件容量,单kb,日志文件超过该值时,将创建新的日志文件
'backupCount'=>0,// 最大备份文件数量,默认为0,表示不限制
'backupfmt'=>'{filename}_up{index}',// 备份文件格式,变量可以取自日志上下文,
// filename:当前轮转文件名 ,index:自增序号
'backupfmtParams'=>['index'=>'\d+'],// 备份文件格式参数,可设置变量的正则表达式
轮转文件名支持上下文变量,如:{filename}_{pid},pid:当前进程id
备份文件名支持上下文变量,如:{filename}_{pid},pid:当前进程id
- 示例代码
use hehe\core\hlogger\LogManager; $hlog = new LogManager(); $logger = $hlog->newLogger(); $timedRotatingFileHandler = $logger->timedRotatingFileHandler('/home/hehe/www/logs/hehep.log','s'); $timedRotatingFileHandler->setMaxFiles(2); $timedRotatingFileHandler->setRotatefmt('{filename}_{date:YmdHi}_hehe'); // $timedRotatingFileHandler->setRotatefmt('{date:Ym/d/H/}{filename}_{date:YmdHi}_hehe'); 目录日期格式 $timedRotatingFileHandler->setMaxByte(10); $timedRotatingFileHandler->setBackupCount(4); $logger->addHandler($timedRotatingFileHandler); $logger->setFormatter($logger->lineFormatter('{date:Y-m-d:H:i},{level},{msg} ,file:{file}, line:{line} {n}')); $logger->error("default logger error message");
扩展文件轮转处理器
- 说明
继承:hehe\core\hlogger\handlers\RotatingFileHandler; 属性: 'logFile'=>'',// 日志文件 'rotating'=>null,// 轮转状态,true 表示正在轮转中(日志文件未生成) 'maxFiles'=>0,// 最大文件数量,默认为0,表示不限制 'rotatefmt'=>'',// 轮转文件格式,变量可以取自日志上下文, 'rotatefmtParams'=>[],// 轮转文件格式参数,可设置变量的正则表达式 'backupCount'=>0,// 最大备份文件数量,默认为0,表示不限制 'backupfmt'=>'',// 备份文件格式,变量可以取自日志上下文, 'backupfmtParams'=>[],// 备份文件格式参数,可设置变量的正则表达式
- 示例代码
class TimedRotatingFileHandler extends RotatingFileHandler { // 重写rotate 方法即可 public function rotate(Message $message):void { // 第一次轮转,初始化轮转时间,轮转文件 if ($this->rotateFile === '') { // 首次轮转文件 $this->rotateFile($message); } // 轮转条件 if ($message->getDataTime() > $this->endDate) { $this->rotating = true; // 轮转文件 $this->rotateFile($message); } // 备份轮转文件 if ($this->rotating === false && $this->maxByte > 0) { clearstatcache(); if (@filesize($this->rotateFile) > ($this->maxByte * 1024)) { // 备份轮转文件 $this->backupFile($message); } } return ; } }
日志过滤器
- 说明
基类:hehe\core\hlogger\base\LogFilter
作用:过滤日志消息,比如只记录error级别日志,或者只记录"admin\controller*"控制器的日志
属性:
'levels'=>'info,error',// 支持的日志级别
'categorys'=>['admin\controller*'],// 支持的日志分类
预定义过滤器
use hehe\core\hlogger\LogManager; $conf = [ // 预定日志过滤器 'filters'=>[ 'default'=>[ //'class'=>'',// 过滤器类名,未填则默认为LevelFilter 'levels'=>['info','error'],// 过滤器支持的级别 'categorys'=>['admin\controller*'],// 过滤器支持分类 ], 'default1'=>[ 'class'=>'LevelFilter',// 过滤器类名,未填则默认为LevelFilter 'levels'=>['info','error'],// 过滤器支持的级别 'categorys'=>['admin\controller*'],// 过滤器支持分类 ], ], ];
自定义过滤器
namespace hehe\core\hlogger\filters; use hehe\core\hlogger\base\LogFilter; use hehe\core\hlogger\base\Message; use hehe\core\hlogger\Utils; class LevelFilter extends LogFilter { public function __construct(string $levels = '',array $propertys = []) { parent::__construct($propertys); } // 检查消息是否满足条件 public function check(Message $message):bool { // @todo 实现自己的过滤规则 } }
创建过滤器对象
use hehe\core\hlogger\LogManager; $hlog = new LogManager([]); $logger = $hlog->newLogger(); // 创建预定义“default1”日志处理器 $defaultFilter = $hlog->newFilter('default1'); $logger->addFilter($defaultFilter); // 创建空的日志处理器对象 $emptyFilter = $hlog->newFilter(); $emptyFilter->setLevels('error,info'); $emptyFilter->setCategorys(['admin\controller*']); $logger->addFilter($emptyFilter); // 创建level过滤器对象 $levelFilter = $hlog->levelFilter('error,info',['admin\controller*']); $logger->addFilter($levelFilter); $logger->addHandler($hlog->fileHandler('/home/hehe/www/logs/hehep.log',1024 * 5)); // 记录日志 $logger->error('error log message');
日志格式器
- 说明
基类:hehe\core\hlogger\base\LogFormatter
作用:格式化日志消息,比如将日志消息转换为字符串
预定义日志格式器
$conf = [ // 日志格式器定义 'formatters'=>[ 'default'=>[ //'class'=>'',// 消息格式器类名,未填则默认为LineFormatter 'tpl'=>'{date:Y-m-d:H:i} :{msg},file:{file}, line:{line},{class}->{fn} {n}', ] ], ];
自定义日志格式器
namespace hehe\core\hlogger\formatters; use hehe\core\hlogger\base\LogFormatter; use hehe\core\hlogger\base\Message; use hehe\core\hlogger\Utils; class LineFormatter extends LogFormatter { public function __construct(string $tpl = '',array $propertys = []) { $this->tpl = $tpl; parent::__construct($propertys); } // 解析消息 public function parse(Message $message) { // 获取上下文对象 $context = $message->getContext(); // 获取上下文值 $ip = $context->getValue('ip'); $class = $context->getValue('class'); $msg = $context->getValue('msg'); $date = $context->getValue('date',['Y-m-d:H:i']); } }
创建格式器器对象
use hehe\core\hlogger\LogManager; $hlog = new LogManager([]); $logger = $hlog->newLogger(); // 创建预定义“default1”日志处理器 $defaultFormatter = $hlog->newFormatter('default1'); $logger->setFormatter($defaultFormatter); // 创建空的日志处理器对象 $emptyFormatter = $hlog->newFormatter(); $emptyFormatter->setTpl('{date:Y-m-d:H:i} :{msg},file:{file}, line:{line},{class}->{fn} {n}'); $logger->setFormatter($emptyFormatter); // 创建level过滤器对象 $lineFormatter = $hlog->lineFormatter('{date:Y-m-d:H:i} :{msg} ,file:{file}, line:{line},{class}->{fn} {n}'); $logger->setFormatter($lineFormatter); $logger->addHandler($hlog->fileHandler('/home/hehe/www/logs/hehep.log',1024 * 5)); // 记录日志 $logger->error('error log message');
日志单行字符串格式器
- 默认日志模版变量
date:当前系统时间,基本格式:{date:Y-m-d:H:i:s}
mdate:日志时间,基本格式:{date:Y-m-d:H:i:s}
msg:日志内容,基本格式:{msg}
level:日志级别,基本格式:{level}
file:记录日志时的文件路径,基本格式:file}
line:记录日志时的行数,基本格式:{line}
class:记录日志时的类名,基本格式:{class}
fn:记录日志时的方法名或函数名,基本格式:{fn}
cate:调用日志时位置(格式:类名:方法名),基本格式:{cate}
n:换行符,'\n',基本格式:{n}
- 示例代码
use hehe\core\hlogger\LogManager; $hlog = new LogManager(); $logger = $hlog->newLogger(); // 创建单行字符串日志格式器 $lineFormatter = $hlog->lineFormatter('{date:Y-m-d:H:i} :{msg} ,file:{file}, line:{line},{class}->{fn} {n}'); // 创建预定义“default”日志格式器 $lineFormatter = $hlog->newFormatter('default'); $logger->setFormatter($lineFormatter);
常用日期格式集合
日志上下文
- 说明
基类:hehe\core\hlogger\base\LogContext
作用:日志上下文,比如记录日志时的任务ID,用户ID等
预定义日志上下文
$conf = [ 'contexts'=>[ 'default'=>[ 'class'=>'hehe\core\hlogger\contexts\TraceContext', 'skipClasses'=>[],// 跳过的类名, 'skipFuns'=>[],// 跳过的函数名, ] ], ];
自定义日志上下文
namespace hehe\core\hlogger\contexts; use hehe\core\hlogger\base\LogContext; class LineContext extends LogContext { public function handle():array { return [ 'user'=>'admin', 'ip'=>'127.0.0.1' ]; } }
日志上下文示例代码
use hehe\core\hlogger\LogManager; use \hehe\core\hlogger\contexts\TraceContext; $hlog = new LogManager(); $logger = $hlog->newLogger(); // 创建单行字符串日志格式器 $lineFormatter = $hlog->lineFormatter('{date:Y-m-d:H:i},{msg} {user}:{ip},file:{file}, line:{line},{class}->{fn} {n}'); $logger->setFormatter($lineFormatter); // 创建预定义“default”日志上下文 $defaultContext = $hlog->newContext('default'); // 快速创建traceContext日志上下文 $traceContext = $hlog->traceContext(["hlogger"]); $logger->addContext($traceContext); // new TraceContext 上下文 $traceContext = new \hehe\core\hlogger\contexts\TraceContext(); $logger->addContext($traceContext); $logger->addContext(TraceContext::class); // 添加闭包上下文 $logger->addContext(function(){ return [ 'user'=>'admin', 'ip'=>'127.0.0.1' ]; }); // 数组上下文 $logger->error('error log message',['goodid'=>'123']);
可用上下文集合
trace上下文
- 说明
基类:hehe\core\hlogger\contexts\TraceContext
变量:
file:文件路径,基本格式:{file}
line:行数,基本格式:{line}
class:类名,基本格式:{class}
fn:方法名,基本格式:{fn}
系统上下文
- 说明
基类:hehe\core\hlogger\contexts\SysContext
变量:
pid:进程ID,基本格式:{pid}
tid:线程ID,基本格式:{tid}
date:日期,基本格式:{date:Y-m-d:H:i}
time:时间戳,微妙,基本格式:{time}
maxMemory:最大内存,基本格式:{maxMemory}
useMemory:当前脚本占用的内存,基本格式:{useMemory}
n:换行符,'\n',基本格式:{n}