如何配置的java.util.logging在Android? [英] How to configure java.util.logging on Android?
问题描述
我想使用的java.util.logging在Android上。我想配置日志记录系统logging.properties。但是,我怎么能告诉机器人使用特定的配置文件?例如,我把logging.properties在应用程序的classpath根。如何安卓知道logging.properties的位置。
I want to use java.util.logging on Android. I want to configure the logging system with logging.properties. But how can I tell Android using the specific configure file? For example, I placed the logging.properties in the classpath root of the application. How Android knows the location of logging.properties.
感谢
推荐答案
这是现在的常见问题解答我的项目之一,希望更多的人会在这里找到这样的:java.util.logging的正常工作在Android上。请不要在你的code使用别的,日志框架就像在Java世界中害虫。
This is now an FAQ for one of my projects, hopefully more people will find this here: java.util.logging works fine on Android. Please don't use anything else in your code, logging frameworks are like a pest in the Java world.
什么是坏了是默认的日志处理程序附带的Android,它忽略了与水平亦为信息任何日志消息。你看不到DEBUG等消息。
What is broken is the default logging handler shipped with Android, it ignores any log messages with level finer than INFO. You don't see DEBUG etc. messages.
原因是调用Log.isLoggable()在AndroidHandler.java:
The reason is the call to Log.isLoggable() in AndroidHandler.java:
<一个href="https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/logging/AndroidHandler.java">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);
}
LogManager.getLogManager().getLogger("").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 >= 1000) {
return Log.ERROR;
} else if (value >= 900) {
return Log.WARN;
} else if (value >= 800) {
return Log.INFO;
} else {
return Log.DEBUG;
}
}
}
在应用程序中的主要活动/初始化code:
In the main activity/initialization code of your application:
@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命令)转换,但何必呢?是不是登陆痛苦还不够吗?
TL;DR: Yes, you could use some magic properties, or adb shell command, or even learn how the stupid built-in logging handler's DalvikLogging.loggerNameToTag
converts category names to tags (which you would have to do for those magic properties and shell commands), but why bother? Isn't logging painful enough?
这篇关于如何配置的java.util.logging在Android?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!