Android中log4j的運用


  網上一查關於android上面運用Log4j的運用,各種說需要添加多樣的包的,照着log4j的官網教程看了下,給了個簡單的輸出到console上面的代碼,似乎沒什么用。看網上關於Log4j更多是在java web上面的,需要設置properties文件,但是這在android中我試了下,不怎么方便,隨着APK一起打包,只能放在Assets中,但是在這個包里面,會導致資源被壓縮,就有可能出問題,反正我這里是不行的。下面給出一個我在我項目中看到的一些代碼,兩個類。

  

package com.csshu.helper;

import java.io.IOException;

import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.LogLog;

/**
 * Log4j配置文件類
 * @function 
 */
public class AppLogConfigurator {
    private Level rootLevel = Level.DEBUG; // 根等級,初始比較等級
    private String filePattern = "%d - [%p::%c::%t] - %m%n";  // 文件輸出模式
    private String logCatPattern = "%m%n";    // 日志模式
    private String fileName = "TestKit.log"; // 文件名字
    private int maxBackupSize = 5; // 最大備份數量
    private long maxFileSize = 512 * 1024; // 最大文件大小
    private boolean immediateFlush = true;  // 馬上刷新
    private boolean useLogCatAppender = true; // 使用Logcat輸出器
    private boolean useFileAppender = true; // 使用文件輸出器
    private boolean resetConfiguration = true; // 重新設置配置清單
    private boolean internalDebugging = true; // 內部調試

    public AppLogConfigurator() {
    }

    public void configure() {
        final Logger root = Logger.getRootLogger(); // 獲取跟日志級別

        if (isResetConfiguration()) {   // 如果重設,則執行重設命令
            LogManager.getLoggerRepository().resetConfiguration();
        }

        LogLog.setInternalDebugging(isInternalDebugging());

        if (isUseFileAppender()) {
            configureFileAppender();
        }

        if (isUseLogCatAppender()) {
            configureLogCatAppender();
        }

        root.setLevel(getRootLevel());
    }

    public void setLevel(final String loggerName, final Level level) {
        Logger.getLogger(loggerName).setLevel(level);
    }

    /**
     * 返回logger的等級
     * @return
     */
    public Level getRootLevel() {
        return rootLevel;
    }

    public void setRootLevel(final Level level) {
        this.rootLevel = level;
    }

    /**
     * 獲取文件的正則表達式的表示
     * @return
     */
    public String getFilePattern() {
        return filePattern;
    }

    public void setFilePattern(final String filePattern) {
        this.filePattern = filePattern;
    }

    /**
     * 獲取logcat輸出模式
     * @return
     */
    public String getLogCatPattern() {
        return logCatPattern;
    }

    public void setLogCatPattern(final String logCatPattern) {
        this.logCatPattern = logCatPattern;
    }

    /**
     * 獲取文件名字的正則表達式
     * @return
     */
    public String getFileName() {
        return fileName;
    }

    public void setFileName(final String fileName) {
        this.fileName = fileName;
    }

    public int getMaxBackupSize() {
        return maxBackupSize;
    }

    public void setMaxBackupSize(final int maxBackupSize) {
        this.maxBackupSize = maxBackupSize;
    }

    public long getMaxFileSize() {
        return maxFileSize;
    }

    public void setMaxFileSize(final long maxFileSize) {
        this.maxFileSize = maxFileSize;
    }

    public boolean isImmediateFlush() {
        return immediateFlush;
    }

    public void setImmediateFlush(final boolean immediateFlush) {
        this.immediateFlush = immediateFlush;
    }

    /**
     * 返回是否用戶文件輸出
     * @return
     */
    public boolean isUseFileAppender() {
        return useFileAppender;
    }

    public void setUseFileAppender(final boolean useFileAppender) {
        this.useFileAppender = useFileAppender;
    }

    /**
     * 是否設置用戶的logcat輸出器
     * @return
     */
    public boolean isUseLogCatAppender() {
        return useLogCatAppender;
    }

    public void setUseLogCatAppender(final boolean useLogCatAppender) {
        this.useLogCatAppender = useLogCatAppender;
    }

    public void setResetConfiguration(boolean resetConfiguration) {
        this.resetConfiguration = resetConfiguration;
    }

    /**
     * 返回是否重設配置
     * @return
     */
    public boolean isResetConfiguration() {
        return resetConfiguration;
    }

    public void setInternalDebugging(boolean internalDebugging) {
        this.internalDebugging = internalDebugging;
    }

    /**
     * 返回是否內部調試
     * @return
     */
    public boolean isInternalDebugging() {
        return internalDebugging;
    }

