Android日志框架darks-logs使用教程

一、配置文件

在使用darks-logs之前,我们需要为它创建一个名叫logd.properties的配置文件。如果你是需要在JAVA或WEB上使用该组件,那么你可以像配置log4j一样将它放在classpath中。

如果是在Android端使用该组件,你需要将logd.properties文件放置在assets目录中,以便能让组件找到它。在放置了logd.properties文件后,为了能让组件获取到assets目录中的配置文件,需要在Android的Application中进行相关的设置。如果需要日志输出捕获的Android应用ANR异常信息,也需要在Application中注册ANR异常处理器。

[java] view plaincopy

  1. public class CustomApplication extends Application
  2. {
  3. @Override
  4. public void onCreate()
  5. {
  6. //首先必须设置Application对象
  7. Logger.Android.setApplication(this);
  8. //注册ANR错误处理器
  9. Logger.Android.registerCrashHandler();
  10. super.onCreate();
  11. }
  12. }

如果希望Android应用在捕获到ANR异常后,能回调执行相关的代码,可以在registerCrashHandler方法中设置CallBack。

[java] view plaincopy

  1. Logger.Android.registerCrashHandler(new CallBack(){
  2. @Override
  3. public boolean handleMessage(Message msg)
  4. {
  5. //发生ANR异常时执行
  6. new Thread()
  7. {
  8. public void run()
  9. {
  10. Looper.prepare();
  11. Toast.makeText(CustomApplication.this, "The crash has happened.", Toast.LENGTH_LONG).show();
  12. Looper.loop();
  13. }
  14. }.start();
  15. Thread.sleep(3000);
  16. return true;
  17. }
  18. });

默认的配置文件加载器会从Java的classpath以及Android的assets中加载配置文件,如果你需要从其他特别的地方加载配置文件(例如sdcard、raw等等)。你可以自定义加载器,并通过Logger.Config.setCustomLoader(...)进行设置。在后续版本中会增加加载路径的自定义设置,从而不需要自定义加载器,除非你有特别需求。

二、简单使用

在完成配置文件的放置及必要的参数配置后,我们就可以向配置文件中添加配置参数了。

我们先简单的向logd.properties中添加一个控制台日志处理器。

[plain] view plaincopy

  1. logd.root=info,console
  2. #logd.appender.console=darks.log.appender.impl.ConsoleAppender
  3. logd.appender.console=ConsoleAppender
  4. logd.appender.console.layout=PatternLayout
  5. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n

然后我们在JAVA类中创建一个logger,为了提高效率建议设置成static变量。

[java] view plaincopy

  1. static Logger log = Logger.getLogger(TestLogger.class);
  2. static Logger log = Logger.getLogger("darks.logs.test.TestLogger");
  3. static Logger log = Logger.getLogger("TestLogger");

之后我们可以通过多种方式输出不同日志级别的日志信息。

[java] view plaincopy

  1. log.debug("This is the darks logs hello world.");
  2. log.info("Info message will be output");
  3. log.error("Happen a exception. Cause " + e.getMessage(), e);

如果你需要进行比较多的字符串拼接,或者对部分日志信息进行格式化。这样的输出方式可以提高一部分效率。

[java] view plaincopy

  1. log.append("darks").append(‘-‘).append("logs").info();
  2. log.append(2014).append(1).append(1).debug(e);
  3. log.buffer(2014, " coming ", "now").warn();
  4. log.format("darks-logs was created in %d by %s", 2014, "darks").error(e);
  5. log.append("...").append("...").format("...", ...).info();

三、日志消息格式化

在简单使用中我们设置了一个控制台日志输出器,其中配置了

[plain] view plaincopy

  1. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n

这段配置信息是为了配置当前消息输出器的日志格式。相关的格式定义如下。

[plain] view plaincopy

  1. %n, %N: 输出一个回车字符。
  2. %m, %M: 输出消息内容。(也包括异常栈信息)
  3. %e, %E: 输出错误异常栈信息。
  4. %d, %D: 输出日期格式信息,例如 "%d{yyyy-MM-dd HH:mm:ss}".
  5. %c:     输出命名空间或者tags.我们可以使用%c{层数}来输出命名空间中指定的信息。
  6. 例如%c{1},如果命名空间是 darks.log.DemoMain,那么它会输出DemoMain。
  7. %C:     输出类名.你也可以使用%C{层数}的方式来输出类名的指定层数。
  8. 例如%C{2},如果类全名是darks.log.DemoMain,那么它会输出log.DemoMain。
  9. %f, %F: 输出源文件名称。
  10. %L:     输出源代码行数。
  11. %l:     输出时间信息。包括调用类,线程名,源文件名以及代码行数。
  12. %p, %P: 输出日志级别。
  13. %r, %R: 输出从启动到现在的消耗时间。
  14. %t, %T: 输出当前线程名。

