Android中使用Log4j及配置说明
目前在进行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;
}
}
Android中使用Log4j及配置说明的更多相关文章
- 在android中配置 slf4j + log4j 日志记录框架
需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...
- Android中log4j的运用
网上一查关于android上面运用Log4j的运用,各种说需要添加多样的包的,照着log4j的官网教程看了下,给了个简单的输出到console上面的代码,似乎没什么用.看网上关于Log4j更多是在ja ...
- Android应用中添加Log4j的示例
[2016-06-30]最新的log4j已经集成在DR_support_lib库中 具体请看: https://coding.net/u/wrcold520/p/DR_support_lib/git/ ...
- log4j.properties配置说明
log4j.properties配置说明 1. log4j配置 # ALL,DEBUG,INFO,WARN,ERROR,FATAL,OFF LOG_LEVEL=INFO log4j.rootLogge ...
- Android中的LinearLayout布局
LinearLayout : 线性布局 在一般情况下,当有很多控件需要在一个界面列出来时,我们就可以使用线性布局(LinearLayout)了, 线性布局是按照垂直方向(vertical)或水平方向 ...
- Android中BroadcastReceiver的两种注册方式(静态和动态)详解
今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
- Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)
昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...
- Android中Fragment和ViewPager那点事儿(仿微信APP)
在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...
随机推荐
- 剑指offer十三之调整数组顺序使奇数位于偶数前面
一.题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 二.思路 此题可 ...
- opencv实现正交匹配追踪算法OMP
//dic: 字典矩阵: //signal :待重构信号(一次只能重构一个信号,即一个向量) //min_residual: 最小残差 //sparsity:稀疏度 //coe:重构系数 //atom ...
- (转)linux用户态和内核态理解
原文:https://blog.csdn.net/buptapple/article/details/21454167 Linux探秘之用户态与内核态-----------https://www.cn ...
- 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 ...
- TDSQL“相似查询工具MSQL+”入选VLDB论文
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 作者介绍:王晓宇,腾讯数据库TDSQL团队成员,目前参与TDSQL数据库内核研发工 ...
- 简易的命令行聊天室程序(Winsock,服务器&客户端)
代码中使用WinSock2函数库,设计并实现了简单的聊天室功能.该程序为命令行程序.对于服务器和客户端,需要: 服务器:创建监听套接字,并按本地主机绑定:主线程监听并接受来自客户端的请求,并为该客户端 ...
- WEB开发框架性能排行与趋势分析
WEB开发框架性能基准测试解读与趋势分析 TechEmpower的<Web Framework Benchmarks>性能基准测试,是关注Web开发框架发展的重要途径.但是内容数据众多,每 ...
- Jmeter接口测试动态传参——动态获取token值
先添加一个线程组,然后在线程组下添加HTTP Request 环境变量: 线程组下添加User Defined Variables 调用变量:${变量名} 添加结果树: 记录登录后的token: 获取 ...
- 并发编程之 CyclicBarrier 源码分析
前言 在之前的介绍 CountDownLatch 的文章中,CountDown 可以实现多个线程协调,在所有指定线程完成后,主线程才执行任务. 但是,CountDownLatch 有个缺陷,这点 JD ...
- Nullable<T>、Nullable、null、?修饰符的区别
这章我们讨论一下Nullable<T>.Nullable.null.?修饰符的区别 原创文章 Nullable<T>的前世今生 讨论它们之前,我们有必要讨论一下Nullable ...