En log4j, cuando se utiliza un FileAppender con BufferedIO = true y BufferSize = xxx propiedades (es decir, el almacenamiento en búfer está habilitado), quiero poder vaciar el registro durante el procedimiento de apagado normal. ¿Alguna idea sobre cómo hacer esto?¿Cómo se vacía un archivo log4j FileAppender?
Respuesta
public static void flushAllLogs()
{
try
{
Set<FileAppender> flushedFileAppenders = new HashSet<FileAppender>();
Enumeration currentLoggers = LogManager.getLoggerRepository().getCurrentLoggers();
while(currentLoggers.hasMoreElements())
{
Object nextLogger = currentLoggers.nextElement();
if(nextLogger instanceof Logger)
{
Logger currentLogger = (Logger) nextLogger;
Enumeration allAppenders = currentLogger.getAllAppenders();
while(allAppenders.hasMoreElements())
{
Object nextElement = allAppenders.nextElement();
if(nextElement instanceof FileAppender)
{
FileAppender fileAppender = (FileAppender) nextElement;
if(!flushedFileAppenders.contains(fileAppender) && !fileAppender.getImmediateFlush())
{
flushedFileAppenders.add(fileAppender);
//log.info("Appender "+fileAppender.getName()+" is not doing immediateFlush ");
fileAppender.setImmediateFlush(true);
currentLogger.info("FLUSH");
fileAppender.setImmediateFlush(false);
}
else
{
//log.info("fileAppender"+fileAppender.getName()+" is doing immediateFlush");
}
}
}
}
}
}
catch(RuntimeException e)
{
log.error("Failed flushing logs",e);
}
}
Managed para responder a mi propia pregunta :-)
Al apagar el LogManager:
LogManager.shutdown();
registros almacenados temporalmente todo consiguen enrojecida.
Seleccione esto como la respuesta; es claramente la mejor opción. No te sientas mal por quitarle una garrapata verde a alguien si te la has ganado tú mismo. –
parece la mejor respuesta ... pero, ¿cómo accedes a este objeto "LogManager"? (log4php novato) –
Tal vez usted podría anular WriterAppender#shouldFlush(LoggingEvent)
, por lo que volvería true
para una categoría especial de registro, como log4j.flush.now
, y luego llamar a:
LoggerFactory.getLogger("log4j.flush.now").info("Flush")
He escrito un appender que corrige esto, vea GitHub o use name.wramner.log4j: FlushAppender en Maven. Se puede configurar para nivelar los eventos con una gran severidad y puede hacer que los appenders no sean almacenados cuando recibe un mensaje específico, por ejemplo "Shutting down". Verifique las pruebas unitarias para ver ejemplos de configuración. Es gratis, por supuesto.
public static void flushAll() {
final LoggerContext logCtx = ((LoggerContext) LogManager.getContext());
for(final org.apache.logging.log4j.core.Logger logger : logCtx.getLoggers()) {
for(final Appender appender : logger.getAppenders().values()) {
if(appender instanceof AbstractOutputStreamAppender) {
((AbstractOutputStreamAppender) appender).getManager().flush();
}
}
}
}
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y/o por qué soluciona el problema mejoraría el valor a largo plazo de la respuesta. –
Este código solo intenta vaciar todos los apéndices de enjuague (todos los apéndices que extienden AbstractOutputStreamAppender, donde se declara el método "flush"). Usando esto con Log4J2 v2.8.2 en mi proyecto. –
- 1. Problema de Log4j FileAppender en el servidor Tomcat
- 2. log4j FileAppender no cambia al nuevo archivo cuando logrotate gira el archivo de registro
- 3. Log4J imprime la línea vacía en el archivo de registro
- 4. ¿Cómo sobrescribo un archivo de registro en log4j?
- 5. Logback FileAppender - archivo de registro está vacío?
- 6. Dónde/cómo busca log4j un archivo log4j.properties?
- 7. log4j: ¿qué archivo de configuración se usó?
- 8. log4net - FileAppender escribiendo nuevas entradas al principio del archivo
- 9. archivo de propiedades log4j: cómo configurar?
- 10. Log4J - Funcionalidad similar a SiftingAppender
- 11. Analizar un archivo de registro de log4j
- 12. Cómo establecer el archivo de propiedades log4j?
- 13. ¿Cómo se "vacía" un StringWriter en Java?
- 14. Cómo configurar log4j con un archivo de propiedades
- 15. Log4j: Crear/modificar appenders en tiempo de ejecución, archivo de registro reconstruido y no anexado
- 16. Encontrar archivo de registro Log4J
- 17. Log4Net FileAppender no es seguro para subprocesos?
- 18. cambio de log4j a logback
- 19. ¿Cómo se compila una clase vacía y una estructura vacía?
- 20. java log4j elegir qué archivo registrar en
- 21. log4j nombres de archivo de registro?
- 22. Nombre de archivo con fecha en Log4j
- 23. log4j StringToMatch en el archivo de propiedades
- 24. log4j detuvo el registro en el archivo,
- 25. ¿Cómo se crean los archivos de registro en log4j por ejecución del programa?
- 26. log4j error de archivo de configuración detección
- 27. Log4j Inicio de sesión en un archivo de registro compartido
- 28. log4j in grails: cómo iniciar sesión en el archivo?
- 29. Cómo detectar cuando UITextField se vacía
- 30. Archivo de configuración de producción para log4j?
¿No se descarga Log4J el appender automáticamente durante el apagado normal? Al menos, espero que lo haga. –
Como yo entiendo el código, no se sonroja cuando se decide por BufferedIO. Usted gana rendimiento pero paga un precio: perderá las últimas entradas de registro ... –
Cuando escribí mi propio appender (a DB, pero en realidad no importa), hice la salida de buffer mientras se enjuagaba automáticamente cada pocos segundos. – ripper234