mapped example diagnostic context java logging

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.