对于 Apache Http Components 5.x 版本,您需要使用
slf4j
日志门面,例如
JUL
(Jakarta Common Logging)来在编译时绑定日志后端。
implementation 'org.slf4j:slf4j-jdk14:2.0.0-alpha7'
通过以下方式检索root
记录器
final Logger rootLogger = java.util.logging.Logger.getLogger("");
或者
final Logger rootLogger = java.util.logging.LogManager.getLogManager().getLogger("")
将日志级别设置为适当的级别,否则消息将被丢弃
rootLogger.setLevel(Level.ALL);
实现自己的java.util.logging.Handler
以接收消息
public static class LogHandler extends Handler {
@Override
public void close() {
}
@Override
public void flush() {
}
@Override
public void publish(LogRecord record) {
final Level level = record.getLevel();
if (level == Level.INFO) {
Log.i(record.getLoggerName(), record.getMessage());
} else if (level == Level.WARNING) {
Log.w(record.getLoggerName(), record.getMessage());
} else if (level == Level.SEVERE) {
Log.e(record.getLoggerName(), record.getMessage());
} else if (level == Level.FINE) {
Log.d(record.getLoggerName(), record.getMessage());
} else {
Log.v(record.getLoggerName(), record.getMessage());
}
}
}
设置处理程序
final LogHandler logHandler = new LogHandler();
rootLogger.addHandler(logHandler);
并且对于模块,还有一个“setLevel”函数的好处。需要一个容器来保持对未初始化的外部记录器的强引用,否则垃圾收集器将会释放它们,而“level”参数将被设置为默认值。
private static HashMap<String, Logger> sLoggerMap = new HashMap<>();
用于保存模块
的类
public static class Module {
final String mModule;
public static final Module APACHE_HTTP = new Module("org.apache.hc.client5.http");
public static final Module APACHE_HTTP_WIRE = new Module("org.apache.hc.client5.http.wire");
public static final Module APACHE_HTTP_HEADERS = new Module("org.apache.hc.client5.http.headers");
Module(final String module) {
mModule = module;
}
}
使用函数
public static void setLogging(final Module module, final Level level) {
Logger logger = sLoggerMap.get(module.mModule);
if (logger == null) {
logger = Logger.getLogger(module.mModule);
sLoggerMap.put(module.mModule, logger);
}
logger.setLevel(level);
}
然后像这样使用它(我将所有内容封装在Logging
类中)
Logging.setLogging(Logging.Module.APACHE_HTTP_WIRE, Level.FINE);
当请求是异步的时候,它也有自己的缺点。切换日志级别将影响所有正在进行的请求。
对于发布版本,请在proguard-rules.pro
中添加以下内容。
-keep class org.apache.hc.client5.http.** {
<fields>;
<methods>;
}
java.util.logging.Logger.getLogger("org.apache.http.headers").setLevel(java.util.logging.Level.FINEST);
。我不需要设置任何Java系统属性。 - AlikElzin-kilaka