目前在进行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 = * * ;
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类引用即可。
 

Android中使用Log4j及配置说明的更多相关文章

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

    需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...

  2. Android中log4j的运用

    网上一查关于android上面运用Log4j的运用,各种说需要添加多样的包的,照着log4j的官网教程看了下,给了个简单的输出到console上面的代码,似乎没什么用.看网上关于Log4j更多是在ja ...

  3. Android应用中添加Log4j的示例

    [2016-06-30]最新的log4j已经集成在DR_support_lib库中 具体请看: https://coding.net/u/wrcold520/p/DR_support_lib/git/ ...

  4. log4j.properties配置说明

    log4j.properties配置说明 1. log4j配置 # ALL,DEBUG,INFO,WARN,ERROR,FATAL,OFF LOG_LEVEL=INFO log4j.rootLogge ...

  5. Android中的LinearLayout布局

    LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了,  线性布局是按照垂直方向(vertical)或水平方向 ...

  6. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  7. Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)

    之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...

  8. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  9. Android中Fragment和ViewPager那点事儿(仿微信APP)

    在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...

随机推荐

  1. 剑指offer十三之调整数组顺序使奇数位于偶数前面

    一.题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.思路 此题可 ...

  2. opencv实现正交匹配追踪算法OMP

    //dic: 字典矩阵: //signal :待重构信号(一次只能重构一个信号,即一个向量) //min_residual: 最小残差 //sparsity:稀疏度 //coe:重构系数 //atom ...

  3. (转)linux用户态和内核态理解

    原文:https://blog.csdn.net/buptapple/article/details/21454167 Linux探秘之用户态与内核态-----------https://www.cn ...

  4. PTA (Advanced Level) 1006 Sign In and Sign Out

    Sign In and Sign Out At the beginning of every day, the first person who signs in the computer room ...

  5. TDSQL“相似查询工具MSQL+”入选VLDB论文

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 作者介绍:王晓宇,腾讯数据库TDSQL团队成员,目前参与TDSQL数据库内核研发工 ...

  6. 简易的命令行聊天室程序(Winsock,服务器&客户端)

    代码中使用WinSock2函数库,设计并实现了简单的聊天室功能.该程序为命令行程序.对于服务器和客户端,需要: 服务器:创建监听套接字,并按本地主机绑定:主线程监听并接受来自客户端的请求,并为该客户端 ...

  7. WEB开发框架性能排行与趋势分析

    WEB开发框架性能基准测试解读与趋势分析 TechEmpower的<Web Framework Benchmarks>性能基准测试,是关注Web开发框架发展的重要途径.但是内容数据众多,每 ...

  8. Jmeter接口测试动态传参——动态获取token值

    先添加一个线程组,然后在线程组下添加HTTP Request 环境变量: 线程组下添加User Defined Variables 调用变量:${变量名} 添加结果树: 记录登录后的token: 获取 ...

  9. 并发编程之 CyclicBarrier 源码分析

    前言 在之前的介绍 CountDownLatch 的文章中,CountDown 可以实现多个线程协调,在所有指定线程完成后,主线程才执行任务. 但是,CountDownLatch 有个缺陷,这点 JD ...

  10. Nullable<T>、Nullable、null、?修饰符的区别

    这章我们讨论一下Nullable<T>.Nullable.null.?修饰符的区别 原创文章 Nullable<T>的前世今生 讨论它们之前,我们有必要讨论一下Nullable ...