Existe-t-il un moyen d'écrire un journal d'erreurs ou une exception dans un fichier en Java. je suis passé par Log4j. J'ai googlé à ce sujet mais je n'ai pas trouvé de bonne solution. J'ai écrit un code simple
catch (Exception e) {
PrintWriter pw = new PrintWriter(new FileOutputStream("Log"));
e.printStackTrace(pw);
}
Existe-t-il un autre moyen de consigner les erreurs ou l'exception? tout organisme peut-il me fournir un exemple d'échantillon de Log4j?
Lisez d'abord log4j Manual , il est facile de configurer un fichier journal tournant. Vous n'avez à effectuer aucune opération de fichier explicite.
#SET LEVEL of ROOT-LOGGER, you will like to have Debug in local, but in prod you may just want WARN and ABOVE. This setting is done here!
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. (basically, format of log)
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
# THIS IS WHERE YOU WILL HAVE ALL THE LOG WRITTEN
log4j.appender.R=org.Apache.log4j.RollingFileAppender
log4j.appender.R.File=/var/log/applogs/example.log
# Maximum size of log file, usually we keep 10MB
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file, usually we keep 10
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.Apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Deuxièmement, chaque fois que vous attrapez une exception, faites comme ceci
public class MyClass{
private static Logger logger = Logger.getLogger(MyClass.class);
public ReturnType myMethod(Param p, Param2 p2) {
....
....
try {
..
} catch(MyException e) {
logger.log("Exceptions happen!", e); //this will put all the details in log file configured earlier
}
....
}
....
}
Cela vaut la peine de lire le manuel. Encore mieux lu Manuel complet log4j
try {
System.setErr(new PrintStream(new FileOutputStream(System.getProperty("user.home")+"/error.log")));
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
Maintenant, toutes les sorties d'erreur sont écrites dans ce fichier
Vous pouvez ajouter l'exception en tant que paramètre à votre instruction log4j, par exemple.
catch(Exception e)
{
logger.error("Unexpected error", e);
}
À condition que vous ayez un appender de fichier fonctionnant correctement, cela produira la trace de pile complète de l'exception.
En utilisant log4j
, Vous pouvez enregistrer des exceptions assez facilement:
try {
...
} catch(Exception e) {
log.error("An exception! Oops!", e);
}
Regardez ce tutoriel sur "File Appender"
Voir introduction officielle de Log4j et la section "Configuration".
Vous pouvez également effectuer une recherche sur "RollingFileAppender" ou "File appender".
Vous configurez votre enregistreur pour envoyer son message à un appender. Cet appender peut transmettre un message vers la console (stdin), vers un fichier (FileAppender, RollingFileAppender ...) ...
Utilisez ceci pour effectuer le journal des erreurs:
try{
throw new Exception("bla bla bla...");
} catch( Exception e ){
// log without stack trace
mLogger.error("Your log message");
// log with stack trace
mLogger.error("Your log message", e);
}
Vous pouvez enregistrer des données à l'aide de la dépendance log4j. Allez sur ce lien
https://logging.Apache.org/log4j/2.x/manual/configuration.html
Pom dependency ==>
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>
Properties File eg ==>
status = error
dest = err
name = PropertiesConfig
property.filename = target/rolling/rollingtest.log
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %m%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = error
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-
%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
logger.rolling.name = com.example.my.app // Change this to your own package
name otherwise will not work
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = STDOUT
Java code ==>
private static final Logger logger =
LogManager.getLogger(MyClass.class.getName());
logger.info("Entering application.");
logger.trace("Entering application.");
logger.debug("Debugg application.");
logger.error("Did it again!");