例如:

[plain] view plaincopy

  1. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%f][%p] - %m%n
  2. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{2} - %m%n

四、消息处理器

Appender是所有消息处理器的基类,它可以配置layout、filter等等,你可以通过继承该类去自定义化输出,比如将日志输出到Android的UI上。

1、layout

layout主要用来格式化消息,你可以使用自带的darks.log.PatternLayout, darks.log.SimpleLayout等layout,你甚至可以继承LoggerLayout自定义实现layout。

  • PatternLayout能够灵活的通过输出格式输出日志信息。例如%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n。
  • SimpleLayout能够输出较为简单的日志I型逆袭。例如:level - message

2、filter

filter能够通过指定的规则过滤日志消息。

  • LevelRangeFilter能够输出最小等级与最大等级之间的日志消息。

    [plain] view plaincopy

    1. #它将会输出debug与info等级之间的消息
    2. logd.appender.console=ConsoleAppender
    3. logd.appender.console.layout=PatternLayout
    4. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
    5. logd.appender.console.filter=LevelRangeFilter
    6. logd.appender.console.filter.levelMin=debug
    7. logd.appender.console.filter.levelMax=info
    8. logd.appender.console.filter.accept=true
  • RegexMatchFilter能够输出匹配指定的正则表达式的日志消息。

    [plain] view plaincopy

    1. #它将会输出匹配正则表达式darks\d+的日志消息
    2. logd.appender.console=ConsoleAppender
    3. logd.appender.console.layout=PatternLayout
    4. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
    5. logd.appender.console.filter=RegexMatchFilter
    6. logd.appender.console.filter.pattern=darks\d+
    7. logd.appender.console.filter.accept=true
  • LevelMatchFilter能够输出制定日志等级的消息日志。多个等级之间用逗号隔开。

    [plain] view plaincopy

    1. #它将会输出debug以及info级别的消息日志
    2. logd.appender.console=ConsoleAppender
    3. logd.appender.console.layout=PatternLayout
    4. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
    5. logd.appender.console.filter=LevelMatchFilter
    6. logd.appender.console.filter.levels=debug,info
    7. logd.appender.console.filter.accept=true

3、async

设置了async的日志处理器能够异步的将日志消息输出到日志处理器中。

[plain] view plaincopy

  1. logd.appender.console.async=true

五、各类消息处理器

1、ConsoleAppender

ConsoleAppender能够输出日志消息到命令控制台。

[java] view plaincopy

  1. logd.appender.console=ConsoleAppender
  2. logd.appender.console.layout=PatternLayout
  3. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n

2、AndroidAppender

AndroidAppender能够输出消息到Android的logcat。

[plain] view plaincopy

  1. logd.appender.ANDROID=AndroidAppender
  2. #输出命名空间的指定层数作为logcat的TAG。默认为1.
  3. logd.appender.ANDROID.layer=1
  4. logd.appender.ANDROID.layout=PatternLayout
  5. logd.appender.ANDROID.layout.pattern=%m

3、StreamAppender

StreamAppender是流式输出的基础类。你不能直接的使用它,而是必须创建一个继承于它的类去实现流式的输出。你能够使用它将消息输出到文件、网络等地方。

[java] view plaincopy

  1. public class CustomAppender extends StreamAppender
  2. {
  3. @Override
  4. public void activateHandler()
  5. {
  6. //会在第一次激活时调用,你可以用他创建文件或者初始化IO流等。
  7. }
  8. @Override
  9. protected void expandAppend(LogMessage msg, String log) throws Exception
  10. {
  11. //在这里做日志的扩展处理,比如检查文件大小等等
  12. }
  13. }

4、SocketAppender

SocketAppender能够通过TCP协议输出日志消息到服务端。它继承于StreamAppender。

[java] view plaincopy

  1. logd.appender.SOCKET=SocketAppender
  2. logd.appender.SOCKET.layout=PatternLayout
  3. logd.appender.SOCKET.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
  4. #服务端IP
  5. logd.appender.SOCKET.serverHost=127.0.0.1
  6. #服务端端口
  7. logd.appender.SOCKET.serverPort=8686
  8. #保持alive
  9. logd.appender.SOCKET.keepAlive=true
  10. logd.appender.SOCKET.tcpNoDelay=true
  11. #用头字节封装消息,它会给传输的日志消息加上前置标识以及消息长度。
  12. logd.appender.SOCKET.wrapBytes=true

5、FileAppender

