Cómo dar un nombre de archivo dinámico en el appender en log4j.xml
dynamic-data (4)
Estoy usando log4j para registrar información. He utilizado un archivo log4j.xml
para crear archivos de registro. He dado la ruta absoluta para cada archivo de registro como un valor de etiqueta param
.
P.ej:
<appender name="FA" class="org.apache.log4j.DailyRollingFileAppender">
<param name="DatePattern" value="''_''yyyyMMdd"/>
<param name="File" value="D:/logFiles/GPreprocessor.log"/>
<layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/>
</appender>
No quiero escribir "GPreprocessor.log" directamente. En realidad, ese nombre de archivo es dinámico, basado en el nombre de mi proyecto. Por ejemplo, si ejecuto el programa ABC.java, el registro debería ir a D:/logFiles/ABC.log
, pero si ejecuto XYZ.java, el registro debería ir a D:/logFiles/XYZ.log
. La ubicación del archivo siempre será la misma: D:/logFiles/
. ¿Cómo puedo cambiar el nombre del archivo de registro dinámicamente?
A continuación se muestra mi código para usar Log4J para generar dinámicamente el nombre de archivo. Cambia su nombre según el nombre del archivo de entrada y la fecha y hora actual. (Muy útil en caso de que ejecutes el mismo archivo varias veces).
public class LogClass {
private static Logger log = Logger.getLogger(LogClass.class);
private static boolean initializationFlag = false;
private static String fileName;
private static void intializeLogger(){
log.setLevel(Level.DEBUG);
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
Date date = new Date();
RollingFileAppender appender = new RollingFileAppender();
appender.setAppend(true);
appender.setMaxFileSize("1MB");
appender.setMaxBackupIndex(1);
appender.setFile(fileName + "_" + dateFormat.format(date) + ".log");
PatternLayout layOut = new PatternLayout();
layOut.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n");
appender.setLayout(layOut);
log.addAppender(appender);
}
public static Logger getLogger(){
if(initializationFlag == false){
intializeLogger();
initializationFlag = true;
return LogClass.log;
}
else{
return LogClass.log;
}
}
public static void setFileName(String fileName){
LogClass.fileName = fileName;
}
}
Ahora, cuando quiera usar el registrador en su programa, simplemente escriba estas dos líneas:
LogClass.setFileName(yourFileName);
LogClass.getLogger().debug("hello!!");
Feliz codificacion
En su clase que contiene el método principal, establezca el nombre de su clase en alguna propiedad del sistema. En el siguiente ejemplo usé log_dir
como nombre de propiedad.
class ABC{
public static void main(String s[]){
System.setProperty("log_dir", ABC.class.getSimpleName());
}
}
Y en su archivo log4j.xml use la propiedad log_dir
en el atributo de valor del archivo param
<appender name="FA" class="org.apache.log4j.DailyRollingFileAppender">
<param name="DatePattern" value="''_''yyyyMMdd"/>
<param name="File" value="D:/logFiles/${log_dir}"/>
<layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/>
</appender>
Funciona de maravilla
Es mucho más fácil hacer lo siguiente:
En log4j.xml define la variable como $ {variable}:
<appender name="FILE" class="org.apache.log4j.FileAppender">
<param name="File" value="${logfilename}.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d::[%t]::%-5p::%c::%x - %m%n" />
</layout>
</appender>
Luego, asegúrese de establecer la propiedad del sistema cuando inicie su JVM, como por ejemplo:
java -Dlogfilename=my_fancy_filename example.Application
Eso creará un nombre de archivo de registro dinámico: my_fancy_filename.log
Alternativamente, puede configurar la propiedad del sistema en código siempre que lo haga antes de crear un registrador (esto es útil si desea que su PID esté en sus registros, por ejemplo). Como:
System.setProperty("logfilename", "a_cool_logname");
Una vez que esté configurado, puede seguir adelante y obtener sus registradores como de costumbre y ellos se registrarán en el archivo dinámico (tenga cuidado con los registradores estáticos que crean registradores antes de que se ejecute su método principal).
Tiene más sentido extender FileAppender
con su propia clase, en la que reemplaza el método setOptions()
. Luego, en su log4j.properties
, configure la raíz para iniciar sesión en yourpackage.yourFileAppender
, que es mucho más limpio.