首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android上配置java.util.logging?

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

Stack Overflow用户
提问于 2010-12-30 17:11:43
回答 5查看 21.7K关注 0票数 28

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

谢谢

EN

回答 5

Stack Overflow用户

发布于 2012-01-29 01:27:38

这是我的一个项目的常见问题解答,希望更多的人能在这里找到这个: java.util.logging在安卓上运行良好。请不要在您的代码中使用其他任何东西,日志记录框架就像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

下面是如何修复它的方法:

代码语言:javascript
复制
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;
        }
    }
}

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

代码语言:javascript
复制
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

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

adb TL;DR:是的,您可以使用一些神奇的属性或adb shell命令,甚至可以学习愚蠢的内置日志记录处理程序的DalvikLogging.loggerNameToTag如何将类别名称转换为标记(对于这些神奇的属性和shell命令,您必须这样做),但何必呢?记录日志还不够痛苦吗?

票数 62
EN

Stack Overflow用户

发布于 2010-12-30 17:23:17

通常使用android.util.Log登录安卓系统。使用该记录器有一些关键的优点,例如能够使用adb logcat查看发送到这些日志的日志记录输出。

您可以尝试将logging.properties放入assets/res/raw/中。如果安卓没有接收到这些,那么你可以使用java.util.logging.LogManager.readConfiguration(java.io.InputStream)来强制加载。(您可以使用Resources和AssetManager类来获取InputStream形式的文件)。

票数 4
EN

Stack Overflow用户

发布于 2014-02-21 07:50:45

至少在Android 4.3上使用未更改的处理程序,如果您使用

代码语言:javascript
复制
adb shell setprop log.tag.YOURTAG DEBUG

您可以在logcat中看到最多使用Level.FINE记录的消息。我还没有想出一种记录更高级别的方法,但这对我来说已经足够了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4561345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档