2012-05-22 9 views
8

Quiero crear y habilitar un appender para un método en particular llamado MyMethod(), cuyo resultado de registro se supone que debe ir a un archivo presente en "logFilePath" .Log4j: Crear/modificar appenders en tiempo de ejecución, archivo de registro reconstruido y no anexado

No quiero incluir este appender 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 el tiempo de ejecución y luego llamar a activateOptions, por ej. ajustando el nivel a DEPURAR antes y configurándolo en Desactivado en el bloque finalmente, de modo que la salida se registra 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"); 
} 

me llaman 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; 
    } 
} 

Respuesta

7

muy fácil simplemente crear un método y añadir este

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); 

continuación, en cualquier método tienes que entrar acaba de hacer esto: logger.error ("su error aquí");

0

hago lo siguiente de Scala (básicamente los mismos):

Establecer mi nivel de registro de la raíz a TRACE, sino establecer el umbral de mis appenders globales a la información.

# 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 desea 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 
    } 
} 

Así que, básicamente, desde que puse el umbral de mi nueva appender de rastro o depurarlo en realidad se anexe. Si cambio la raíz a otro nivel, no registrará un nivel inferior.

Cuestiones relacionadas