首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Java 通用日誌工具類:封裝 Log 級別、異常堆棧、類名行號自動獲取

     編輯:C++ 入門

設計目標

統一日誌輸出格式,自動附帶類名、方法名、行號、線程信息,支持關閉開關,提供 v/d/i/w/e/wtf 六級別,兼容 Android Log 與標準輸出。

核心特性

  • 自動上下文:Throwable.getStackTrace()[0] 獲取調用點行號、類名、方法名
  • 統一格式:`行號:類名->方法名:消息`
  • 靈活重載:支持 (msg)、(tag, msg)、(class, msg)、(class, line, msg)、(Throwable)、(Throwable, msg)
  • 全局開關:setIsShowLog(false) 生產環境一鍵關閉
  • 雙重輸出:Android Log + System.out

關鍵代碼結構

public final class LogUtils {
    private static final String TAG = "Jenly";
    private static final String COLON = ":", ARROW = "->";
    private static boolean isShowLog = true;

    public static void setIsShowLog(boolean b) { isShowLog = b; }

    // 核心構建消息方法
    private static String buildMsg(Throwable e, String msg) {
        StackTraceElement ste = e.getStackTrace()[0];
        return new StringBuilder()
            .append(ste.getLineNumber()).append(COLON)
            .append(ste.getClassName()).append(ARROW)
            .append(ste.getMethodName()).append(COLON)
            .append(msg).toString();
    }

    // v 級別示例,其他級別同理
    public static void v(String msg) { if (isShowLog) Log.v(TAG, msg); }
    public static void v(String tag, String msg) { if (isShowLog) Log.v(tag, msg); }
    public static void v(Class<?> cls, String msg) { 
        if (isShowLog) Log.v(TAG, cls.getSimpleName() + COLON + msg); 
    }
    public static void v(Throwable e) { if (isShowLog) v(TAG, e); }
    public static void v(String tag, Throwable e) { 
        if (isShowLog) Log.v(tag, buildMsg(e, e.getMessage())); 
    }
    public static void v(Throwable e, String msg) { if (isShowLog) v(TAG, e, msg); }
    public static void v(String tag, Throwable e, String msg) { 
        if (isShowLog) Log.v(tag, buildMsg(e, msg)); 
    }
    // d/i/w/e/wtf 同理...

    // System.out 封裝
    public static void print(String msg) { if (isShowLog) System.out.print(msg); }
    public static void println(String msg) { if (isShowLog) System.out.println(msg); }
}

使用示例

// 普通日誌
LogUtils.d("UserService", "User login: " + userId);

// 異常日誌(自動帶行號類名方法)
try { risky(); } 
catch (Exception e) { LogUtils.e(e, "Login failed"); }

// 關鍵業務點標記
LogUtils.i(OrderService.class, "Order created: " + orderId);

// 生產環境關閉
LogUtils.setIsShowLog(BuildConfig.DEBUG);

輸出格式示例

D/Jenly: 42:com.example.UserService->login:User login: 1001
E/Jenly: 15:com.example.OrderService->create:Order created: 2023
W/System.err: java.lang.NullPointerException
    at com.example.Risky.risky(Risky.java:10)

進階擴展建議

  1. 日誌持久化:添加文件輸出、滾動策略、壓縮歸檔
  2. 分級開關:每個級別獨立開關,而非全局
  3. 結構化日誌:輸出 JSON 格式,便於 ELK 採集分析
  4. 異步寫入:生產者-消費者隊列,避免主線程阻塞
  5. MDC 上下文:線程局部變量傳遞 traceId、userId 等

對比:主流日誌框架

框架優點適用場景
LogUtils (本工具)零依賴、輕量、Android 友好中小項目、快速原型
SLF4J + Logback標準門面、性能強、功能全服務端、企業級應用
Log4j2異步日誌、GC-free、插件化高吞吐、低延遲系統
Android Log系統集成、logcat 過濾Android App 必備
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved