zoukankan      html  css  js  c++  java
  • 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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    1. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n  

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

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
       
      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在CODE上查看代码片派生到我的代码片
       
      1. #它将会输出匹配正则表达式darksd+的日志消息  
      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=darksd+  
      7. logd.appender.console.filter.accept=true  
    • LevelMatchFilter能够输出制定日志等级的消息日志。多个等级之间用逗号隔开。
      [plain] view plaincopy在CODE上查看代码片派生到我的代码片
       
      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在CODE上查看代码片派生到我的代码片
     
    1. logd.appender.console.async=true  

    五、各类消息处理器

    1、ConsoleAppender

    ConsoleAppender能够输出日志消息到命令控制台。
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    1. public class CustomAppender extends StreamAppender  
    2. {  
    3.       @Override  
    4.       public void activateHandler()  
    5.       {  
    6.           //会在第一次激活时调用,你可以用他创建文件或者初始化IO流等。  
    7.       }  
    8.     
    9.       @Override  
    10.       protected void expandAppend(LogMessage msg, String log) throws Exception  
    11.       {  
    12.           //在这里做日志的扩展处理,比如检查文件大小等等  
    13.       }  
    14. }  

    4、SocketAppender

    SocketAppender能够通过TCP协议输出日志消息到服务端。它继承于StreamAppender。
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    1. #logd.additivity = false  
    2. logd.inherit = false  
    3. logd.inherit.darks.logs.test = true  

    七、综合示例

    [plain] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. logd.root=debug,console,FILE  
    2.   
    3. logd.appender.console=ConsoleAppender  
    4. logd.appender.console.layout=PatternLayout  
    5. logd.appender.console.layout.convertor=DefaultPattern  
    6. logd.appender.console.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n  
    7. logd.appender.console.async=false  
    8. logd.appender.console.filter=LevelRangeFilter  
    9. logd.appender.console.filter.levelMin=debug  
    10. logd.appender.console.filter.levelMax=info  
    11. logd.appender.console.filter.accept=false  
    12.   
    13. logd.appender.FILE=FileDateSizeAppender  
    14. logd.appender.FILE.layout=PatternLayout  
    15. logd.appender.FILE.layout.pattern=%d{yyyy-MM-dd HH:mm:ss} %c{1} - %m%n  
    16. logd.appender.FILE.fileName=${user.dir}logslog_${Dyyyy_MM_dd_HH_mm_ss}.txt  
    17. logd.appender.FILE.buffered=true  
    18. logd.appender.FILE.maxSize=10485760  
    19. logd.appender.FILE.keepDay=7  
    20.     
    21. logd.logger.darks.log.test=info  
  • 相关阅读:
    cordova 里js和oc通信原理
    awakeFromNib
    CALayer树形结构
    SDWebImage原理,转载
    gcd多线程
    block的存储形态
    关于weak对象什么时候释放
    Swift是否和OC一样有runtime机制
    大数据基础
    python进行离线打包并安装
  • 原文地址:https://www.cnblogs.com/xiaorenwu702/p/4414106.html
Copyright © 2011-2022 走看看