我想在安卓系统上使用java.util.logging。我想用logging.properties配置日志记录系统。但是我如何使用特定的配置文件告诉Android呢?例如,我将logging.properties放在应用程序的类路径根目录中。安卓是如何知道logging.properties的位置的。
谢谢
发布于 2012-01-29 01:27:38
这是我的一个项目的常见问题解答,希望更多的人能在这里找到这个: java.util.logging在安卓上运行良好。请不要在您的代码中使用其他任何东西,日志记录框架就像Java世界中的一个虫子。
被破坏的是Android附带的默认日志处理程序,它忽略任何级别比INFO更精细的日志消息。您看不到DEBUG等消息。
原因是AndroidHandler.java中对Log.isLoggable()的调用:
下面是如何修复它的方法:
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;
}
}
}在应用程序的主要活动/初始化代码中:
@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命令,您必须这样做),但何必呢?记录日志还不够痛苦吗?
发布于 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形式的文件)。
发布于 2014-02-21 07:50:45
至少在Android 4.3上使用未更改的处理程序,如果您使用
adb shell setprop log.tag.YOURTAG DEBUG您可以在logcat中看到最多使用Level.FINE记录的消息。我还没有想出一种记录更高级别的方法,但这对我来说已经足够了。
https://stackoverflow.com/questions/4561345
复制相似问题