Java Logger 在Android中的理解及定制

2022-04-01  本文已影响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

为什么??

首先注意到一个方法: 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);
上一篇 下一篇

猜你喜欢

热点阅读