gpt4 book ai didi

android - 如何在 Android 上配置 java.util.logging?

转载 作者:IT老高 更新时间:2023-10-28 22:19:46 27 4
gpt4 key购买 nike

我想在 Android 上使用 java.util.logging。我想用 logging.properties 配置日志系统。但是我怎样才能告诉 Android 使用特定的配置文件呢?例如,我将 logging.properties 放在应用程序的类路径根目录中。 Android 如何知道 logging.properties 的位置。

谢谢

最佳答案

现在这是我的一个项目的常见问题解答,希望更多人会在这里找到它:java.util.logging 在 Android 上运行良好。请不要在您的代码中使用任何其他内容,日志框架就像 Java 世界中的害虫。

Android 附带的默认日志处理程序被破坏了,它会忽略任何级别高于 INFO 的日志消息。您看不到 DEBUG 等消息。

原因是AndroidHandler.java中对Log.isLoggable()的调用:

https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/logging/AndroidHandler.java

以下是解决方法:

import android.util.Log;
import java.util.logging.*;

/**
* Make JUL work on Android.
*/
public class AndroidLoggingHandler extends Handler {

public static void reset(Handler rootHandler) {
Logger rootLogger = LogManager.getLogManager().getLogger("");
Handler[] handlers = rootLogger.getHandlers();
for (Handler handler : handlers) {
rootLogger.removeHandler(handler);
}
rootLogger.addHandler(rootHandler);
}

@Override
public void close() {
}

@Override
public void flush() {
}

@Override
public void publish(LogRecord record) {
if (!super.isLoggable(record))
return;

String name = record.getLoggerName();
int maxLength = 30;
String tag = name.length() > maxLength ? name.substring(name.length() - maxLength) : name;

try {
int level = getAndroidLevel(record.getLevel());
Log.println(level, tag, record.getMessage());
if (record.getThrown() != null) {
Log.println(level, tag, Log.getStackTraceString(record.getThrown()));
}
} catch (RuntimeException e) {
Log.e("AndroidLoggingHandler", "Error logging message.", e);
}
}

static int getAndroidLevel(Level level) {
int value = level.intValue();

if (value >= Level.SEVERE.intValue()) {
return Log.ERROR;
} else if (value >= Level.WARNING.intValue()) {
return Log.WARN;
} else if (value >= Level.INFO.intValue()) {
return Log.INFO;
} else {
return Log.DEBUG;
}
}
}

在您的应用程序的主要 Activity/初始化代码中:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

AndroidLoggingHandler.reset(new AndroidLoggingHandler());
java.util.logging.Logger.getLogger("my.category").setLevel(Level.FINEST);
...

TL;DR: 是的,你可以使用一些神奇的属性,或 adb shell 命令,甚至了解愚蠢的内置日志处理程序的 DalvikLogging.loggerNameToTag 是如何转换的类别名称到标签(对于那些神奇的属性和 shell 命令,您必须这样做),但为什么要麻烦呢?伐木还不够痛苦吗?

关于android - 如何在 Android 上配置 java.util.logging?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4561345/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com