Après avoir ajouté log4j à mon application, la sortie suivante est générée à chaque exécution de mon application:
log4j: WARN Aucun appender n'a pu être trouvé pour le journal (slideselector.facedata.FaceDataParser) . log4j: WARN Veuillez initialiser correctement le système log4j .
Il semble que cela signifie qu’un fichier de configuration est manquant . Où ce fichier de configuration doit-il être situé et quel est le bon contenu de départ?
J'utilise Java pour développer une application de bureau. Donc pas de serveur web etc ...
Log4j recherche par défaut un fichier appelé log4j.properties ou log4j.xml sur le chemin d'accès aux classes. Vous pouvez contrôler le fichier utilisé pour s’initialiser en définissant les propriétés du système comme décrit ici (Recherchez la section "Procédure d’initialisation par défaut").
Par exemple:
Java -Dlog4j.configuration=customName ....
Va obliger log4j à rechercher un fichier nommé customName sur le chemin d'accès aux classes.
Si vous rencontrez des problèmes, je trouve utile d'activer le log4j.debug:
-Dlog4j.debug
Il imprimera sur System.out de nombreuses informations utiles sur le fichier utilisé pour s'initialiser, sur les enregistreurs/appenders configurés, comment, etc.
Le fichier de configuration peut être un fichier de propriétés Java ou un fichier XML. Voici un exemple du format du fichier de propriétés tiré de la page de documentation de log4j intro :
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.Apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.Apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Si configurer correctement log4j convient parfaitement aux "vrais" projets, vous souhaiterez peut-être une solution rapide, par exemple si vous testez simplement une nouvelle bibliothèque.
Si oui un appel à la méthode statique
org.Apache.log4j.BasicConfigurator.configure();
va configurer la journalisation de base sur la console et les messages d'erreur disparaîtront.
Si vous vous débarrassez de tout (par exemple, si vous passez des tests)
org.Apache.log4j.BasicConfigurator.configure(new NullAppender());
Selon Apache Log4j FAQ page :
Pourquoi un avertissement s'affiche-t-il concernant "Aucun ajout trouvé pour l'enregistreur" et "Veuillez configurer log4j correctement"?
Cela se produit lorsque la configuration par défaut files
log4j.properties
etlog4j.xml
est introuvable et que l'application n'effectue aucune configuration explicite.log4j
utiliseThread.getContextClassLoader().getResource()
pour localiser les fichiers de configuration par défaut et ne vérifie pas directement le système de fichiers. Connaître l'emplacement approprié pour placer log4j.properties oulog4j.xml
nécessite de comprendre la stratégie de recherche du chargeur de classes utilisé.log4j
ne fournit pas de configuration par défaut car la sortie sur la console ou le système de fichiers peut être interdite dans certains environnements.
En gros, l'avertissement aucun appender n'a pu être trouvé pour le logger signifie que vous utilisez le système log4j
logging, mais vous n'avez ajouté aucun appendice (FileAppender, ConsoleAppender, SocketAppender, SyslogAppender, etc.). .) dans votre fichier de configuration ou le fichier de configuration est manquant.
Il existe trois façons de configurer log4j: avec un fichier de propriétés (log4j.properties
), avec un fichier XML et via le code Java (rootLogger.addAppender(new NullAppender());
).
log4j.properties
Si votre fichier de propriété est présent (lors de l’installation de Solr, par exemple), vous devez placer ce fichier dans votre répertoire classpath .
Voici quelques suggestions de commandes sous Linux pour déterminer la valeur de votre chemin de classe:
$ echo $CLASSPATH
$ ps wuax | grep -i classpath
$ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf /usr/share/tomcat?
ou de Java: System.getProperty("Java.class.path")
.
Vous trouverez ci-dessous un fichier de configuration XML de base pour log4j au format XML:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/">
<appender name="console" class="org.Apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
</layout>
</appender>
<root>
<priority value ="debug" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
Si vous utilisez Tomcat, vous pouvez placer votre log4j.properties
dans le dossier: /usr/share/tomcat?/lib/
ou /var/lib/tomcat?/webapps/*/WEB-INF/lib/
.
Pour la référence, le fichier log4j.properties
de Solr par défaut ressemble à ceci:
# Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE
log4j.appender.CONSOLE=org.Apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.Apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n
#- size rotation with log cleanup.
log4j.appender.file=org.Apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9
#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n
log4j.logger.org.Apache.zookeeper=WARN
log4j.logger.org.Apache.hadoop=WARN
# set to INFO to enable infostream log messages
log4j.logger.org.Apache.solr.update.LoggingInfoStream=OFF
Pourquoi log4j ne trouve-t-il pas mon fichier de propriétés dans une application J2EE ou WAR?
La réponse courte: les classes log4j et le fichier de propriétés ne font pas partie du même chargeur de classes.
Log4j utilise uniquement le mécanisme par défaut
Class.forName()
pour le chargement des classes. Les ressources sont traitées de la même manière. Voir la documentation pourJava.lang.ClassLoader
pour plus de détails.Donc, si vous rencontrez des problèmes, essayez de charger vous-même la classe ou la ressource. Si vous ne le trouvez pas, ni log4j. ;)
Voir également:
Vous pouvez définir l'emplacement de votre log4j.properties depuis votre application Java à l'aide de:
org.Apache.log4j.PropertyConfigurator.configure(file/location/log4j.properties)
Plus d'informations sont disponibles ici: https://logging.Apache.org/log4j/1.2/manual.html
Recherchez en ligne un fichier log4j.properties ou log4j.xml doté d'un appender racine et placez-le sur votre chemin d'accès aux classes.
### direct log messages to stdout ###
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout
se connecter à la console. Je préfère me connecter à un fichier pour pouvoir ensuite enquêter.
log4j.appender.file=org.Apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file
bien que, pour les applications de journalisation détaillée, il est généralement nécessaire d’augmenter 100 Ko à 1 Mo ou 10 Mo, en particulier pour le débogage.
Personnellement, j’ai configuré plusieurs enregistreurs, et ai défini l’enregistreur racine sur avertir ou sur un niveau d’erreur plutôt que sur le débogage.
Une autre façon de le faire sans mettre le fichier de propriétés sur le chemin de classe consiste à définir directement la propriété à partir du code Java. Voici l exemple de code.
public class Log4JSample {
public static void main(String[] args) {
Properties properties=new Properties();
properties.setProperty("log4j.rootLogger","TRACE,stdout,MyFile");
properties.setProperty("log4j.rootCategory","TRACE");
properties.setProperty("log4j.appender.stdout", "org.Apache.log4j.ConsoleAppender");
properties.setProperty("log4j.appender.stdout.layout", "org.Apache.log4j.PatternLayout");
properties.setProperty("log4j.appender.stdout.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");
properties.setProperty("log4j.appender.MyFile", "org.Apache.log4j.RollingFileAppender");
properties.setProperty("log4j.appender.MyFile.File", "my_example.log");
properties.setProperty("log4j.appender.MyFile.MaxFileSize", "100KB");
properties.setProperty("log4j.appender.MyFile.MaxBackupIndex", "1");
properties.setProperty("log4j.appender.MyFile.layout", "org.Apache.log4j.PatternLayout");
properties.setProperty("log4j.appender.MyFile.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");
PropertyConfigurator.configure(properties);
Logger logger = Logger.getLogger("MyFile");
logger.fatal("This is a FATAL message.");
logger.error("This is an ERROR message.");
logger.warn("This is a WARN message.");
logger.info("This is an INFO message.");
logger.debug("This is a DEBUG message.");
logger.trace("This is a TRACE message.");
}
}
Vous pouvez configurer le niveau de journal à l’aide de setLevel () .
Les niveaux sont utiles pour définir facilement le type d'informations que vous souhaitez que le programme affiche.
Par exemple:
Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages
L'ensemble des niveaux possibles sont:
TRACE,
DÉBOGUER,
INFO,
PRÉVENIR,
ERREUR et
FATAL
import org.Apache.log4j.BasicConfigurator;
Appelez cette méthode
BasicConfigurator.configure();
Pour activer -Dlog4j.debug
, je vais dans Système, Paramètres système avancés, Variables d'environnement et règle la variable système _Java_OPTIONS
à -Dlog4j.debug
.
Créez simplement log4j.properties dans le dossier src/main/Assembly. Selon que vous souhaitez ou non que les messages de journal soient affichés dans la console ou dans le fichier, vous modifiez votre fichier. Ce qui suit va montrer vos messages dans la console.
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct 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{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
J'ai créé le fichier log4j.properties dans le dossier resources à côté de hibernate.cfg.xml et l'a rempli avec le texte ci-dessous:
log4j.rootLogger=INFO, CONSOLE
log4j.appender.CONSOLE=org.Apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.Apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n
maintenant je me suis débarrassé des avertissements et des erreurs
La solution pour moi était de mettre "log4j.properties" dans le dossier "src".
Comme expliqué précédemment, il y a 2 approches
La première consiste simplement à ajouter cette ligne à votre méthode principale:
BasicConfigurator.configure();
La deuxième approche consiste à ajouter ce fichier log4j.properties standard à votre chemin de classe:
Lors de la seconde approche, vous devez vous assurer d’initialiser le fichier correctement.
Par exemple.
Properties props = new Properties();
props.load(new FileInputStream("log4j property file path"));
props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");
Assurez-vous de créer le dossier requis pour stocker les fichiers journaux.
Essayez de définir l'attribut debug dans log4j: node de configuration sur true.
<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/" debug="true">
Il imprime des informations lorsque le fichier de configuration est lu et utilisé pour configurer l'environnement log4j. Vous aurez peut-être plus de détails pour résoudre votre problème.
API de journalisation - L'API de journalisation Java facilite la maintenance et la maintenance des logiciels sur les sites clients en générant des rapports de journalisation adaptés à l'analyse par les utilisateurs finaux, les administrateurs système, les techniciens de maintenance sur site et les équipes de développement logiciel. Les API de journalisation capturent des informations telles que les défaillances de sécurité, les erreurs de configuration, les goulots d'étranglement liés aux performances et/ou les bogues rencontrés dans l'application ou la plate-forme. En outre, les API de journalisation sont capables d’interagir avec les services de journalisation déjà existants sur le système d’exploitation hôte.
Paquet Java.util.logging «Fournit les classes et les interfaces des principales installations de journalisation de la plate-forme Java.
Log4j 1.x «log4j est un utilitaire de journalisation populaire basé sur Java. Log4j est un projet open source basé sur le travail de nombreux auteurs. Il permet au développeur de contrôler les instructions de journal générées vers divers emplacements à l’aide des appendices [console, fichiers, base de données et courrier électronique]. Il est entièrement configurable au moment de l'exécution à l'aide de fichiers de configuration externes.
Log4j a trois composants principaux:
- Enregistreurs - [OFF, FATAL, ERREUR, WARN, INFO, DEBUG, TRACE]
Les appendices
Apache Commons Logging: ConsoleAppender, FileAppender, RollingFileAppender, DailyRollingFileAppender, JDBCAppender -
Driver
, SocketAppenderLog4J Appender pour MongoDB:MongoDb Appender -
Driver
- Layouts - [PatternLayout, EnhancedPatternLayout]
Les fichiers de configuration peuvent être écrits au format XML ou au format de propriétés Java (clé = valeur).
- log4j_External.properties «Format des propriétés Java (clé = valeur)
La chaîne entre une ouverture "$ {" et une fermeture "}" est interprétée comme une clé. La valeur de la variable substituée peut être définie en tant que propriété système ou dans le fichier de configuration lui-même. . Définissez les options spécifiques à l'appender. «Log4j.appender.appenderName.option = valeur, pour chaque appender nommé, vous pouvez configurer sa présentation. _
log4j.rootLogger=INFO, FILE, FILE_PER_SIZE, FILE_PER_DAY, CONSOLE, MySql
#log.path=./
log.path=E:/Logs
# https://logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/PatternLayout.html
# {%-5p - [WARN ,INFO ,ERROR], %5p 0- [ WARN, INFO,ERROR]}
log.patternLayout=org.Apache.log4j.PatternLayout
log.pattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n
# System.out | System.err
log4j.appender.CONSOLE=org.Apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.err
log4j.appender.CONSOLE.layout=${log.patternLayout}
log4j.appender.CONSOLE.layout.ConversionPattern=${log.pattern}
# File Appender
log4j.appender.FILE=org.Apache.log4j.FileAppender
log4j.appender.FILE.File=${log.path}/logFile.log
#log4j:ERROR setFile(null,false) call failed. - Defaults setFile(null,true)
#log4j.appender.FILE.Append = false
log4j.appender.FILE.layout=${log.patternLayout}
log4j.appender.FILE.layout.ConversionPattern=${log.pattern}
# BackUP files for every Day.
log4j.appender.FILE_PER_DAY=org.Apache.log4j.DailyRollingFileAppender
# [[ Current File ] - logRollingDayFile.log ], { [BackUPs] logRollingDayFile.log_2017-12-10, ... }
log4j.appender.FILE_PER_DAY.File=${log.path}/logRollingDayFile.log
log4j.appender.FILE_PER_DAY.DatePattern='_'yyyy-MM-dd
log4j.appender.FILE_PER_DAY.layout=${log.patternLayout}
log4j.appender.FILE_PER_DAY.layout.ConversionPattern=${log.pattern}
# BackUP files for size rotation with log cleanup.
log4j.appender.FILE_PER_SIZE=org.Apache.log4j.RollingFileAppender
# [[ Current File ] - logRollingFile.log ], { [BackUPs] logRollingFile.log.1, logRollingFile.log.2}
log4j.appender.FILE_PER_SIZE.File=${log.path}/logRollingFile.log
log4j.appender.FILE_PER_SIZE.MaxFileSize=100KB
log4j.appender.FILE_PER_SIZE.MaxBackupIndex=2
log4j.appender.FILE_PER_SIZE.layout=${log.patternLayout}
log4j.appender.FILE_PER_SIZE.layout.ConversionPattern=${log.pattern}
# MySql Database - JDBCAppender
log4j.appender.MySql=org.Apache.log4j.jdbc.JDBCAppender
log4j.appender.MySql.driver=com.mysql.jdbc.Driver
log4j.appender.MySql.URL=jdbc:mysql://localhost:3306/automationlab
log4j.appender.MySql.user=root
log4j.appender.MySql.password=
log4j.appender.MySql.layout=org.Apache.log4j.EnhancedPatternLayout
log4j.appender.MySql.layout.ConversionPattern=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');
#log4j.appender.MySql.sql=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');
# Direct log events[Messages] to MongoDB Collection - MongoDbAppender
log.mongoDB.hostname=loalhost
log.mongoDB.userName=Yash777
log.mongoDB.password=Yash@123
log.mongoDB.DB=MyLogDB
log.mongoDB.Collection=Logs
log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
log4j.appender.MongoDB.hostname=${log.mongoDB.hostname}
log4j.appender.MongoDB.userName=${log.mongoDB.userName}
log4j.appender.MongoDB.password=${log.mongoDB.password}
log4j.appender.MongoDB.port=27017
log4j.appender.MongoDB.databaseName=${log.mongoDB.DB}
log4j.appender.MongoDB.collectionName=${log.mongoDB.Collection}
log4j.appender.MongoDB.writeConcern=FSYNCED
Structure de la table MySQL pour la table logdata
CREATE TABLE IF NOT EXISTS `logdata` (
`Logger_Level` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
`DataTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`ClassName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`MethodName` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`LineNumber` int(10) NOT NULL,
`Message` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
- log4j_External.xml «XML log4j: configuration avec fichier DTD public
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration PUBLIC
"-//Apache//DTD LOG4J 1.2//EN" "http://logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="false">
<appender name="CONSOLE" class="org.Apache.log4j.ConsoleAppender">
<param name="target" value="System.out" />
<param name="threshold" value="debug" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
</layout>
</appender>
<appender name="FILE" class="org.Apache.log4j.FileAppender">
<param name="file" value="E:/Logs/logFile.log" />
<param name="append" value="false" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
</layout>
</appender>
<appender name="FILE_PER_SIZE" class="org.Apache.log4j.RollingFileAppender">
<param name="file" value="E:/Logs/logRollingFile.log" />
<param name="immediateFlush" value="true"/>
<param name="maxFileSize" value="100KB" />
<param name="maxBackupIndex" value="2"/>
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
</layout>
</appender>
<appender name="FILE_PER_DAY" class="org.Apache.log4j.DailyRollingFileAppender">
<param name="file" value="E:/Logs/logRollingDayFile.log" />
<param name="datePattern" value="'_'yyyy-MM-dd" />
<layout class="org.Apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n"/>
</layout>
</appender>
<root>
<priority value="info" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
<appender-ref ref="FILE_PER_SIZE" />
<appender-ref ref="FILE_PER_DAY" />
</root>
</log4j:configuration>
- Log4j Configuration à partir de l'URL dans le programme Java:
Afin de spécifier une configuration personnalisée avec un fichier externe, la classe utilisée doit implémenter le interface du configurateur .
lorsque les fichiers de configuration par défaut "log4j.properties", "log4j.xml" ne sont pas disponibles
- Pour "log4j.properties", vous pouvez alimenter la méthode PropertyConfigurator . Configure (Java.net.URL).
- Pour "log4j.xml" DOMConfigurator sera utilisé.
public class LogFiles {
// Define a static logger variable so that it references the Logger instance named "LogFiles".
static final Logger log = Logger.getLogger( LogFiles.class );
@SuppressWarnings("deprecation")
public static void main(String[] args) {
System.out.println("CONFIGURATION_FILE « "+LogManager.DEFAULT_CONFIGURATION_FILE);
System.out.println("DEFAULT_XML_CONFIGURATION_FILE = 'log4j.xml' « Default access modifier");
String fileName = //"";
//"log4j_External.xml";
"log4j_External.properties";
String configurationFile = System.getProperty("user.dir")+"/src/" + fileName;
if( fileName.contains(".xml") ) {
DOMConfigurator.configure( configurationFile );
log.info("Extension *.xml");
} else if ( fileName.contains(".properties") ) {
PropertyConfigurator.configure( configurationFile );
log.info("Extension *.properties");
} else {
DailyRollingFileAppender dailyRollingAppender = new DailyRollingFileAppender();
dailyRollingAppender.setFile("E:/Logs/logRollingDayFile.log");
dailyRollingAppender.setDatePattern("'_'yyyy-MM-dd");
PatternLayout layout = new PatternLayout();
layout.setConversionPattern( "%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" );
dailyRollingAppender.setLayout(layout);
dailyRollingAppender.activateOptions();
Logger rootLogger = Logger.getRootLogger();
rootLogger.setLevel(Level.DEBUG);
rootLogger.addAppender(dailyRollingAppender);
log.info("Configuring from Java Class.");
}
log.info("Console.Message.");
method2();
methodException(0);
}
static void method2() {
log.info("method2 - Console.Message.");
}
static void methodException(int b) {
try {
int a = 10/b;
System.out.println("Result : "+ a);
log.info("Result : "+ a);
} catch (Exception ex) { // ArithmeticException: / by zero
log.error(String.format("\n\tException occurred: %s", stackTraceToString(ex)));
}
}
public static String stackTraceToString(Exception ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
return sw.toString();
}
}
Dans quoi développez-vous? Utilisez-vous Apache Tomcat?
log4j.appender.CONSOLE=org.Apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.target=System.out
log4j.appender.CONSOLE.layout=org.Apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n
J'ai une propriété comme celle-ci dans une de mes applications Java.
Mon log4j a été corrigé par le fichier de propriétés ci-dessous:
## direct log messages to stdout ###
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.Apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout
log4j.appender.file=org.Apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=./logs/test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file
C’est un moyen alternatif d’utiliser .yaml
Structure logique:
Configuration:
Properties:
Appenders:
Loggers:
Échantillon:
Configutation:
name: Default
Properties:
Property:
name: log-path
value: "logs"
Appenders:
Console:
name: Console_Appender
target: SYSTEM_OUT
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
File:
name: File_Appender
fileName: ${log-path}/logfile.log
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
Loggers:
Root:
level: debug
AppenderRef:
- ref: Console_Appender
Logger:
- name: <package>.<subpackage>.<subsubpackage>.<...>
level: debug
AppenderRef:
- ref: File_Appender
level: error
Si nous utilisons un wrapper de journalisation Apache commons commons au-dessus de log4j, nous devons avoir les deux fichiers jar disponibles dans classpath. De plus, commons-logging.properties
et log4j.properties/xml
devraient être disponibles dans classpath.
Nous pouvons également passer la classe d'implémentation et le nom log4j.properties
en tant que Java_OPTS
en utilisant -Dorg.Apache.commons.logging.Log=<logging implementation class name> -Dlog4j.configuration=<file:location of log4j.properties/xml file>
. La même chose peut être faite via le paramètre Java_OPTS
dans le cas du serveur Web/app.
Cela aidera à externaliser les propriétés qui peuvent être modifiées dans le déploiement.
Pour les tests, une méthode rapide, comprenant la définition du niveau de journalisation:
org.Apache.log4j.BasicConfigurator.configure();
org.Apache.log4j.Logger.getRootLogger().setLevel(org.Apache.log4j.Level.WARN);
// set to Level.DEBUG for full, or Level.OFF..