Android中使用Log4j及配置說明


目前在進行Android開發時使用到了log4j,現在對其配置進行記錄。

1. android-logging-log4j 下載地址

https://code.google.com/archive/p/android-logging-log4j/

2. 所依賴的apache的log4j庫的下載地址

http://logging.apache.org/log4j/1.2/download.html

Log4j配置說明

1.Log4j簡介
    Log4j是Apache的一個開源項目,它允許開發者以任意間隔輸出日志信息。主要由以下三大類組件構成:
   (1)Logger---負責輸出日志信息,並能夠對日志信息進行分類篩選,即決定哪些日志信息應該被輸出,哪些該被忽略。

            Loggers組件輸出日志信息時分為5個級別:DEBUG、INFO、WARN、ERROR、FATAL。這五個級別的順序是:DEBUG<INFO<WARN<ERROR<FATAL。

            例如,設置某個Logger組件的級別是WARN,那么則只有級別比WARN高的日志信息才能輸出,即DEBUG,INFO不會被輸出。

            Logger是有繼承關系的,最上層是rootLogger,定義的其他Logger都會繼承rootLogger。
 
  (2)Appender---定義了日志輸出目的地,指定日志信息應該被輸出到什么地方。輸出的目的地可以是控制台、文件或網絡設備。
 
  (3)Layout---通過在Appender的后面附加Layout來實現格式化輸出。一個Logger可以有多個Appender,每個Appender對應一個Layout。 

2.Loggers
Logger的定義格式:log4j.[loggername]=[level],appenderName,appenderName,…
這里level是指Logger的優先級,appenderName是日志信息的輸出地,可以同時定義多個輸出地。

3.Appenders
Appender的定義格式:
log4j.appender.appenderName = fully.qualified.name.of.appender.class  
// "fully.qualified.name.of.appender.class" 可以指定下面五個目的地中的一個:
Appender類及其作用列表
Appender類名
作 用
org.apache.log4j.ConsoleAppender
將日志輸出到控制台
org.apache.log4j.FileAppender
將日志輸出到文件
org.apache.log4j.DailyRollingFileAppender
每天產生一個日志文件
org.apache.log4j.RollingFileAppender
文件大小到達指定尺寸時產生一個新的文件
org.apache.log4j. WriterAppender
將日志信息以流格式發送到任意指定的地方

(1) ConsoleAppender選項
-Threshold=WARN:指定日志消息的輸出最低層次。
-ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
-Target=System.err:默認情況下是:System.out,指定輸出控制台。
 
(2)FileAppender 選項
-Threshold=WARN:指定日志消息的輸出最低層次。
-ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
-File=mylog.txt:指定消息輸出到mylog.txt文件。
- Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
 
(3)DailyRollingFileAppender 選項
-Threshold=WARN:指定日志消息的輸出最低層次。
-ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
-File=mylog.txt:指定消息輸出到mylog.txt文件。
-Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
-DatePattern='.'yyyy-ww:每周滾動一次文件,即每周產生一個新的文件。當然也可以指定按月、周、天、時和分。即對應的格式如下:
'.'yyyy-MM: 每月
'.'yyyy-ww: 每周 
'.'yyyy-MM-dd: 每天
'.'yyyy-MM-dd-a: 每天兩次
'.'yyyy-MM-dd-HH: 每小時
'.'yyyy-MM-dd-HH-mm: 每分鍾
 
(4)RollingFileAppender 選項
-Threshold=WARN:指定日志消息的輸出最低層次。
-ImmediateFlush=true:默認值是true,意謂着所有的消息都會被立即輸出。
-File=mylog.txt:指定消息輸出到mylog.txt文件。
- Append=false:默認值是true,即將消息增加到指定文件中,false指將消息覆蓋指定的文件內容。
-MaxFileSize=100KB: 后綴可以是KB, MB 或者是 GB. 在日志文件到達該大小時,將會自動滾動,即將原來的內容移到mylog.log.1文件。
-MaxBackupIndex=2:指定可以產生的滾動文件的最大數。

