darks-logs是一款Android、JAVA、WEB通用的日志组件,它的配置方式类似于log4j,但是它具有更加轻量级、易用性更高、高扩展性、支持移动端等特点。根据官网所述,它的最初设计目标是为JAVA、WEB应用与移动端的互相移植提供统一有效的日志组件库。
在使用darks-logs之前,我们需要为它创建一个名叫logd.properties的配置文件。如果你是需要在JAVA或WEB上使用该组件,那么你可以像配置log4j一样将它放在classpath中。
如果是在Android端使用该组件,你需要将logd.properties文件放置在assets目录中,以便能让组件找到它。在放置了logd.properties文件后,为了能让组件获取到assets目录中的配置文件,需要在Android的Application中进行相关的设置。如果需要日志输出捕获的Android应用ANR异常信息,也需要在Application中注册ANR异常处理器。
public class CustomApplication extends Application
{
@Override
public void onCreate()
{
//首先必须设置Application对象
Logger.Android.setApplication(this);
//注册ANR错误处理器
Logger.Android.registerCrashHandler();
super.onCreate();
}
}
如果希望Android应用在捕获到ANR异常后,能回调执行相关的代码,可以在registerCrashHandler方法中设置CallBack。
Logger.Android.registerCrashHandler(new CallBack(){
@Override
public boolean handleMessage(Message msg)
{
//发生ANR异常时执行
new Thread()
{
public void run()
{
Looper.prepare();
Toast.makeText(CustomApplication.this, "The crash has happened.", Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
Thread.sleep(3000);
return true;
}
});
在完成配置文件的放置及必要的参数配置后,我们就可以向配置文件中添加配置参数了。
我们先简单的向logd.properties中添加一个控制台日志处理器。
logd.root=info,console
#logd.appender.console=darks.log.appender.impl.ConsoleAppender
logd.appender.console=ConsoleAppender
logd.appender.console.layout=PatternLayout
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
然后我们在JAVA类中创建一个logger,为了提高效率建议设置成static变量。
static Logger log = Logger.getLogger(TestLogger.class);
static Logger log = Logger.getLogger("darks.logs.test.TestLogger");
static Logger log = Logger.getLogger("TestLogger");
之后我们可以通过多种方式输出不同日志级别的日志信息。
log.debug("This is the darks logs hello world.");
log.info("Info message will be output");
log.error("Happen a exception. Cause " + e.getMessage(), e);
如果你需要进行比较多的字符串拼接,或者对部分日志信息进行格式化。这样的输出方式可以提高一部分效率。
log.append("darks").append('-').append("logs").info();
log.append(2014).append(1).append(1).debug(e);
log.buffer(2014, " coming ", "now").warn();
log.format("darks-logs was created in %d by %s", 2014, "darks").error(e);
log.append("...").append("...").format("...", ...).info();
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
这段配置信息是为了配置当前消息输出器的日志格式。相关的格式定义如下。
%n, %N: 输出一个回车字符。
%m, %M: 输出消息内容。(也包括异常栈信息)
%e, %E: 输出错误异常栈信息。
%d, %D: 输出日期格式信息,例如 "%d{yyyy-MM-dd HH:mm:ss}".
%c: 输出命名空间或者tags.我们可以使用%c{层数}来输出命名空间中指定的信息。
例如%c{1},如果命名空间是 darks.log.DemoMain,那么它会输出DemoMain。
%C: 输出类名.你也可以使用%C{层数}的方式来输出类名的指定层数。
例如%C{2},如果类全名是darks.log.DemoMain,那么它会输出log.DemoMain。
%f, %F: 输出源文件名称。
%L: 输出源代码行数。
%l: 输出时间信息。包括调用类,线程名,源文件名以及代码行数。
%p, %P: 输出日志级别。
%r, %R: 输出从启动到现在的消耗时间。
%t, %T: 输出当前线程名。
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%f][%p] - %m%n
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{2} - %m%n
layout主要用来格式化消息,你可以使用自带的darks.log.PatternLayout, darks.log.SimpleLayout等layout,你甚至可以继承LoggerLayout自定义实现layout。
#它将会输出debug与info等级之间的消息
logd.appender.console=ConsoleAppender
logd.appender.console.layout=PatternLayout
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
logd.appender.console.filter=LevelRangeFilter
logd.appender.console.filter.levelMin=debug
logd.appender.console.filter.levelMax=info
logd.appender.console.filter.accept=true
#它将会输出匹配正则表达式darks\d+的日志消息
logd.appender.console=ConsoleAppender
logd.appender.console.layout=PatternLayout
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
logd.appender.console.filter=RegexMatchFilter
logd.appender.console.filter.pattern=darks\d+
logd.appender.console.filter.accept=true
#它将会输出debug以及info级别的消息日志
logd.appender.console=ConsoleAppender
logd.appender.console.layout=PatternLayout
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
logd.appender.console.filter=LevelMatchFilter
logd.appender.console.filter.levels=debug,info
logd.appender.console.filter.accept=true
logd.appender.console.async=true
logd.appender.console=ConsoleAppender
logd.appender.console.layout=PatternLayout
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
logd.appender.ANDROID=AndroidAppender
#输出命名空间的指定层数作为logcat的TAG。默认为1.
logd.appender.ANDROID.layer=1
logd.appender.ANDROID.layout=PatternLayout
logd.appender.ANDROID.layout.pattern=%m
public class CustomAppender extends StreamAppender
{
@Override
public void activateHandler()
{
//会在第一次激活时调用,你可以用他创建文件或者初始化IO流等。
}
@Override
protected void expandAppend(LogMessage msg, String log) throws Exception
{
//在这里做日志的扩展处理,比如检查文件大小等等
}
}
logd.appender.SOCKET=SocketAppender
logd.appender.SOCKET.layout=PatternLayout
logd.appender.SOCKET.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
#服务端IP
logd.appender.SOCKET.serverHost=127.0.0.1
#服务端端口
logd.appender.SOCKET.serverPort=8686
#保持alive
logd.appender.SOCKET.keepAlive=true
logd.appender.SOCKET.tcpNoDelay=true
#用头字节封装消息,它会给传输的日志消息加上前置标识以及消息长度。
logd.appender.SOCKET.wrapBytes=true
logd.appender.FILE=FileAppender
logd.appender.FILE.layout=PatternLayout
logd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
logd.appender.FILE.fileName=${user.dir}\log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txt
#logd.appender.FILE.fileName=${sdcard}/log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txt
logd.appender.FILE.buffered=true.
logd.appender.FILE=FileDateSizeAppender
logd.appender.FILE.layout=PatternLayout
logd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
logd.appender.FILE.fileName=${user.dir}\log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txt
logd.appender.FILE.buffered=true
logd.appender.FILE.maxSize=10485760
logd.appender.FILE.keepDay=7
logd.appender.SQLITE=SqliteAppender
logd.appender.SQLITE.layout=PatternLayout
#指定数据库名称
logd.appender.SQLITE.dbName=db_records
#指定版本号
logd.appender.SQLITE.dbVersion=1
#指定表名
logd.appender.SQLITE.table=t_logs
#创建表的语句
logd.appender.SQLITE.createSQL=create table if not exists t_logs(_id integer primary key autoincrement,date text,level text,source integer,file text,message text)
#数据库列映射
logd.appender.SQLITE.columnsMap.date=%d{yyyy-MM-dd HH:mm:ss}
logd.appender.SQLITE.columnsMap.level=%p
logd.appender.SQLITE.columnsMap.source=%L
logd.appender.SQLITE.columnsMap.file=%f
logd.appender.SQLITE.columnsMap.message=%m
#设置darks.log.test包中的日志输出为debug级
logd.logger.darks.log.test=debug
#设置darks.log.test.file包中的日志输出为debug级,并且输出到名为FILE的消息处理器中。
logd.logger.darks.log.test.file=debug,FILE
#设置darks.log包中的日志输出为debug级,并且输出到名为console的消息处理器中。
logd.logger.darks.log=debug,console
#logd.additivity = false
logd.inherit = false
logd.inherit.darks.logs.test = true
logd.root=debug,console,FILE
logd.appender.console=ConsoleAppender
logd.appender.console.layout=PatternLayout
logd.appender.console.layout.convertor=DefaultPattern
logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n
logd.appender.console.async=false
logd.appender.console.filter=LevelRangeFilter
logd.appender.console.filter.levelMin=debug
logd.appender.console.filter.levelMax=info
logd.appender.console.filter.accept=false
logd.appender.FILE=FileDateSizeAppender
logd.appender.FILE.layout=PatternLayout
logd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
logd.appender.FILE.fileName=${user.dir}\logs\log_${Dyyyy_MM_dd_HH_mm_ss}.txt
logd.appender.FILE.buffered=true
logd.appender.FILE.maxSize=10485760
logd.appender.FILE.keepDay=7
logd.logger.darks.log.test=info