es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Java/Logging: ¿Cómo registrar en un archivo de registro separado cada vez?

Estoy escribiendo un programa Java de línea de comandos en el que cada vez que se inicie la aplicación, quiero registrar en un nuevo archivo (por ahora, estoy usando la marca de tiempo actual como nombre del archivo de registro). Mi aplicación también utiliza varias bibliotecas que también registran cosas. ¿Cómo puedo crear dinámicamente un registrador que capture tanto el registro de mi código como cualquier registro realizado por las bibliotecas y lo redirija tanto a la consola como a un nuevo archivo? Estoy usando SLF4j + logback. Hasta ahora, tengo algo como lo siguiente que puede crear un registrador dinámicamente, pero este registrador no captura los registros de terceros:

“`java
public static Logger createLogger(String pattern) {
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

<pre><code> PatternLayoutEncoder layoutEncoder = new PatternLayoutEncoder();
layoutEncoder.setPattern(pattern);
layoutEncoder.setContext(loggerContext);
layoutEncoder.start();

FileAppender<iloggingevent> fileAppender = new FileAppender<>();
fileAppender.setFile(System.currentTimeMillis() + ".log");
fileAppender.setEncoder(layoutEncoder);
fileAppender.setContext(loggerContext);
fileAppender.start();

ch.qos.logback.classic.Logger logger = loggerContext.getLogger("customLogger");
logger.addAppender(fileAppender);
logger.setLevel(Level.TRACE);
logger.setAdditive(true);

return logger;
</code></pre>

}
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para capturar el registro de terceros además del registro de tu propio código, puedes configurar el registrador raíz para incluir estas declaraciones de registro. Necesitas agregar una nueva console y un nuevo archivo añadidos al registrador raíz, e incluir también el elemento <appender-ref> para el nuevo archivo del registrador personalizado en el elemento <root> del registrador raíz. Aquí hay un ejemplo de configuración XML:

    <configuration>
      <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%msg%n</pattern>
        </encoder>
      </appender>
    
      <appender name="file" class="ch.qos.logback.core.FileAppender">
        <file>logs/myapp.log</file>
        <append>true</append>
        <encoder>
          <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
        </encoder>
      </appender>
    
      <logger name="com.example.myapp" level="DEBUG">
        <appender-ref ref="file"></appender-ref>
      </logger>
    
      <root level="INFO">
        <appender-ref ref="console"></appender-ref>
        <appender-ref ref="file"></appender-ref>
        <appender-ref ref="customLoggerFileAppender"></appender-ref>
      </root>
    </configuration>
    

    En este ejemplo, el console añadido muestra los mensajes de registro en la consola, mientras que el archivo añadido los escribe en un archivo llamado logs/myapp.log. El registrador com.example.myapp está configurado para utilizar el archivo para los mensajes registrados desde tu propio código. Finalmente, el registrador raíz está configurado para incluir ambos añadidos y también la referencia customLoggerFileAppender para capturar las entradas de registro de terceros.

    Puedes modificar tu método createLogger() para recibir el nombre del archivo de registro como parámetro y actualizar la referencia del añadido en consecuencia:

    public static Logger createLogger(String pattern, String logFileName) {
      LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
    
      PatternLayoutEncoder encoder = new PatternLayoutEncoder();
      encoder.setPattern(pattern);
      encoder.setContext(context);
      encoder.start();
    
      FileAppender<iloggingevent> fileAppender = new FileAppender<>();
      fileAppender.setFile(logFileName);
      fileAppender.setEncoder(encoder);
      fileAppender.setContext(context);
      fileAppender.start();
    
      ch.qos.logback.classic.Logger logger = context.getLogger("customLogger");
      logger.addAppender(fileAppender);
      logger.setLevel(Level.TRACE);
      logger.setAdditive(true);
    
      return logger;
    }
    

    Luego puedes llamarlo con el nombre del archivo de registro deseado:

    java
    Logger logger = createLogger("%-4relative [%thread] %-5level %logger{35} - %msg%n", "logs/" + System.currentTimeMillis() + ".log");

Comments are closed.