Đây hiện là câu hỏi thường gặp cho một trong các dự án của tôi, hy vọng nhiều người sẽ tìm thấy điều này ở đây: java.util.logging hoạt động tốt trên Android. Xin vui lòng không sử dụng bất cứ điều gì khác trong mã của bạn, đăng nhập khuôn khổ giống như một dịch hại trong thế giới Java.
Điều bị hỏng là trình xử lý ghi nhật ký mặc định được gửi đi với Android, nó bỏ qua bất kỳ thông điệp tường trình nào có mức độ mịn hơn INFO. Bạn không thấy thông báo DEBUG v.v.
Lý do là cuộc gọi đến Log.isLoggable() trong AndroidHandler.java:
https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/logging/AndroidHandler.java
Đây là cách bạn sửa chữa nó:
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 >= 1000) {
return Log.ERROR;
} else if (value >= 900) {
return Log.WARN;
} else if (value >= 800) {
return Log.INFO;
} else {
return Log.DEBUG;
}
}
}
Trong hoạt động/code khởi tạo chính về ứng dụng của bạn:
@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: Có, bạn có thể sử dụng một số thuộc tính ma thuật, hoặc lệnh adb shell hoặc thậm chí tìm hiểu cách trình xử lý ghi nhật ký nguệch ngoạc của DalvikLogging.loggerNameToTag
chuyển đổi tên danh mục thành thẻ (mà bạn phải làm cho các thuộc tính và vỏ ma thuật đó) lệnh), nhưng tại sao lại bận tâm? Không đăng nhập đủ đau đớn sao?
Nguồn
2012-01-28 17:27:37
Cảm ơn bạn rất nhiều. Cách tiếp cận này hoạt động tốt. Bây giờ tôi phải đấu tranh để viết nhật ký cho sdcard. – tangjie
@tangjie không chắc chắn mục tiêu cuối cùng của bạn là gì, nhưng tôi sẽ xem xét việc lưu trữ các bản ghi trong ứng dụng của bạn và sau đó gửi chúng tới máy chủ nơi bạn thực sự có quyền truy cập vào – philipp