    /**
     * 配置文件輸出器
     */
    private void configureFileAppender() {
        final Logger root = Logger.getRootLogger();
        // 這個輸出器旨在,當用戶的日志文件超過一個確定的大小去備份文件
        final RollingFileAppender rollingFileAppender;
        //     Extend this abstract class to create your own log layout format
        // A flexible layout configurable with pattern string.
        final Layout fileLayout = new PatternLayout(getFilePattern());

        try {
            rollingFileAppender = new RollingFileAppender(fileLayout,
                    getFileName());  // 規定文件輸出模式和文件名字輸出模式
        } catch (final IOException e) {
            e.printStackTrace();
            throw new RuntimeException("Exception configuring log system", e);
        }

        rollingFileAppender.setMaxBackupIndex(getMaxBackupSize());  // 設置最大備份索引
        rollingFileAppender.setMaximumFileSize(getMaxFileSize()); // 設置最大文件大小
        rollingFileAppender.setImmediateFlush(isImmediateFlush()); // 設置是否立即刷新

        root.addAppender(rollingFileAppender);  // 在根上添加輸出器
    }

    /**
     * 配置類似LogCat的日志輸出
     */
    private void configureLogCatAppender() {
        final Logger root = Logger.getRootLogger();
        final Layout logCatLayout = new PatternLayout(getLogCatPattern());
        final LogCatAppender logCatAppender = new LogCatAppender(logCatLayout);

        root.addAppender(logCatAppender);
    }
}

上面是配置類,我都寫有簡單的注釋,具體的log4j的配置,請參看官網。下面是調用類。
  

package com.csshu.helper;

import java.io.File;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;

import com.csshu.util.Config;

public class AppLogger {
    private static boolean isInitConfig = false;
    private static final Logger log = Logger.getRootLogger();

    private AppLogger() {
    }

    /**
     * 私有構造器
     */
    private static void initConfig() {
        if (!isInitConfig) {

            AppLogConfigurator logConfiger = new AppLogConfigurator();
            // 設置Log4j的輸出路徑文件夾
            String rootPath = Config.PATH;
            File dirFile = new File(rootPath);  
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            } // 文件夾准備

            // 其實這下面可以做成一個生成器的設計模式
            logConfiger.setFileName(rootPath + File.separator + "pressure.log");  // 設置文件名字
            logConfiger.setRootLevel(Level.DEBUG); // 設置調試等級
            
            logConfiger.setUseFileAppender(true); // 設置用戶文件輸出器
            logConfiger.setFilePattern("%d - [%p::%t] - %m%n"); // 設置文件輸出模式
            logConfiger.setImmediateFlush(true); // 設置是否立即刷新
            logConfiger.setInternalDebugging(false);
            logConfiger.setMaxBackupSize(20); // 設置最大備份數量
            logConfiger.setMaxFileSize(1024 * 1024); // 設置最大文件數量

            logConfiger.setUseLogCatAppender(true);
            logConfiger.setLogCatPattern("%m%n");
            logConfiger.configure();
            isInitConfig = true;
        }
    }

    public static void v(String msg) {
        initConfig();
        log.debug(buildMessage(msg));

    }

    public static void v(String msg, Throwable thr) {
        initConfig();
        log.debug(buildMessage(msg), thr);
    }

    public static void d(String msg) {
        initConfig();
        log.debug(buildMessage(msg));
    }

    public static void d(String msg, Throwable thr) {
        initConfig();
        log.debug(buildMessage(msg), thr);
    }

    public static void i(String msg) {
        initConfig();
        log.info(buildMessage(msg));
    }

    public static void i(String msg, Throwable thr) {
        initConfig();
        log.info(buildMessage(msg), thr);
    }

    public static void w(String msg) {
        initConfig();
        log.warn(buildMessage(msg));
    }

    public static void w(String msg, Throwable thr) {
        initConfig();
        log.warn(buildMessage(msg), thr);
    }

    public static void w(Throwable thr) {
        initConfig();
        log.warn(buildMessage(""), thr);
    }

    public static void e(String msg) {
        initConfig();
        log.error(buildMessage(msg));
    }

    public static void e(String msg, Throwable thr) {
        initConfig();
        log.error(buildMessage(msg), thr);
    }

    /**
     * 生成消息
     * @param msg
     * @return
     */
    protected static String buildMessage(String msg) {
        initConfig();
        StackTraceElement caller = new Throwable().fillInStackTrace()
                .getStackTrace()[2];

        return new StringBuilder().append(caller.getClassName()).append(".")
                .append(caller.getMethodName()).append("(): ").append(msg)
                .toString();
    }
}

  如果只是單純的設置輸出到文件中,這樣就可以了,具體路徑參看配置。下次直接調用下面一個類的靜態方法。注意寫權限的設置。

  考慮更加集成一點,可以把Logcat的也集中放在log4j的appender中,做到一個配置,多個輸出。

  另外作為幫助類,寫一個異常處理類,也是有必要咯,下次再表。

  

  


免責聲明!

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



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