Logger 作用
Logger 对象用于记录特定系统或应用程序组件的消息。
可以配置输出到控制台、文件、流等。
比如我们要输出到控制台,那么日志就有对应的级别和具体信息。
级别就是 java.util.logging.Level
存在7种打印级别,另外有两种OFF
和ALL
可以给 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
为什么??
- 为什么我们什么都不做它就会在控制台打印?
- 为什么它不遵守之前测试中关于 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);
网友评论