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中,做到一个配置,多个输出。

  另外作为帮助类,写一个异常处理类,也是有必要咯,下次再表。

  

  

时间: 2024-10-19 12:49:59

Android中log4j的运用的相关文章

Android中使用log4j输出log内容到sd卡

在android中,实现输出log内容到sd卡中的文件里面,做法是: 还是相对来说,log4j,算是好用. 1.下载android的log4j的库(的封装) 去:http://code.google.com/p/android-logging-log4j/ 下载对应的android-logging-log4j-1.0.3.jar,加到项目中. 2.再去下载所依赖的apache的log4j库 去:http://logging.apache.org/log4j/1.2/download.html 下

Android中使用log4j

在android中,实现输出log内容到sd卡中的文件里面,做法是: 1.导入者两个jar包 2.测试代码 import de.mindpipe.android.logging.log4j.LogConfigurator; import java.io.File; import android.os.Environment; import org.apache.log4j.Level; import org.apache.log4j.Logger;   public class BaseActi

在android中配置 slf4j + log4j 日志记录框架

需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j 框架来实现.slf4j 是日志记录的一个facade,支持多种日志框架.log4j是个很优秀的日志记录框架. 实现: 下载类库: 先到各主站点下载类库 slf4j 网址 :http://www.slf4j.org/download.html log4j网址: http://logging.apach

Android 使用Log4j把日志写入SD卡,动态修改输出文件名称

一.Log4j简单使用 1. 下载log4j.jar http://logging.apache.org/log4j/2.x/ 2. 创建Java代码 public class Loggers { public static Logger logger = Logger. getLogger(Loggers. class); public static void init() { try { PatternLayout patternLayout = new PatternLayout(); p

谈谈-Android中的接口回调技术

Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James对Android接口回调技术的理解(结合前人的知识和自己的实践). 使用一个比喻很形象地说明:客户端有个疑问打电话请教服务端,但服务端无法现场给出解答,相互之间约定:服务端一旦有答案,使用电话的方式反馈给客户端. 以上有三个主体:客户端.服务端和接口(方式). 接口回调的原理框图说明: Demo界面

关于android中事件传递和分发的一些小理解

android中 当我们的手指触摸屏幕将产生一个事件, (假设 这个过程中如果没有显示的去拦截该事件的话)   这个事件会逐级传递到视图的最底层,即使在中间某些视图会响应这个事件( 这个视图也不会去消费这个事件),     仍然是会传递到底层(底层不响应该事件),然后再由底层回传到顶层,在传回顶层的过程中 ,   原先会响应该事件的视图才会去消费这个事件 例如在左图中                                 A                               

浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

Android中监听ListView滑动到底部

Android中的应用就是ListView中向下滑动加载更多的功能,不要再onScroll方法中进行判断,那样当滑动到底部的时候,可能我们需要触发点什么事件,比如加载更多.隐藏某个控件等等. 第一种方法是直接滑动到底部就触发 listview.setOnScrollListener(new OnScrollListener(){       @Override       public void onScrollStateChanged(AbsListView view, int scrollS

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来