4.Layouts
Layout的定義格式:
部分一log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
              //"fully.qualified.name.of.layout.class" 可以指定下面4個格式中的一個:
Layout類及其作用列表
Layout類名
作 用
org.apache.log4j.HTMLLayout
以HTML表格形式布局
org.apache.log4j.PatternLayout
可以靈活地指定布局模式
org.apache.log4j.SimpleLayout
包含日志信息的級別和信息字符串
org.apache.log4j.TTCCLayout
包含日志產生的時間、線程、類別等等信息
(1)HTMLLayout 選項
-LocationInfo=true:默認值是false,輸出java文件名稱和行號。
-Title=my app file: 默認值是 Log4J Log Messages。
 
(2)PatternLayout 選項
- ConversionPattern=%m%n :指定怎樣格式化指定的消息。
 
(3)XMLLayout  選項
-LocationInfo=true:默認值是false,輸出java文件和行號。

日志信息格式中符號所代表的含義
(1)-X號: X信息輸出時左對齊。
(2)%p: 輸出日志信息優先級,即DEBUG,INFO,WARN,ERROR,FATAL。
(3)%d: 輸出日志時間點的日期或時間,默認格式為ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921。
(4)%r: 輸出自應用啟動到輸出該log信息耗費的毫秒數。
(5)%c: 輸出日志信息所屬的類目,通常就是所在類的全名。
(6)%t: 輸出產生該日志事件的線程名。
(7)%l: 輸出日志事件的發生位置,相當於%C.%M(%F:%L)的組合,包括類目名、發生的線程,以及在代碼中的行數。舉例:Testlog4.main(TestLog4.java:10)。
(8)%x: 輸出和當前線程相關聯的NDC(嵌套診斷環境),尤其用到像java servlets這樣的多客戶多線程的應用中。
(9)%%: 輸出一個"%"字符。
(10)%F: 輸出日志消息產生時所在的文件名稱。
(11)%L: 輸出代碼中的行號。
(12)%m: 輸出代碼中指定的消息,產生的日志具體信息。
(13)%n: 輸出一個回車換行符,Windows平台為"\r\n",Unix平台為"\n"輸出日志信息換行。
可以在%與模式字符之間加上修飾符來控制其最小寬度、最大寬度、和文本的對齊方式。如:
(1)%20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,默認的情況下右對齊。
(2)%-20c:指定輸出category的名稱,最小的寬度是20,如果category的名稱小於20的話,"-"號指定左對齊。
(3)%.30c:指定輸出category的名稱,最大的寬度是30,如果category的名稱大於30的話,就會將左邊多出的字符截掉,但小於30的話也不會有空格。
(4)%20.30c:如果category的名稱小於20就補空格,並且右對齊,如果其名稱長於30字符,就從左邊交遠銷出的字符截掉。

在Android中使用Log4j
1. 引入log4j-1.2.17.jar
2. 引入android-logging-log4j-1.0.3.jar,其中我下載了這個包的源碼,並對其進行了修改,增加了可以設置每天生成一個新日志文件的功能(默認是根據設置的文件最大值來生成新文件的)
部分代碼如下:

Log4jConfigure <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">配置類
package com.king.log;
 
import java.io.File;
 
import org.apache.log4j.Level;
 
import android.os.Environment;
import de.mindpipe.android.logging.log4j.LogConfigurator;
 
public class Log4jConfigure {
    private static final int MAX_FILE_SIZE = 1024 * 1024 * 10;
    private static final String DEFAULT_LOG_DIR = "//MyApp//Log//";
    private static final String DEFAULT_LOG_FILE_NAME = "MyApp.log";
    private static final String TAG = "Log4jConfigure";
    // 對應AndroidManifest文件中的package
    private static final String PACKAGE_NAME = "com.king.logtest";
 
