web-dev-qa-db-fra.com

Log4j: Comment configurer la journalisation de fichier la plus simple possible?

Mon histoire:

Je veux faire quelque chose qui est aussi simple qu'un simple enregistreur log4j qui enregistre les lignes dans un fichier. J'ai trouvé plusieurs exemples avec certaines fonctionnalités, mais pas de base, général, qui fonctionne vraiment, et pas avec l'explication du fonctionnement de chaque ligne.

Question:

Quelqu'un pourrait-il en fournir un?

Conditions préalables:

  • Je sais déjà où placer le fichier et j'ai le log4j configuré et travaillant pour la journalisation de la console.
  • Maintenant, je veux me connecter à un fichier et trouver également le fichier à partir du système de fichiers une fois le programme exécuté.
  • Des lignes devaient être ajoutées au log4j.properties fichier sont la sortie souhaitée.
62
mico

J'ai un fichier générique log4j.xml pour vous:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">

    <appender name="default.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="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <appender name="default.file" class="org.Apache.log4j.FileAppender">
        <param name="file" value="/log/mylogfile.log" />
        <param name="append" value="false" />
        <param name="threshold" value="debug" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <appender name="another.file" class="org.Apache.log4j.FileAppender">
        <param name="file" value="/log/anotherlogfile.log" />
        <param name="append" value="false" />
        <param name="threshold" value="debug" />
        <layout class="org.Apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <logger name="com.yourcompany.SomeClass" additivity="false">
        <level value="debug" />
        <appender-ref ref="another.file" />
    </logger>

    <root>
        <priority value="info" />
        <appender-ref ref="default.console" />
        <appender-ref ref="default.file" />
    </root>
</log4j:configuration>

avec une console, deux fichiers appender et un enregistreur pointant vers le deuxième fichier appender au lieu du premier.