FileAppender能够输出日志消息到文件。它继承于StreamAppender。如果你想创建动态的文件名,你可以使用${PROPERTY_VARIABLE}获得System.getProperty的值。如果你想获得Android的SDCARD目录,你可以通过${sdcard}去获得sdcard的绝对路径。如果你想在文件名上加上日期或者时间,你可以使用${D[日期格式]},例如${Dyyyy_MM_dd_HH_mm_ss}。

[plain] view plaincopy

  1. logd.appender.FILE=FileAppender
  2. logd.appender.FILE.layout=PatternLayout
  3. logd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
  4. logd.appender.FILE.fileName=${user.dir}\log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txt
  5. #logd.appender.FILE.fileName=${sdcard}/log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txt
  6. logd.appender.FILE.buffered=true.

6、FileDateSizeAppender

FileDateSizeAppender能够保证日志文件在指定的大小及日期范围内。它的日志文件默认保留时间为7天,它的默认保留大小为10MB,如果超出指定大小将新建一个日志文件。它的相关属性继承于FileAppender。

[plain] view plaincopy

  1. logd.appender.FILE=FileDateSizeAppender
  2. logd.appender.FILE.layout=PatternLayout
  3. logd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
  4. logd.appender.FILE.fileName=${user.dir}\log_${Dyyyy_MM_dd_HH_mm_ss_SS}.txt
  5. logd.appender.FILE.buffered=true
  6. logd.appender.FILE.maxSize=10485760
  7. logd.appender.FILE.keepDay=7

7、StorgeAppender

StorgeAppender能够输出日志消息到数据库中,它与StreamAppender一样不能直接使用,而是通过创建继承于它的功能实现类。它能将消息输出到mysql、sqlite、oracle等数据库中。

8、SqliteAppender

SqliteAppender能够输出日志消息到Android的sqlite数据库中。它继承于StorgeAppender。

[plain] view plaincopy

  1. logd.appender.SQLITE=SqliteAppender
  2. logd.appender.SQLITE.layout=PatternLayout
  3. #指定数据库名称
  4. logd.appender.SQLITE.dbName=db_records
  5. #指定版本号
  6. logd.appender.SQLITE.dbVersion=1
  7. #指定表名
  8. logd.appender.SQLITE.table=t_logs
  9. #创建表的语句
  10. 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)
  11. #数据库列映射
  12. logd.appender.SQLITE.columnsMap.date=%d{yyyy-MM-dd HH:mm:ss}
  13. logd.appender.SQLITE.columnsMap.level=%p
  14. logd.appender.SQLITE.columnsMap.source=%L
  15. logd.appender.SQLITE.columnsMap.file=%f
  16. logd.appender.SQLITE.columnsMap.message=%m

六、命名空间分类

你可以使用logd.logger.[命名空间]的方式单独为每个命名空间指定logger。

[plain] view plaincopy

  1. #设置darks.log.test包中的日志输出为debug级
  2. logd.logger.darks.log.test=debug
  3. #设置darks.log.test.file包中的日志输出为debug级,并且输出到名为FILE的消息处理器中。
  4. logd.logger.darks.log.test.file=debug,FILE
  5. #设置darks.log包中的日志输出为debug级,并且输出到名为console的消息处理器中。
  6. logd.logger.darks.log=debug,console

指定包的子logger设置可以将消息输出到指定的日志处理器中,但同时也会输出到root的日志处理器中。为了避免日志被输出两次,你可以使用inherit关闭指定命名空间或者整体都不输出到root的logger中。

[plain] view plaincopy

  1. #logd.additivity = false
  2. logd.inherit = false
  3. logd.inherit.darks.logs.test = true

七、综合示例

[plain] view plaincopy

  1. logd.root=debug,console,FILE
  2. logd.appender.console=ConsoleAppender
  3. logd.appender.console.layout=PatternLayout
  4. logd.appender.console.layout.convertor=DefaultPattern
  5. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n
  6. logd.appender.console.async=false
  7. logd.appender.console.filter=LevelRangeFilter
  8. logd.appender.console.filter.levelMin=debug
  9. logd.appender.console.filter.levelMax=info
  10. logd.appender.console.filter.accept=false
  11. logd.appender.FILE=FileDateSizeAppender
  12. logd.appender.FILE.layout=PatternLayout
  13. logd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n
  14. logd.appender.FILE.fileName=${user.dir}\logs\log_${Dyyyy_MM_dd_HH_mm_ss}.txt
  15. logd.appender.FILE.buffered=true
  16. logd.appender.FILE.maxSize=10485760
  17. logd.appender.FILE.keepDay=7
  18. logd.logger.darks.log.test=info
