web-dev-qa-db-fra.com

Log4j2 pourquoi l'utiliseriez-vous sur log4j?

Je dois manquer quelque chose mais je regarde cela depuis quelques jours maintenant, mais pourquoi diable utiliseriez-vous jamais log4j2 sur log4j (autre que la performance)?

D'après ce que j'ai vu jusqu'à présent, log4j2 est annoncé comme plus simple à configurer, mais c'est en fait beaucoup plus compliqué (cela fait trois jours maintenant et je n'arrive toujours pas à écrire un journal dans mon répertoire personnel). La configuration automatique ne fonctionne tout simplement pas pour moi (ou du moins je ne peux pas le faire fonctionner), le fichier de configuration lui-même est beaucoup plus complexe dans sa structure et semble être beaucoup plus difficile à ajouter au moment de l'exécution pour aider à diagnostiquer.

Donc, outre les performances, y a-t-il une raison d'utiliser log4j2 par rapport à log4j d'origine?

36
Scott Neville

Raisons de la mise à niveau de Log4j 1.x vers Log4j 2

  • Prise en charge de la communauté: Log4j 1.x n'est pas activement maintenu, alors que Log4j 2 a une communauté active où les questions sont répondues, les fonctionnalités sont ajoutées et les bugs sont corrigés. Mise à jour: depuis août 2015, Log4j 1.x est officiellement en fin de vie et il est recommandé de passer à Log4j 2. Mise à jour 2: Log4j 1.2 est cassé en Java 9 .
  • Async Loggers - performances similaire à la journalisation désactivée
  • Niveaux de journalisation personnalisés
  • Rechargez automatiquement sa configuration lors de la modification sans perdre les événements du journal lors de la reconfiguration.
  • Style Java 8 prise en charge lambda pour la journalisation paresseuse
  • Log4j 2 est sans ordures (ou au moins sans ordures) depuis la version 2.6
  • Filtrage : filtrage basé sur les données de contexte, les marqueurs, les expressions régulières et d'autres composants dans l'événement Log. Les filtres peuvent être associés aux enregistreurs. Vous pouvez utiliser une classe Filter commune dans n'importe laquelle de ces circonstances.
  • Plugin Architecture - facile à étendre en créant des composants personnalisés
  • API prises en charge: SLF4J, Commons Logging, Log4j-1.x et Java.util.logging
  • API Log4j 2 distincte de l'implémentation Log4j 2. L'API prend en charge plus que la simple journalisation des chaînes: CharSequences, Objects et custom Messages . Les messages permettent de prendre en charge des constructions intéressantes et complexes via le système de journalisation et d'être efficacement manipulées. Les utilisateurs sont libres de créer leurs propres types de messages et d'écrire des mises en page, des filtres et des recherches personnalisés pour les manipuler.
  • Améliorations de la concurrence: log4j2 utilise les bibliothèques Java.util.concurrent pour effectuer le verrouillage au niveau le plus bas possible. Log4j-1.x a connu des problèmes de blocage.
  • Configuration via XML, JSON, YAML, fichiers de configuration des propriétés ou par programme.

Soyez conscient

  • les formats log4j2.xml et log4j2.properties sont différents de la syntaxe de configuration de Log4j 1.2
  • Log4j 2 n'est pas entièrement compatible avec Log4j 1.x: l'API Log4j 1.2 est prise en charge par le log4j-1.2-api adaptateur mais les personnalisations qui s'appuient sur les éléments internes de Log4j 1.2 peuvent ne pas fonctionner.
  • Java 6 requis pour les versions 2.0 à 2.3. Java 7 est requis pour Log4j 2.4 et versions ultérieures.

Conseils lors de la mise à niveau

Problèmes courants rencontrés par les utilisateurs lors du démarrage de log4j2:

  • Vous avez besoin de ( au moins ) à la fois log4j-api-2.6.2.jar et log4j-core-2.6.2.jar dans votre chemin de classe
  • Log4j2 recherche un fichier de configuration log4j 2 . Xml, pas un fichier de configuration log4j.xml
  • Fichier de configuration emplacement : placez-le dans le chemin de classe ou spécifiez son chemin avec le log4j.configurationFile propriété système
  • Pour déboguer la configuration , utilisez <Configuration status="trace"> au début de votre fichier de configuration
  • Je recommanderais de commencer avec l'un des nombreux exemples de configurations fournis dans le manuel log4j2, puis d'ajouter des cloches et des sifflets petit à petit.

Si votre problème n'est pas l'un des précédents, veuillez montrer votre configuration et fournir plus de détails sur le problème que vous rencontrez. (Vous ne savez pas ce que vous attendez de la configuration automatique, il s'agit d'une fonction très basique qui enregistre les événements ERREUR dans la console si log4j2 ne trouve pas de fichier de configuration. Cela sera rarement suffisant.)

Pour écrire dans votre répertoire personnel, vous pouvez utiliser la propriété système recherche${sys:PROPERTYNAME}. Voici un exemple de configuration à démontrer:

<Configuration status="trace">
  <Properties>
    <Property name="logfile">${sys:user.home}/log${date:yyyyMMdd}.log</Property>
  </Properties>
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%m%n"/>
    </Console>
    <File name="FILE" fileName="${sys:logfile}">
      <PatternLayout>
        <pattern>%d %p [%t] %c{1.} %m%n</pattern>
      </PatternLayout>
    </File>
  </Appenders>
  <Loggers>
    <Root level="trace">
      <AppenderRef ref="STDOUT" level="ERROR" />
      <AppenderRef ref="FILE" />
    </Root>
  </Loggers>
</Configuration>
61
Remko Popma

Vérifiez ceci . En bref, à partir du lien:

Log4j 2.0 présente:

  • un nouveau système de plugin

  • prise en charge des propriétés

  • prise en charge de la configuration basée sur JSON et rechargement automatique de sa configuration.

Prise en charge de nombreux cadres de journalisation existants, notamment SLF4J, Commons Logging, Apache Flume et Log4j 1.x, et fournit une nouvelle API de programmeur.

Comme vous l'avez dit, c'est aussi beaucoup plus rapide.

Les inconvénients sont:

  • log4j 2.0 est très différent de log4j 1.x et l'API est généralement incompatible.

  • Difficile à mettre en place.

Si vous n'avez besoin d'aucune des nouvelles fonctionnalités, vous êtes probablement d'accord avec l'ancien Log4j 1.x.

7
JonasCz