Log4j: creación/modificación de anexadores en tiempo de ejecución, archivo de registro recreado y no anexado

Quiero crear y habilitar un appender para un método particular llamado MyMethod(), cuya salida de registro se supone que va a un archivo presente en "logFilePath".

No quiero incluir este agregador en el archivo de configuración xml, así que pensé en crearlo en tiempo de ejecución.

Primero, traté de modificar las propiedades del registrador en tiempo de ejecución y luego llamé a activateOptions, por ejemplo. configurando el nivel a DEBUG antes y ajustándolo a Off en el bloque finalmente, de modo que la salida se registre solo mientras el método está en uso. Eso no funcionó.

Mi problema aquí es que appender recrea un archivo cada vez y no se agrega al mismo archivo. Esto es a pesar de que setAppend sea cierto.

No estoy muy familiarizado con log4j, así que no dude en sugerir un enfoque alternativo. El siguiente es un código de muestra para explicar lo que estoy intentando.

private static FileAppender createNewAppender(String logFilePath) {
    FileAppender appender = new FileAppender();
    appender.setName("MyFileAppender");
    appender.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
    appender.setFile(logFilePath);
    appender.setAppend(true);
    appender.setThreshold(Level.INFO);
    appender.activateOptions();
    Logger.getRootLogger().addAppender(appender);
    return appender;
}

private static void removeAppender() {
    Logger.getRootLogger().removeAppender(fileAppender) ; // ("MyFileAppender");
}

Llamo a los métodos anteriores de la siguiente manera:

private static FileAppender fileAppender = null;

private static void myMethod(String logFilePath) {        
    try {
        fileAppender = createNewAppender();
        someOperation();
    }
    finally {
        removeAppender();
        fileAppender=null; 
    }
}

preguntado el 22 de mayo de 12 a las 10:05

eso es slf4j, no log4j. busque aquí log4j: stackoverflow.com/questions/15441477/… -

2 Respuestas

muy fácil solo crea un método y agrega esto

String targetLog="where ever you want your log"

FileAppender apndr = new FileAppender(new PatternLayout("%d %-5p [%c{1}] %m%n"),targetLog,true);    
logger.addAppender(apndr);
logger.setLevel((Level) Level.ALL);

luego, en cualquier método que necesite iniciar sesión, simplemente haga esto: logger.error ("su error aquí");

Respondido el 17 de junio de 13 a las 19:06

Parece que puede agregar NUEVOS agregadores, pero no puede cambiar los agregadores existentes. Por lo menos, RollingFileAppender no tiene setFileName(). - Sridhar Sarnobat

Hago lo siguiente desde Scala (básicamente lo mismo):

Establecí mi nivel de registro raíz en TRACE pero establecí el umbral en mis agregadores globales en info.

# Root logger option
log4j.rootLogger=TRACE, file, stdout

# log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log.log
log4j.appender.file.MaxFileSize=100MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{HH:mm:ss} %m%n
log4j.appender.file.Threshold=INFO

# log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} %m%n
log4j.appender.stdout.Threshold=INFO

Luego, en la clase que quiero iniciar sesión:

private def set_debug_level(debug: String) {
  import org.apache.log4j._
  def create_appender(level: Level) {
    val console_appender = new ConsoleAppender()
    val pattern = "%d %p [%c,%C{1}] %m%n"
    console_appender.setLayout(new PatternLayout(pattern))
    console_appender.setThreshold(level)
    console_appender.activateOptions()
    Logger.getRootLogger().addAppender(console_appender)
  }
  debug match {
    case "TRACE" => create_appender(Level.TRACE)
    case "DEBUG" => create_appender(Level.DEBUG)
    case _ => // just ignore other levels
  }
}

Básicamente, dado que configuré el umbral de mi nuevo agregador en TRACE o DEBUG, en realidad se agregará. Si cambio la raíz a otro nivel, no registrará un nivel inferior.

contestado el 23 de mayo de 14 a las 07:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.