txt texto studio programacion notas leer guardar datos crear como bloc archivo abrir java slf4j logback

java - texto - guardar textfield en txt



Inicio de sesiĆ³n: establecer el nombre del archivo de registro mediante programaciĆ³n (4)

Estoy usando logback, y estoy tratando de establecer el nombre del archivo de registro de manera programática dentro de mi programa Java (similar a la configuración programática de Logback Appender ), y traté de adaptar esa solución de la siguiente manera:

En logback-test.xml:

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>log/${log_file_name}.log</file> ...

Y luego otra vez en mi programa Java:

String logFileName = "" + System.currentTimeMillis(); // just for example System.setProperty("log_file_name", logFileName); LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); ContextInitializer ci = new ContextInitializer(lc); lc.reset(); try { // I prefer autoConfig() over JoranConfigurator.doConfigure() so I // wouldn''t need to find the file myself. ci.autoConfig(); } catch (JoranException e) { // StatusPrinter will try to log this e.printStackTrace(); } StatusPrinter.printInCaseOfErrorsOrWarnings(lc);

Sin embargo, el resultado son dos registros, uno completo y con el nombre que yo quería, por ejemplo, "1319041145343.log", y el otro está vacío y con el nombre "log_file_name_IS_UNDEFINED.log". ¿Cómo detengo la creación de este otro archivo de registro vacío?


Creo que lo siguiente está más cerca de lo que quieres.

import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.core.FileAppender; import ch.qos.logback.core.util.StatusPrinter; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.LoggerContext; public class Main { public static void main(String[] args) { LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); FileAppender fileAppender = new FileAppender(); fileAppender.setContext(loggerContext); fileAppender.setName("timestamp"); // set the file name fileAppender.setFile("log/" + System.currentTimeMillis()+".log"); PatternLayoutEncoder encoder = new PatternLayoutEncoder(); encoder.setContext(loggerContext); encoder.setPattern("%r %thread %level - %msg%n"); encoder.start(); fileAppender.setEncoder(encoder); fileAppender.start(); // attach the rolling file appender to the logger of your choice Logger logbackLogger = loggerContext.getLogger("Main"); logbackLogger.addAppender(fileAppender); // OPTIONAL: print logback internal status messages StatusPrinter.print(loggerContext); // log something logbackLogger.debug("hello"); } }

Si todo lo que necesita es agregar una marca de tiempo del nombre del archivo de registro, logback ya admite el elemento de marca de tiempo . Por lo tanto, realmente no necesita ningún código personalizado en absoluto.


Esto es lo que puede hacer para ignorar la creación de archivos adicionales. A continuación se muestra el archivo de configuración.

<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <!-- "application-name" is a variable --> <File>c:/logs/${application-name}.log</File> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%d %p %t %c - %m%n</Pattern> </layout> </appender> <root level="debug"> <appender-ref ref="FILE"/> </root> </configuration>

Aquí está la parte de Java,

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); JoranConfigurator jc = new JoranConfigurator(); jc.setContext(context); context.reset(); // override default configuration // inject the name of the current application as "application-name" // property of the LoggerContext context.putProperty("application-name", NAME_OF_CURRENT_APPLICATION); jc.doConfigure("/path/to/the/above/configuration/file.xml");

Conseguí esto desde aquí http://logback.qos.ch/faq.html#sharedConfiguration


Para separar / separar los mensajes de registro en diferentes archivos dependiendo de un atributo de tiempo de ejecución, es posible que desee utilizar ch.qos.logback.classic.sift.SiftingAppender .

En pocas palabras, esto le permite configurar un FileAppender (o cualquier otro appender) con <file>${userid}.log</file> donde ${userId} se sustituye en función del MDC (Contexto de diagnóstico asignado) (por ejemplo, , MDC.put("userid", "Alice"); ). Vea el primer enlace para ver el ejemplo completo.


Parece que el registrador se inicializa dos veces. La primera vez, probablemente cuando se carga la aplicación y no se pudo resolver el ${log_file_name} . Si inicia la aplicación con -Dlog_file_name=*something* puede verificar este comportamiento si crea otro archivo de registro con el nombre *something*