Je souhaite ajouter le nom d'hôte et la date au nom du fichier journal. Le nom du fichier journal doit donc être comme nom_hôte_app.date.log. Remarque: Cela devrait fonctionner à la fois Linux et Windows.
<appender name="applog" class="org.Apache.log4j.DailyRollingFileAppender">
<param name="File" value="${path}/app.log" />
<param name="MaxFileSize" value="1MB" />
<param name="DatePattern" value=".dd-MM-yyyy" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/>
</layout>
</appender>
Et comment ajouter un filtre basé sur le modèle de journal, pas en tant que StringMatchFilter
. Je veux que le modèle soit mis en correspondance. Merci d'avance
Faites-le d'abord à partir de votre Java puis configurez log4j = dans l'application,
REMARQUE: gérer ou intercepter l'exception requise pendant l'exécution du code ci-dessous.
// step-1 : set hostName into System's property, which will use by log4j
System.setProperty("hostName", InetAddress.getLocalHost().getHostName());
//step - 2 : set currentDate into System's property, which will use by log4j
System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date()));
//step - 3 : now configure/load log4j into Application , if it's not still loaded earlier then.
org.Apache.log4j.Logger LOG = Logger.getLogger(YourJavaClassName.class); // ALERT : before this step above 2-step must needs to be execute, otherwise file-name won't appear as you required.
//LOG.debug("anything whatever programmer what to log");
MISE À JOUR:
Si votre application est une application Web, vous devez configurer la propriété que nous voulons ici aprèsTomcat-server
démarrer et avant toute exécution de application
,
pour cela, créez une classe ApplicationConfiguration
qui a une interface ServletContextListener
implémentée qui aide ici à s'exécuter en premier avant l'exécution d'une application.
faire de même,
import Java.net.InetAddress;
import Java.net.UnknownHostException;
import Java.text.SimpleDateFormat;
import Java.util.Date;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ApplicationConfiguration implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
try {
// step-1 : set hostName into System's property, which will use by log4j
System.setProperty("hostName", InetAddress.getLocalHost().getHostName());
//step - 2 : set currentDate into System's property, which will use by log4j
System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date()));
} catch (UnknownHostException e) {
System.out.println("Error Message : " + e.getMessage());
//e.printStackTrace();
}
}
}
......
Définissez également votre fichier log4j.xml,
<appender name="applog" class="org.Apache.log4j.DailyRollingFileAppender">
<param name="File" value="${path}/app_${hostName}.${currentDate}.log" />
<param name="MaxFileSize" value="1MB" />
<param name="DatePattern" value=".dd-MM-yyyy" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/>
</layout>
</appender>
veuillez mettre à jour le fichier web.xml en conséquence,
<web-app ...>
<listener>
<listener-class>
com.pck1.ApplicationConfiguration
</listener-class>
</listener>
</web-app>
Cette configuration doit s'appliquer à
web.xml
car l'application au démarrage, par cette configuration elle la suivra comme écouteur de contexte.
MISE À JOUR 2:
<logger name="packageName.AAA" additivity="false" >
<level value="INFO" />
<appender-ref ref="applog"/>
</logger>
En suivant log4j2 documentation vous pouvez faire des recherches de variables d'environnement, donc dans les systèmes de type Unix cela devrait fonctionner:
<Property name="MYHOST">${env:HOSTNAME}</Property>
<Appenders>
<File name="File1" fileName="${MYHOST}_file.log">
...
</File>
</Appenders>
Attention, $ HOSTNAME n'est pas toujours disponible par défaut et vous devrez peut-être l'exporter explicitement dans le Shell, voir ce post .
La configuration suivante fera l'affaire
<appender name="file" class="org.Apache.log4j.RollingFileAppender">
<param name="append" value="false" />
<param name="maxFileSize" value="10MB" />
<param name="maxBackupIndex" value="10" />
<param name="file" value="C:\\Users\\kavurira\\Desktop\\log4j-${HostName}.log" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m${HostName}%n" />
</layout>
</appender>
Just set "HostName" as system property, before initialization of Log4j.
System.setProperty("HostName", InetAddress.getLocalHost().getHostName());
Cf. cette réponse à une question similaire, la demande ne serait pas évidente à satisfaire, même si selon cette mailing-list thread , il s'agit d'une demande de longue date.
En utilisant une version récente de log4j, la fin de cette documentation section semble que vous avez déjà la fonctionnalité disponible en utilisant les propriétés.
Quoi qu'il en soit, vous avez toujours la solution pour le faire vous-même avec une disposition de modèle spécialisée, comme ici .
Vous pouvez définir une propriété système hostname
et modifier la configuration:
<param name="File" value="${path}/app_${hostname}.log" />
Assurez-vous que la propriété système est définie avant l'initialisation de log4j.
Pour ajouter un filtre, veuillez vous référer à la réponse de Filtrer le journal en faisant correspondre le modèle - log4j
MISE À JOUR: Une solution simple pour écrire un journal différent:
<logger name="com"><!-- for Class Package is com.???... -->
<level value="INFO" />
<appender-ref ref="applog" />
</logger>
<logger name="loggerForCustomClass">
<level value="INFO" />
<appender-ref ref="customlog" />
</logger>
Modifiez le code dans votre programme:
//message will write to "customlog" appender
Logger.getLogger("loggerForCustomClass").info("log from custom class");
//message will write to "applog" appender
Logger.getLogger(getClass()).info("log from other class");
Écrivez votre propre appender personnalisé étendant les appenderws de base. Cela vous aidera à manipuler les propriétés en Java.
Voir cette réponse https://stackoverflow.com/a/1324075/1594992
Ou définissez simplement les arguments de la ligne de commande et la propriété système comme cette réponse