java - example - mapped diagnostic context
Subclassing java.util.logging.Formatter no funciona (4)
Estoy usando java.util.logging
para el registro (no quiero usar log4j ni nada).
Este es mi registro privado completo. Propiedades:
handlers= java.util.logging.FileHandler
.level= INFO
java.util.logging.FileHandler.pattern = my.log
java.util.logging.FileHandler.limit = 500000
java.util.logging.FileHandler.count = 40
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
Este es el código en mi programa:
public static Logger log = Logger.getLogger(MyClass.class.getName());
// Is there anything else to be init''ed here?
// I don''t. I just start using log directly in the code.
log.severe("something");
log.info("something else");
Como esto da a cada mensaje de registro 2 líneas, probé esto
¿Cómo obtengo que la salida de registro java aparezca en una sola línea?
Copié la clase LogFormatter en la primera respuesta exactamente.
Cambié una línea en mi logging.properties
java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter;
Ahora mi registro ha comenzado a aparecer en XML. Tengo una fuerte sensación de que al FileHandler
no le gusta mi com.mycomp.myproj.LogFormatter
y, por lo tanto, al valor predeterminado XMLFormatter
. ¿Cómo FileHandler
por qué FileHandler
no está utilizando mi clase LogFormatter?
¿Cómo averiguo por qué FileHandler no está utilizando mi clase LogFormatter?
Inicie el programa en un depurador y recorra el código. Establecer un punto de interrupción en LogManager.getLogger()
y / o LogManager.readConfiguration()
O olvídate de java.util.logging
y utiliza un framework como logback que es fácil de configurar y te da mensajes de error útiles cuando algo está mal.
Puede configurar el formateador en el código en la instancia de FileHandler.
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
// please change name of your own choice
Logger log = Logger.getLogger("CustomLogger");
log.setUseParentHandlers(false);
log.setLevel(Level.ALL);
FileHandler handler = new FileHandler("[log_file_location]");
handler.setFormatter(new CustomFormatter()); // set formatter
log.addHandler(handler);
log.info("test message");
handler.close(); // close the handler at some later point in your application.
La clase CustomFormatter se define de la siguiente manera.
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
public class CustomFormatter extends Formatter {
@Override
public String format(LogRecord record) {
StringBuffer buffer = new StringBuffer();
buffer.append(record.getMessage());
return buffer.toString();
}
}
Puede codificar en CustomFormatter para enviar los mensajes en el formato que desee. Espero que esto ayude.
Ok, este realmente me molestó demasiado, y me estaba volviendo loco, estaba revisando la ortografía sin parar, haciendo búsquedas en Google, etc. - que es como llegué aquí - sé que tiene un año, pero vas a patearte a ti mismo. Esto es lo que estoy bastante seguro de que es su respuesta.
Por :
java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter;
Eso debería ser:
java.util.logging.FileHandler.formatter = com.mycomp.myproj.LogFormatter
Suelta el entrenamiento ";" Parece que necesita coincidir exactamente con el nombre de la clase. Vi a otra persona quejarse de que tenían caracteres de espacio en blanco al final, que era lo que era mi problema. Un mejor mensaje de error hubiera sido útil.
Saludos - Mark
com.mycomp.myproj.LogFormatter no se encuentra en la ruta de clase del sistema.
LogManager hará la siguiente llamada para cargar su clase:
Formatter getFormatterProperty(String name, Formatter defaultValue) {
String val = getProperty(name);
try {
if (val != null) {
Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(val);
return (Formatter) clz.newInstance();
}
} catch (Exception ex) {
// We got one of a variety of exceptions in creating the
// class or creating an instance.
// Drop through.
}
// We got an exception. Return the defaultValue.
return defaultValue;
}
Debe asegurarse de que su clase LogFormatter se encuentre en la ruta de clase del sistema.