Esto ahora es una pregunta frecuente para uno de mis proyectos, ojalá más personas lo encuentren aquí: java.util.logging funciona bien en Android. Por favor, no use nada más en su código, los marcos de registro son como una plaga en el mundo de Java.
Lo que está roto es el manejador de registro predeterminado enviado con Android, ignora cualquier mensaje de registro con nivel más fino que INFO. No ves los mensajes DEBUG, etc.
La razón es la llamada a Log.isLoggable() en AndroidHandler.java:
https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/logging/AndroidHandler.java
Aquí es cómo solucionarlo:
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;
}
}
}
En el código de actividad principal/inicialización de su aplicació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: Sí, podría usar algunas propiedades mágicas o el comando adb shell, o incluso aprender cómo el estúpido controlador de registro incorporado DalvikLogging.loggerNameToTag
convierte los nombres de las categorías en etiquetas (que tendría que hacer para esas propiedades mágicas y el shell) comandos), pero ¿para qué molestarse? ¿El registro no es lo suficientemente doloroso?
Muchas gracias. Este enfoque lo hace bien. Ahora tengo que luchar para escribir log para sdcard. – tangjie
@tangjie no estoy seguro de cuál es su objetivo final, pero consideraría almacenar los registros en su aplicación y luego enviarlos a un servidor donde tenga acceso a – philipp