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*