    public static void configure(String fileName) {
        final LogConfigurator logConfigurator = new LogConfigurator();
        try {
            if (isSdcardMounted()) {
                logConfigurator.setFileName(Environment.getExternalStorageDirectory()
                        + DEFAULT_LOG_DIR + fileName);
            } else {
                logConfigurator.setFileName("//data//data//" + PACKAGE_NAME + "//files"
                        + File.separator + fileName);
            }
            //以下設置是按指定大小來生成新的文件
            /*
             * logConfigurator.setMaxBackupSize(4);
             * logConfigurator.setMaxFileSize(MAX_FILE_SIZE);
             */
            
            //以下設置是按天生成新的日志文件,與以上兩句互斥,MAX_FILE_SIZE將不在起作用
            //文件名形如 MyApp.log.2016-06-02,MyApp.log.2016-06-03
            logConfigurator.setUseDailyRollingFileAppender(true);
            
            //以下為通用配置
            logConfigurator.setImmediateFlush(true);
            logConfigurator.setRootLevel(Level.DEBUG);
            logConfigurator.setFilePattern("%d\t%p/%c:\t%m%n");
            logConfigurator.configure();
            android.util.Log.e(TAG, "Log4j config finish");
        } catch (Throwable throwable) {
            logConfigurator.setResetConfiguration(true);
            android.util.Log.e(TAG, "Log4j config error, use default config. Error:" + throwable);
        }
    }
 
    public static void configure() {
        configure(DEFAULT_LOG_FILE_NAME);
    }
 
    private static boolean isSdcardMounted() {
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
    }
}

日志輸出類Log

package com.king.log;
 
import org.apache.log4j.Logger;
import android.text.TextUtils;
 
public class Log {
 
    /** log開關 */
    public static final boolean SWITCH_LOG = true;
    private static boolean isConfigured = false;
 
    public static void d(String tag, String message) {
        if (SWITCH_LOG) {
            Logger LOGGER = getLogger(tag);
            LOGGER.debug(message);
        }
    }
 
    public static void d(String tag, String message, Throwable exception) {
        if (SWITCH_LOG) {
            Logger LOGGER = getLogger(tag);
            LOGGER.debug(message, exception);
        }
    }
 
    public static void i(String tag, String message) {
        if (SWITCH_LOG) {
            Logger LOGGER = getLogger(tag);
            LOGGER.info(message);
        }
    }
 
    public static void i(String tag, String message, Throwable exception) {
        if (SWITCH_LOG) {
            Logger LOGGER = getLogger(tag);
            LOGGER.info(message, exception);
        }
    }
 
    public static void w(String tag, String message) {
        if (SWITCH_LOG) {
            Logger LOGGER = getLogger(tag);
            LOGGER.warn(message);
        }
    }
 
    public static void w(String tag, String message, Throwable exception) {
        if (SWITCH_LOG) {
            Logger LOGGER = getLogger(tag);
            LOGGER.warn(message, exception);
        }
    }
 
    public static void e(String tag, String message) {
        if (SWITCH_LOG) {
            Logger LOGGER = getLogger(tag);
            LOGGER.error(message);
        }
    }
 
    public static void e(String tag, String message, Throwable exception) {
        if (SWITCH_LOG) {
            Logger LOGGER = getLogger(tag);
            LOGGER.error(message, exception);
        }
    }
 
    private static Logger getLogger(String tag) {
        if (!isConfigured) {
            <strong>Log4jConfigure.configure();</strong>
            isConfigured = true;
        }
        Logger logger;
        if (TextUtils.isEmpty(tag)) {
            logger = Logger.getRootLogger();
        } else {
            logger = Logger.getLogger(tag);
        }
        return logger;
    }
}
最后在使用日志輸出的時候使用自定義的Log替換android自帶的Log類引用即可。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM