Android 多通道同時打印日志庫 - XLog

jopen 8年前發布 | 21K 次閱讀 Android開發 移動開發

 XLog 是方便可擴展的 Android 和 java 庫,可同時在多個通道打印日志,如 Logcat、System.out 和文件。如果你愿意,甚至可以打印到遠程服務器(或其他任何地方)。

依賴

repositories {
    jcenter() // mavenCentral() would work, too }
dependencies {
  compile 'com.elvishew:xlog:0.1.1' }

用法

初始化

簡單方式

XLog.init(LogLevel.ALL);

高級方式

XLog.init(LogLevel.ALL,
        new LogConfiguration                                             // 如果沒有指定 LogConfiguration,會默認使用 new LogConfiguration.Builder().build()
                .Builder()                                               // 打印日志時會用到的配置
                .tag("MY_TAG")                                           // 默認: "XLOG"
                .jsonFormatter(new DefaultJsonFormatter())               // 默認: DefaultJsonFormatter
                .xmlFormatter(new DefaultXmlFormatter())                 // 默認: DefaultXmlFormatter
                .methodFormatter(new DefaultMethodFormatter())           // 默認: DefaultMethodFormatter
                .throwableFormatter(new DefaultThrowableFormatter())     // 默認: DefaultThrowableFormatter
                .build(),
        new AndroidPrinter(                                              // 通過 android.util.Log 打印 log。如果沒有指定任何 Printer,會默認使用 AndroidPrinter
                new BorderConfiguration                                  // 如果沒有指定 BorderConfiguration,會默認使用 new BorderConfiguration.Builder().enable(false).build()
                        .Builder()                                       // 用來裝飾日志消息的邊框配置
                        .enable(true)                                    // 默認: false
                        .horizontalBorderChar('═')                       // 默認: '═'
                        .verticalBorderChar('║')                         // 默認: '║'
                        .borderLength(100)                               // 默認: 100
                        .build()
        ),
        new SystemPrinter(),                                             // 通過 System.out.println 打印日志。如果沒有指定,則不會使用
        new FilePrinter                                                  // 打印日志到文件。如果沒有指定,則不會使用
                .Builder("/sdcard/xlog/")                                // 保存日志文件的路徑
                .fileNameGenerator(new DateFileNameGenerator())          // 默認: ChangelessFileNameGenerator("log")
                .backupStrategy(new FileSizeBackupStrategy(1024 * 1024)) // 默認: FileSizeBackupStrategy(1024 * 1024)
                .logFormatter(new DefaultLogFormatter())                 // 默認: DefaultLogFormatter
                .build()

對于 android,做初始化的最佳地方是 Application.onCreate()

全局用法

// 打印一個 LogLevel.INFO 級別的日志
XLog.v(String, Object...);
XLog.v(String);
XLog.v(String, Throwable);

// 打印一個 LogLevel.DEBUG 級別的日志
XLog.d(String, Object...);
XLog.d(String);
XLog.d(String, Throwable);

// 打印一個 LogLevel.INFO 級別的日志
XLog.i(String, Object...);
XLog.i(String);
XLog.i(String, Throwable);

// 打印一個 LogLevel.WARN 級別的日志
XLog.w(String, Object...);
XLog.w(String);
XLog.w(String, Throwable);

// 打印一個 LogLevel.ERROR 級別的日志
XLog.e(String, Object...);
XLog.e(String);
XLog.e(String, Throwable);

// 打印一個 JSON 字符串
XLog.json(String);

// 打印一個 XML 字符串
XLog.xml(String);

// 打印一個方法
XLog.method(Object...);

// 打印一個調用棧
XLog.stack();
XLog.stack(String, Object...);
XLog.stack(String);

定制用法

1. 開始一個定制

        調用

XLog.tag(String);
XLog.jsonFormatter(JsonFormatter);
XLog.xmlFormatter(XmlFormatter);
XLog.methodFormatter(MethodFormatter);
XLog.throwableFormatter(ThrowableFormatter);
XLog.printers(Printer...);

中的任何一個方法以創建一個 Logger.Builder 對象。

2. 更多定制

繼續定制 Logger.Builder 對象的其他參數。

builer.tag(String);
builer.jsonFormatter(JsonFormatter);
builer.xmlFormatter(XmlFormatter);
builer.methodFormatter(MethodFormatter);
builer.throwableFormatter(ThrowableFormatter);
builer.printers(Printer...);

3. 生成一個定制后的 Logger

 調用 Logger.Builder 對象的

builder.build();

方法以生成一個 Logger 對象。

4. 開始打印日志.

Logger 類里的所有打印日志相關方法都跟 XLog 類里的一模一樣。

為了更便利,你可以忽略第 3 步,直接調用 Logger.Builder 對象的打印日志相關方法,這會生成一個 Logger 對象并自動調用它里面的相應方法,也就是說這個生成的 Logger 對象是“一次性”的。

所有打印日志相關方法都在 全局使用 中列出來了。

比較

讓我們設想有一個 JSON 字符串和一個 XML 字符串:

String jsonString = "{name:Elvis, age: 18}"; String xmlString = "<Person name=\"Elvis\" age=\"18\" />";

Android Log

Log.d(TAG, "The message");
Log.d(TAG, String.format("The message with argument: age=%s", 18));
Log.d(TAG, formatJson(jsonString));
Log.d(TAG, formatXml(xmlString));
Log.d(TAG, "testAndroidLog(" + arg1 + ", " + arg2 + ", " + arg3 + ")");
Log.d(TAG, "Here's the call stack", new Throwable());

XLog

XLog.d("The message");
XLog.d("The message with argument: age=%s", 18);
XLog.json(jsonString);
XLog.xml(xmlString);
XLog.method(arg1, arg2, arg3);
XLog.stack("Here's the call stack");

帶邊框的 XLog

Logger logger = XLog.printers(
        new AndroidPrinter(
                new BorderConfiguration
                        .Builder()
                        .enable(true)
                        .build()))
        .build();    
logger.d("The message");
logger.d("The message with argument: age=%s", 18);
logger.json(jsonString);
logger.xml(xmlString);
logger.method(arg1, arg2, arg3);
logger.stack("Here's the call stack");

兼容性

為了兼容 Android Log,XLog 支持 Android Log 里的所有方法。
請看 XLog 里的 Log 類。

Log.v(String, String);
Log.v(String, String, Throwable);
Log.d(String, String);
Log.d(String, String, Throwable);
Log.i(String, String);
Log.i(String, String, Throwable);
Log.w(String, String);
Log.w(String, String, Throwable);
Log.wtf(String, String);
Log.wtf(String, String, Throwable);
Log.e(String, String);
Log.e(String, String, Throwable);
Log.println(int, String, String);
Log.isLoggable(String, int);
Log.getStackTraceString(Throwable);

遷移

如果你有一個大工程正在用 Android Log,并且很難將所有對 Android Log 的使用都換成 XLog,那么你可以使用兼容 API,簡單地將所有 'android.util.Log' 替換成 'com.elvishew.xlog.XLog.Log'.
(為了更好的性能,盡量不要使用兼容 API)

Linux/Cygwin:

grep -rl "android.util.Log" <your-source-directory> | xargs sed -i "s/android.util.Log/com.elvishew.xlog.XLog.Log/g"

Mac

grep -rl "android.util.Log" <your-source-directory> | xargs sed -i "" "s/android.util.Log/com.elvishew.xlog.XLog.Log/g"

Android Studio

在 'Project' 窗口里,切換到 'Project Files' 標簽,然后右鍵點擊你的源碼目錄。
在出現的菜單里,點擊 'Replace in Path...' 選項。
在彈出的對話框里,'Text to find' 區域填上 'android.util.Log','Replace with' 區域填個 'com.elvishew.xlog.XLog.Log',然后點擊 'Find'。

感謝

感謝 Orhan Obut 的 logger 給了我很多“應該做成怎樣”的思考。
感謝 Serge Zaitsev 的 log,讓我想到要兼容 Android Log

許可

Copyright 2015 Elvis Hew

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

官方網站:http://www.baiduhome.net/lib/view/home/1451867968995

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!