首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 靈活日誌類實現:等級控制、檔案寫入與自動建目錄

     編輯:PHP 綜合知識

核心代碼(修正版)

<?php
class Logger {
    private static $level    = 0;
    private static $file     = '/tmp/app.log';
    private static $levelMap = [
        'NONE'  => 0,
        'ERROR' => 1,
        'INFO'  => 2,
        'DEBUG' => 3
    ];

    public static function setLevel($level = 'ERROR') {
        self::$level = self::$levelMap[$level] ?? 0;
    }

    public static function log($level, $message) {
        if ((self::$levelMap[self::$level] ?? 0) < (self::$levelMap[$level] ?? 0)) {
            return false; // 級別不足,不記錄
        }

        $dir = dirname(self::$file);
        if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
        }

        $fp = fopen(self::$file, 'a');
        if ($fp) {
            $time = date('Y-m-d H:i:s.u');
            fwrite($fp, "[$level] [$time] $message\n");
            fclose($fp);
        }
        return true;
    }

    public static function reset() {
        if (file_exists(self::$file)) {
            @unlink(self::$file);
        }
    }

    // 靜態快捷方法
    public static function error($msg)  { self::log('ERROR', $msg); }
    public static function info($msg)   { self::log('INFO',  $msg); }
    public static function debug($msg)  { self::log('DEBUG', $msg); }
}
?>

設計亮點

  • 靜態類單例模式:無需實例化,Logger::info('msg') 即可調用。
  • 等級過濾:setLevel('INFO') 時,DEBUG 不會寫入,ERROR/INFO 會寫入。
  • 自動建目錄:mkdir(..., true) 遞迴建立日誌目錄,免去手動維護。
  • 微秒時間戳:date('u') 提供微秒精度,利於效能分析。
  • 資源正確釋放:fopen('a') 追加模式 + fclose(),避免檔案鎖死。

使用範例

<?php
require 'Logger.php';

Logger::setLevel('INFO');     // 只記錄 INFO 以上
Logger::error('DB connection failed');
Logger::info('User login: uid=1001');
Logger::debug('SQL: SELECT * FROM users'); // 不會寫入

// 動態切換級別
Logger::setLevel('DEBUG');
Logger::debug('Cache hit ratio: 92%');

// 清空日誌(測試用)
Logger::reset();
?>

原始碼問題修正說明

原始片段存在變數名錯誤($ss-log-filename 全形連字號)、語法錯誤(NONE => 0 需加引號)、函數名拼寫不一致(daddslashes vs site_addslashes)、ss_times*****p_pretty() 未定義。本文已重構為可直接生產使用的類庫。

生產環境擴展建議

  • 支援多通道(檔案、Syslog、Elasticsearch、Slack Webhook)。
  • 日誌分割:按日期/大小自動輪轉(logrotate 或自訂邏輯)。
  • 結構化日誌:JSON 格式輸出,便於 ELK 採集分析。
  • 上下文資訊:自動附加 request_id、trace_id 實現分散式追蹤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved