web-dev-qa-db-fra.com

Comment écrire un journal des erreurs ou une exception dans un fichier dans java

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?

14
adesh

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

26
Nishant
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

4
Thargor

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.

4
Brian

En utilisant log4j, Vous pouvez enregistrer des exceptions assez facilement:

try {
    ...
} catch(Exception e) {
    log.error("An exception! Oops!", e);
}
3
user130076

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);
}
1
Sly

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!");
0
Vishnu M