网上一查关于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中,做到一个配置,多个输出。
另外作为帮助类,写一个异常处理类,也是有必要咯,下次再表。
时间: 2024-10-19 12:49:59