分享一个日志生成,分割类库

路过人间

这是一个基于monolog开发的,可以自动分割日志的类库。日志自动按大小分片保存,超过大小后自动分割,并保留指定天数的日志

A custom logging library for FssPHP Framework based on Monolog with file size rotation support.

简单修改后,就可以适配webman。

仓库地址: https://github.com/xuey490/log

安装

composer require xuey490/log

初始化使用

use Framework\Log\LoggerService;

$config = [
    'log_channel'   => 'my-app',   //暂时没啥用,可以看做应用标记
    'log_path'      => __DIR__ . '/storage/logs',//日志存放路径
    'log_size'      => 10 * 1024 * 1024, // 10MB 日志文件大小超过大小,自动分割
    'log_keep_days' => 15  //日志保留天数
];

$logger = new LoggerService($config);
$logger->info("Log system initialized successfully!");

日志片段 /storage/logs/app.log

[2025-12-03T07:29:22.869860+08:00] app.INFO: [Event Expired] Listener files changed or cache expired. Rescanning... [] []
[2025-12-03T07:29:22.926525+08:00] app.INFO: [Event] Scanned and found 2 subscribers. [] []
[2025-12-03T07:29:24.227385+08:00] app.INFO: [Route Loaded]Loaded 128 routes (manual: 5, annotated: 123) [] []
[2025-12-03T07:29:30.594206+08:00] app.INFO: [Event Scan] Subscribers loaded from cache (fingerprint match). [] []
[2025-12-03T07:29:30.606746+08:00] app.INFO: [Route Loaded]Loaded 128 routes (manual: 5, annotated: 123) [] []
[2025-12-03T07:29:40.230684+08:00] app.INFO: [Event Scan] Subscribers loaded from cache (fingerprint match). [] []
[2025-12-03T07:29:40.242940+08:00] app.INFO: [Route Loaded]Loaded 128 routes (manual: 5, annotated: 123) [] []
[2025-12-03T07:29:42.975919+08:00] app.INFO: [Request processed] {"method":"GET","path":"/blog","status":200,"duration":"2728.64ms","ip":"::1"} []

SQL debug log

[2025-12-03T07:44:02.805026+08:00] app.DEBUG: [ThinkORM Info] {"sql":"CONNECT:[ UseTime:0.018970s ] mysql:host=127.0.0.1;port=3306;dbname=oa;charset=utf8mb4","time":"1,764,719,042.804996s","explain":[]} []
[2025-12-03T07:44:02.814690+08:00] app.DEBUG: [ThinkORM Info] {"sql":"SHOW FULL COLUMNS FROM `oa_custom`","time":"0.009247s","explain":[]} []
[2025-12-03T07:44:02.833638+08:00] app.DEBUG: [ThinkORM Info] {"sql":"SELECT * FROM `oa_custom` WHERE  `status` = 1 ORDER BY id desc","time":"0.000428s","explain":[]} []
[2025-12-03T07:44:02.944503+08:00] app.DEBUG: [ThinkORM Info] {"sql":"SELECT COUNT(*) AS think_count FROM `oa_custom` WHERE  `status` = 1","time":"0.022348s","explain":[]} []
[2025-12-03T07:44:02.945115+08:00] app.DEBUG: [ThinkORM Info] {"sql":"SELECT * FROM `oa_custom` WHERE  `status` = 1 LIMIT 0,3","time":"0.000349s","explain":[]} []
110 2 1
2个评论

shiroi

能自定义前面的时间格式嘛

  • 路过人间 1天前

    [2025-12-03T07:44:02.805026+08:00] app.DEBUG: [ThinkORM Info] 前面的时间戳?这个是manolog 直接生成的,也是标准的时间戳。这个可以改的,迟一点我试试。

路过人间

查了一下官方的资料,按下面的修改后就可以自定义时间戳

use Monolog\Formatter\LineFormatter;

构造函数:

                //增加下面的这一段----start-----
                // 1. 定义自定义日志格式(重点:%datetime% 对应时间戳,可自定义格式)
                // 格式说明:
                // %datetime%:时间戳(后续指定格式)
                // %channel%:日志通道名
                // %level_name%:日志级别(INFO/WARNING/ERROR)
                // %message%:日志消息
                // %context%:上下文数据(数组会自动转为字符串)
                $logFormat = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n";

                // 2. 创建格式化器,指定时间戳格式(第二个参数是时间格式,支持 PHP 的 date() 函数格式)
                // 示例时间格式:'Y-m-d H:i:s'(不含微秒和时区)、'Y-m-d H:i:s.u'(含微秒)、'Y-m-d H:i:s P'(含时区)
                $formatter = new LineFormatter(
                    $logFormat,
                    'Y-m-d H:i:s', // 自定义时间戳格式(这里去掉了 T 分隔符和微秒,更简洁)
                    true, // 是否格式化上下文数据(数组转字符串)
                    true  // 是否添加换行符(默认 true,可不写)
                );

                //增加下面的这一段----end-----

        $this->logger = new MonoLogger($channel);

        // 1. Debug 日志:仅 DEBUG
        $debugHandler = new FilterHandler(
            new FileSizeRotateHandler($logDir . '/debug.log', $maxSize, $keepDays, MonoLogger::DEBUG),
            MonoLogger::DEBUG,
            MonoLogger::DEBUG
        );
        $debugHandler->setFormatter($formatter); // 给处理器设置自定义格式化器  增加这句
        $this->logger->pushHandler($debugHandler);

日志的格式:

[2025-12-03 16:35:06] app.INFO: [Route Loaded]Loaded 108 routes (manual: 5, annotated: 103)  
[2025-12-03 16:35:06] app.INFO: [Request processed] {"method":"GET","path":"/index","status":200,"duration":"143.1ms","ip":"127.0.0.1"} 
[2025-12-03 16:35:43] app.INFO: [Event Scan] Subscribers loaded from cache (fingerprint match).  
[2025-12-03 16:35:43] app.INFO: [Route Loaded]Loaded 108 routes (manual: 5, annotated: 103)  
  • 暂无评论

路过人间

450
积分
0
获赞数
0
粉丝数
2025-10-15 加入
🔝