Question

Je prévois d'implémenter la connexion à une application Web sur laquelle je travaille actuellement, mais je me bats avec certains détails. Quel est le meilleur moyen de consigner une application Web Java?

Spécifiquement;

  • Où se trouve le fichier de configuration dans le fichier de package .war?
  • Où les gens se connectent-ils, dans un fichier plat de chemin relatif ou absolu ou dans une base de données?
  • La journalisation Log4J est-elle directement enregistrée dans le fichier journal du serveur d'applications ou est-ce quelque chose que vous devez configurer? Dans ce cas, j'utilise Tomcat, mais j'utilise souvent Jrun.
  • Tout autre piège dont je devrais être au courant pour la journalisation d'applications Web?

Actuellement, j'utilise Log4J mais j'imagine que les meilleures pratiques s'appliqueraient de manière universelle à toutes les implémentations de journalisation.

EDIT:
Un ajout aux questions du haut.

  • Où commencez-vous le journal? configuration?

Dans une application traditionnelle, je le fais au point d'entrée;

DOMConfigurator.configureAndWatch("log4j.xml");

Quel serait l'équivalent d'une application Web?

Était-ce utile?

La solution

Je place ma configuration sur le package par défaut: src /

et connectez-vous aux fichiers à l'aide de la propriété système $ {catalina.home}:

log4j.appender.???.file=${catalina.home}/logs/system.log

Autres conseils

Je vous recommanderais d'utiliser SLF4J . C’est une façade de journalisation simple qui prend en charge la plupart des systèmes de journalisation courants ( Log4j , log-commging , API Java Logging et Logback ). En l’utilisant, vous pourrez remplacer votre système de journalisation du soulignement par un autre, par simple mise à jour de CLASSPATH.

L’autre avantage de SLF4J réside dans les appels paramétrés , ce qui réduit le code de journalisation moche.

En fait, ils recommandent d'utiliser SLF4J avec Logback . Logback est un successeur de Log4J . Et il a été conçu par le même auteur.

Où se trouve le fichier de configuration dans le fichier de package .war? Racine du classpath.

À qui les gens se connectent-ils, dans un fichier plat à chemin relatif ou absolu ou dans une base de données? Cela dépend du besoin. Il est toujours préférable d'utiliser des chemins relatifs. Les bases de données sont bonnes si vous implémentez une autre application qui va récupérer les journaux et les envoyer en utilisant email / sms

La journalisation Log4J est-elle directement enregistrée dans le fichier journal du serveur d'applications ou est-ce quelque chose que vous devez configurer? Dans ce cas, j'utilise Tomcat, mais j'utilise souvent Jrun. Si vous utilisez Console appender, oui, il sera consigné dans le fichier journal de votre conteneur de servlets.

Tout autre piège dont je devrais être au courant pour la journalisation d'applications Web? Si vous vous connectez à partir de différents threads, utilisez la connexion , elle est thread-safe et expose les messages de journalisation paramétrés.

La journalisation dans une base de données ajoute un autre point d'échec. Nous sommes arrivés à une situation où les serveurs de production ont ouvert une session sur une base de données et quelqu'un a lancé une requête coûteuse sur cette base de données, ce qui l'a tellement ralentie que les serveurs de production sont devenus très lents. La journalisation dans un fichier peut entraîner des problèmes si vous manquez d'espace, mais cela semble moins susceptible de ralentir l'ensemble de l'application.

Il peut être judicieux de placer le fichier de configuration à un endroit où un administrateur peut le modifier sans reconstruire votre application Web (par exemple, pour pouvoir activer la journalisation détaillée sans vous réveiller au milieu de la nuit).

Malheureusement, il n'y a pas de "ient officiel " moyen de localiser des ressources externalisées à partir d’une application Web (corrigez-moi si je me trompe). La façon la plus courante de le faire est de parcourir les répertoires du classpath.

Je recommande d'appeler l'API du journal (log4j) via slf4j. Même si vous utilisez log4j, un conteneur Web ou des modules dépendants peuvent utiliser différentes API de journalisation, telles que Java.util.logging ou la journalisation Jakarta commons. Slf4j fournit des modules de pont qui les redirigent vers l'API slf4j. En conséquence, tous les messages du journal sont écrits par log4j dans ce cas.

L’excellent article intitulé Comment effectuer correctement la journalisation des applications contient de nombreux pièges.

Je pense que d'autres personnes ont répondu à vos autres questions sur cette page.

Je vous recommande également d'utiliser SLF4J.

Une dernière chose à faire: avoir les déclarations parlables des objets peut vous faire gagner du temps.

  • placez le log4j dans le conteneur (serveur) et créez les appenders appropriés par application
  • par rapport au chemin du serveur, mais cela dépend de vos besoins
  • nous utilisons des appenders qui se connectent à différents fichiers, en fonction de vos besoins, par exemple. un fichier pour hibernate info / statistics, un fichier pour application uniquement, etc.
  • ne vous connectez pas trop, cela ralentit l'application

