美文网首页
Java Logger 在Android中的理解及定制

Java Logger 在Android中的理解及定制

作者: 小强开学前 | 来源:发表于2022-04-01 00:02 被阅读0次

    Logger 作用

    Logger 对象用于记录特定系统或应用程序组件的消息。
    可以配置输出到控制台、文件、流等。

    比如我们要输出到控制台,那么日志就有对应的级别和具体信息。
    级别就是 java.util.logging.Level
    存在7种打印级别,另外有两种OFFALL可以给 Logger 设置是否禁止打印、是否开启所有打印(过滤打印)

    // OFF (value = Integer.MAX_VALUE)
    SEVERE (highest value) (value = 1000)
    WARNING (value = 900)
    INFO (value = 800)
    CONFIG (value = 700)
    FINE (value = 500)
    FINER (value = 400)
    FINEST (value = 300)
    ALL (value = Integer.MIN_VALUE)
    

    给 Logger 设置级别后,Logger 会忽略这个级别对应值以下的日志消息

    比如有代码如下

    log(Level.SEVERE, "LOG Severe");
    log(Level.WARNING, "LOG Warning");
    log(Level.INFO, "LOG Info");
    log(Level.CONFIG, "LOG Config");
    log(Level.FINE, "LOG Fine");
    

    调用 mLogger.setLevel(Level.INFO)

    LOG Severe
    LOG Warning
    LOG Info
    

    调用 mLogger.setLevel(Level.WARNING)

    LOG Severe
    LOG Warning
    

    调用 mLogger.setLevel(Level.SEVERE)

    LOG Severe
    

    Android 中具体的 Logger 使用

    • 记录日志文件
    String pattern = logDir.getAbsolutePath() + File.separator + "MY_LOG.log";
    // 文件路径,文件大小限制,文件个数限制,是否是追加模式
    FileHandler fileHandler = new FileHandler(pattern, limit, 1, true);
           
    mLogger.addHandler(fileHandler);
    

    定制功能打印

    在第一节中如果调用 mLogger.setLevel(Level.CONFIG) 后输出是

    LOG Severe
    LOG Warning
    LOG Info
    

    为什么??

      1. 为什么我们什么都不做它就会在控制台打印?
      1. 为什么它不遵守之前测试中关于 Level 的规则?

    首先注意到一个方法: Logger#setUseParentHandlers
    设置为 false 后,打印就没有了,它应该是实现在 Console 中打印的功能。

    而根据 StackOverflow 上的这个回答,我们可以知道这个 ParentHandler 它的级别是Level.INFO,所以它不遵循之前说的规则。


    定制自己的 Console 打印

    需求是,Console 与文件行为一致,默认 Level 为 Level.INFO
    网络响应在 CONFIG 级别打印
    Release 环境 Console 不打印任何信息,文件按照 Level 规则处理
    Debug 环境 Console 、文件皆按照 Level 规则处理

     Handler consoleHandler = new Handler() {
         @Override
         public void publish(LogRecord record) {
             if (BuildConfig.DEBUG) {
                if (record.getLevel() == Level.SEVERE){
                     Log.e(mLogger.getName(), record.getMessage());
                 }else if (record.getLevel() == Level.WARNING){
                     Log.w(mLogger.getName(), record.getMessage());
                 }else if (record.getLevel() == Level.INFO){
                     Log.i(mLogger.getName(), record.getMessage());
                 }else if (record.getLevel() == Level.CONFIG){
                     Log.d(mLogger.getName(), record.getMessage());
                 }
             }
         }
         @Override
         public void flush() {
         }
         @Override
         public void close() throws SecurityException {
         }
     };
     mLogger.addHandler(consoleHandler);
    

    相关文章

      网友评论

          本文标题:Java Logger 在Android中的理解及定制

          本文链接:https://www.haomeiwen.com/subject/hxnnjrtx.html