[~ # ~] éditer [~ # ~]

Dans l'un des projets plus anciens, j'ai trouvé un simple fichier log4j.properties:

# For the general syntax of property based configuration files see
# the documentation of org.Apache.log4j.PropertyConfigurator.

# The root category uses two appenders: default.out and default.file.
# The first one gathers all log output, the latter only starting with 
# the priority INFO.
# The root priority is DEBUG, so that all classes can be logged unless 
# defined otherwise in more specific properties.
log4j.rootLogger=DEBUG, default.out, default.file

# System.out.println appender for all classes
log4j.appender.default.out=org.Apache.log4j.ConsoleAppender
log4j.appender.default.out.threshold=DEBUG
log4j.appender.default.out.layout=org.Apache.log4j.PatternLayout
log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n

log4j.appender.default.file=org.Apache.log4j.FileAppender
log4j.appender.default.file.append=true
log4j.appender.default.file.file=/log/mylogfile.log
log4j.appender.default.file.threshold=INFO
log4j.appender.default.file.layout=org.Apache.log4j.PatternLayout
log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n

Pour la description de tous les arguments de mise en page, regardez ici: arguments log4j PatternLayout

77
Tomasz Stanczak
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.Apache.org/log4j/" debug="false">

   <appender name="fileAppender" class="org.Apache.log4j.RollingFileAppender">
      <param name="Threshold" value="INFO" />
      <param name="File" value="sample.log"/>
      <layout class="org.Apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p  [%c{1}] %m %n" />
      </layout>
   </appender>

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="fileAppender" /> 
  </root> 

</log4j:configuration>

Log4j peut être un peu déroutant. Essayons donc de comprendre ce qui se passe dans ce fichier: Dans log4j, vous avez deux constructions de base, appenders et loggers.

Annexes définir comment et où les choses sont ajoutées. Sera-t-il connecté à un fichier, à la console, à une base de données, etc.? Dans ce cas, vous spécifiez que les instructions de journal dirigées vers fileAppender seront placées dans le fichier sample.log En utilisant le modèle spécifié dans les balises layout. Vous pouvez tout aussi facilement créer un appender pour la console ou la base de données. Où l'appender de la console spécifierait des éléments tels que la disposition à l'écran et l'appender de la base de données aurait des détails de connexion et des noms de table.

Loggers répond aux événements de journalisation à mesure qu'ils remontent. Si un événement attire l’intérêt d’un enregistreur spécifique, il invoquera ses ajouts attachés. Dans l'exemple ci-dessous, vous n'avez qu'un seul enregistreur, l'enregistreur racine, qui répond à tous les événements de journalisation par défaut. Outre l'enregistreur racine, vous pouvez spécifier des enregistreurs plus spécifiques qui répondent aux événements de packages spécifiques. Ces enregistreurs peuvent avoir leurs propres appenders spécifiés à l'aide des balises appender-ref Ou hériteront autrement des appenders du logger racine. L'utilisation de loggers plus spécifiques vous permet d'affiner le niveau de journalisation sur des packages spécifiques ou de diriger certains packages vers d'autres appenders.

Donc, ce que dit ce fichier est:

  1. Créez un fichier fileAppender qui se connecte au fichier sample.log
  2. Attachez cet appender au logger racine.
  3. L'enregistreur racine répondra à tous les événements au moins aussi détaillés que le niveau 'debug'
  4. L'appender est configuré pour ne consigner que les événements au moins aussi détaillés que 'info'

Le résultat final est que si vous avez une logger.debug("blah blah") dans votre code, elle sera ignorée. Une logger.info("Blah blah"); sera générée dans sample.log.

L'extrait de code ci-dessous peut être ajouté au fichier ci-dessus avec les balises log4j. Cet enregistreur hériterait des ajouts de <root>, Mais limiterait tous les événements de journalisation du package org.springframework À ceux enregistrés au niveau info ou supérieur.

  <!-- Example Package level Logger -->
    <logger name="org.springframework">
        <level value="info"/>
    </logger>   
31
nsfyn55

Voici un exemple simple que j'utilise souvent:

# Set up logging to include a file record of the output
# Note: the file is always created, even if there is 
# no actual output.
log4j.rootLogger=error, stdout, R

# Log format to standard out
log4j.appender.stdout=org.Apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=   %5p\t[%d] [%t] (%F:%L)\n     \t%m%n\n

# File based log output
log4j.appender.R=org.Apache.log4j.RollingFileAppender
log4j.appender.R.File=owls_conditions.log
log4j.appender.R.MaxFileSize=10000KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.Apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=   %5p\t[%d] [%t] (%F:%L)\n     \t%m%n\n

Le format du journal est le suivant:

ERROR   [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.Java:44)
        http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog.

Un tel format est défini par la chaîne %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n. Vous pouvez lire la signification des caractères de conversion dans log4j javadoc for PatternLayout .

Les commentaires inclus devraient aider à comprendre ce qu’il fait. Notes complémentaires:

  • il se connecte à la fois à la console et au fichier; dans ce cas, le fichier s'appelle owls_conditions.log: changez-le selon vos besoins;
  • les fichiers tournent lorsqu'ils atteignent 10000 Ko et un fichier de sauvegarde est conservé
10
MarcoS

Voici un fichier log4j.properties que j'ai utilisé avec un grand succès.

logDir=/var/log/myapp

log4j.rootLogger=INFO, stdout
#log4j.rootLogger=DEBUG, stdout

log4j.appender.stdout=org.Apache.log4j.DailyRollingFileAppender
log4j.appender.stdout.layout=org.Apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n
log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
log4j.appender.stdout.File=${logDir}/myapp.log
log4j.appender.stdout.append=true

Le DailyRollingFileAppender créera chaque jour de nouveaux fichiers avec des noms de fichiers ressemblant à ceci:

myapp.log.2017-01-27
myapp.log.2017-01-28
myapp.log.2017-01-29
myapp.log  <-- today's log

Chaque entrée du fichier journal aura ce format:

01/30/2017 12:59:47 AM|INFO |Component1   | calling foobar(): userId=123, returning totalSent=1
01/30/2017 12:59:47 AM|INFO |Component2   | count=1 > 0, calling fooBar()

Définissez l'emplacement du fichier ci-dessus à l'aide de -Dlog4j.configuration, comme mentionné dans cette annonce :

Java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp

Dans votre code Java, veillez à définir le nom de chaque composant logiciel lors de l'instanciation de votre objet enregistreur. J'aime également me connecter à la fois au fichier journal et à la sortie standard. une fonction.

private static final Logger LOGGER = Logger.getLogger("Component1");

public static void log(org.Apache.log4j.Logger logger, String message) {

    logger.info(message);
    System.out.printf("%s\n", message);
}

public static String stackTraceToString(Exception ex) {
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    ex.printStackTrace(pw);
    return sw.toString();
}

Et puis appelez comme ça:

LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));
2