Personnellement, je mets le fichier log4j.properties dans le répertoire WEB-INF et utilise un servlet init avec le code suivant:

public class InitServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

private static final String LOG4J_FILE = "WEB-INF/log4j.properties";

public InitServlet() {
    super();
}

@Override
public void init() throws ServletException {
    super.init();
    PropertyConfigurator.configure(getServletContext().getRealPath(LOG4J_FILE));
    LogFactory.getLog(InitServlet.class).info("LOG 4J configured");
}

}

  • Où se trouve le fichier de configuration dans le fichier de package .war?

À la racine du chemin de classe, mais ... Ne mettez pas le fichier de configuration dans le package war. Vous ne souhaitez pas reconditionner et redéployer l'application si vous modifiez la configuration de la journalisation, n'est-ce pas? Une meilleure pratique serait de placer le fichier de configuration quelque part dans le chemin de classe en dehors de la guerre.

  • Où les gens se connectent-ils, dans un fichier plat de chemin relatif ou absolu ou dans une base de données?

Je me connecte généralement au système de fichiers sur une partition séparée (les fichiers journaux peuvent croître très rapidement et ne doivent jamais bloquer l'application ou le système d'exploitation s'ils deviennent trop volumineux). J'utilise la plupart du temps un chemin absolu basé sur le modèle suivant: / var / projects / & Lt; PROJECT_NAME & Gt; / & Lt; PRODUIT & Gt; / < CLUSTER_NAME > / logs / < INSTANCE_NAME > .log où < PROJECT_NAME > est le nom du projet, < PRODUCT > peuvent être Apache, Tomcat, Weblogic, ..., < CLUSTER_NAME > le nom du cluster et < INSTANCE_NAME > le nom de l'instance à l'intérieur du cluster. La connexion au système de fichiers est plus rapide que dans une base de données. L'inconvénient est que les journaux ne sont pas centralisés si vous utilisez plusieurs instances et machines physiques. Mais la fusion peut facilement être réalisée avec un script.

  • La journalisation Log4J est-elle directement enregistrée dans le fichier journal du serveur d'applications ou est-ce quelque chose que vous devez configurer? Dans ce cas, j'utilise Tomcat, mais j'utilise souvent Jrun.

Les journaux du serveur d'applications sont des journaux du serveur d'applications, pas des journaux d'applications. Ne leur écrivez pas, mais configurez un outil de journalisation (par exemple, log4j) et écrivez dans les journaux de l'application (dédiés).

  • Tout autre piège dont je devrais être au courant pour la journalisation d'applications Web?

Si vous utilisez log4j, n'oubliez pas d'utiliser isDebugEnabled () avant de vous connecter:

if(logger.isDebugEnabled()) {
  logger.debug("Bla Bla Bla");
}
  • Où se trouve le fichier de configuration dans le fichier de package .war?

Généralement, je ne place aucune configuration de journalisation dans l'application, je laisse plutôt cette tâche aux administrateurs du serveur d'applications pour configurer la journalisation à l'échelle du serveur. Dans les rares cas où je souhaite que la configuration log4j soit déployée avec une application Web, WEB-INF est le chemin habituel.

  • Où les gens se connectent-ils, dans un fichier plat de chemin relatif ou absolu ou dans une base de données?

Encore une fois, cela dépend des paramètres du serveur d'applications. Un fichier journal commun pour un serveur d'applications et une rotation quotidienne correspond à la configuration habituelle. S'il existe des besoins spécifiques à l'application, l'administrateur peut configurer un fichier journal distinct pour une application (distingué par les noms de paquet / classe).

  • La journalisation Log4J est-elle directement enregistrée dans le fichier journal du serveur d'applications ou est-ce quelque chose que vous devez configurer? Dans ce cas, j'utilise Tomcat, mais j'utilise souvent Jrun.

Voir ci-dessus. Pour tomcat utilisé à des fins de développement, je rechercherais simplement sa configuration de journalisation (log4j) et y ajouterais des applications spécifiques.

  • Tout autre piège dont je devrais être au courant pour la journalisation d'applications Web? Performance. Limitez le niveau de journalisation à un minimum (par exemple, WARN ou ERROR) une fois que vous avez démarré. Utilisation if (log.isDebugEnabled()) { log.debug("..."); } et similaires dans votre code.

Notez que si vous avez besoin d'un peu de journalisation, la norme de servlet spécifie que vous pouvez obtenir le ServletContext et utiliser les méthodes de journalisation à cet endroit. C’est l’équivalent générique de servlet de System.out.println.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top