时间: 2024-10-16 18:42:17

Android日志框架darks-logs使用教程的相关文章

Java 日志框架终极教程

概述 对于现代的 Java 应用程序来说,只要被部署到真实的生产环境,其日志的重要性就是不言而喻的,很难想象没有任何日志记录功能的应用程序被运行于生产环境中.日志 API 所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息.状态信息.调试信息和执行时间信息等.在生产环境中,日志是查找问题来源的重要依据,应用程序运行时的产生的各种重要信息,都应该通过日志 API 来进行记录. 很多Java开发人员习惯于使用 System.out.println.System.err.println 以及

开源日志框架Exceptionless使用教程

原文:开源日志框架Exceptionless使用教程 Exceptionless是一款日志记录框架,它开源.免费.提供管理界面.易于安装和使用.ExceptionLess底层采用ElasticSearch作为日志存储,提供了快速.丰富的查询API,方便我们进行系统集成.本文将介绍ExceptionLess的常见用法. 安装ExceptionLess 在ExceptionLess官网提供了基于Docker的私有化部署方式,我们可以按照官网的方式进行测试环境的安装. 在官网github中下载最新的r

Java-最常用的Java日志框架整理

前言 Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在运行维护阶段,日志系统又可以帮我们记录大部分的异常信息,从而帮助我们更好的完善系统.本文要来分享一些Java程序员最常用的Java日志框架组件.1.log4j – 最受欢迎的Java日志组件 Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信息输出到控制台.文件.用户

Java程序员最常用的8个Java日志框架

1.Log4j – 最受欢迎的Java日志组件 Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信息输出到控制台.文件.用户界面,也可以输出到操作系统的事件记录器和一些系统常驻进程.更值得一提的是,Log4j可以允许你非常便捷地自定义日志格式和日志等级,可以帮助开发人员全方位地掌控日志信息. 官方网站:http://logging.apache.org/log4j/2.x/ 下面是使用Log4j的一个简单例子: 2.gclogviewer – Java日志查看工

转:Java程序员最常用的8个Java日志框架

作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在运行维护阶段,日志系统又可以帮我们记录大部分的异常信息,从而帮助我们更好的完善系统.本文要来分享一些Java程序员最常用的Java日志框架组件. 1.Log4j – 最受欢迎的Java日志组件 Log4j是一款基于Java的开源日志组件,Log4j功能非常强大,我们可以将日志信息输出到控制台.文件.

Android日志系统Logcat源代码简要分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6606957 在前面两篇文章Android日志系统驱动程序Logger源代码分析和Android应用程序框架层和系统运行库层日志系统源代码中,介绍了Android内核空间层.系统运行库层和应用程序框架层日志系统相关的源代码,其中,后一篇文章着重介绍了日志的写入操作.为了描述完整性,这篇文章着重介绍日志的读取操作,这就是我们在开发Android应用

【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

[军哥谈CI框架]之入门教程之第二讲:分析CI结构和CI是怎么工作的 By hzp123   at 2014-02-18   265 阅读   0 回复   0.0 希赛币 之入门教程之第二讲:分析CI结构和CI是如何工作的大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们,要知道这才刚刚开始额~~~ 这一节,我们主要来了解CI的文件结构和CI是如何工作的.这一点特别的重要! 一.CI的文件结构:了解CI的文件结构可以帮助我们快速的对CI框架有一个整体的认识,就好像我们去

IDEA整合日志框架Log4j2+Slf4j详细配置过程

日志框架这么多,他们之间到底是什么关系呢?笼统的讲就是slf4j是一系列的日志接口,而log4j2.logback是具体实现了接口功能的日志框架.现在的主流日志接口都使用slf4j,而日志的实现就见仁见智了,至于他们的关系请自行百度,此处选择log4j2作为实现框架.网上看到的教程要么对代码没有解释,对新手不友好:要么时间比较久远,跟不上时代.这里使用新版本并结合大量注释,力求简洁明了,有什么问题欢迎留言交流. 运行环境: log4j2 2.8.1 + slf4j 1.7.25 IntelliJ

ELK日志框架(1):安装Elasticsearch组建单服务器多节点集群

原文:ELK日志框架(1):安装Elasticsearch组建单服务器多节点集群 ELK简介 最近有个需求搭建一套日志系统用于集成几个业务系统的日志提供快速的检索功能,目前是用Log4net存数据库+Error级别发邮件方式,也算简单暴力好用,但历史日志的模糊查询确实很慢,所以使用ELK是比较理想的解决方案.三年前写过两篇文章log4net.NoSql +ElasticSearch 实现日志记录和log4net.redis+logstash+kibana+elasticsearch+redis