天天看點

Android 中的log4j使用

在前一篇文章中講到了log4j 2.x版本的使用,一般來說,log4j都是使用在java開發中,安卓需要中無法直接使用log4j,需要其他的配置才能使用。要在Android開發中使用log4j,需要配置幾個jar包。我使用的包分别為1)log4j-1.2.17.jar,2)android-logging-log4j-1.0.3.jar,3)slf4j-api-1.7.6.jar。其中android-logging-log4j-1.0.3.jar是專門開發來使log4j能夠用在Android中的。下載下傳這三個包之後,配置好工程中的路徑,在工程下添加一個logback.xml檔案,檔案内容如下:

<configuration debug="true"> 

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are  by default assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
           

然後需要一個配置類,配置類是在最初運作時配置log的一些屬性,比如log檔案的名字,log的格式,log的存放位置等等。我們把配置類設計成單執行個體類,命名為ConfigureLog4J,在我的工程中其代碼如下:

import java.io.File;

import org.apache.log4j.*;
import org.apache.log4j.LogManager;

import android.os.Environment;
import de.mindpipe.android.logging.log4j.LogConfigurator;



public enum ConfigureLog4J {
	
	INSTANCE;
	
	private LogConfigurator log_config = null;
	
	private final String directory = Environment.getExternalStorageDirectory() + File.separator + "/single_execution";
	private final String file_name = this.directory + "/execution.txt";
	
    public void configure() 
    {
    	if (this.log_config == null)
    	{
	        log_config = new LogConfigurator();
	        
	        log_config.setFileName(file_name);
	        log_config.setMaxFileSize(50 * 1024 * 1024);	// 50MB
	        log_config.setRootLevel(Level.DEBUG);
	        log_config.setFilePattern("%d{HH:mm:ss.S} %-5l - %m%n");
	        log_config.setUseLogCatAppender(false);
	        
	        
	        log_config.setImmediateFlush(false);
	        
	        // Set log level of a specific logger
	        log_config.setLevel("ics.mobilememo", Level.DEBUG);
	        
	        log_config.configure();
    	}
    }
    
    /**
     * @return {@link #directory}: directory containing all the execution-related files
     */
    public String getDirectory()
    {
    	return this.directory;
    }
    
    /**
     * @return {@link #file_name}: name of file in which the logs are stored
     */
    public String getFileName()
    {
    	return this.file_name;
    }
    
    /**
     * Shut down the logger and let all buffered logs get flushed.
     * See http://stackoverflow.com/a/3078377/1833118
     */
    public void shutdown()
    {
    	LogManager.shutdown();
    }
}
           

shutdown()是log結束時必須要調用的,否則log不會寫到檔案中,檔案寫失敗。

寫好這些,就可以開始使用了,我寫了一個BatteryActivity的安卓工程來測試,

private final Logger log4android = Logger.getLogger(BatteryActivity.class);
           

在運作初始時,調用

ConfigureLog4J.INSTANCE.configure();
           

然後就可以使用log4j了。像這樣:

log4android.debug("hello world");
           

在Activity的onDestroy()中調用

ConfigureLog4J.INSTANCE.shutdown();
           

當應用運作結束,被銷毀時,就可以得到一個log檔案,log檔案的位置在ConfigureLog4J類的配置所指明的位置。打開log檔案就可以看到寫入的log。