Préface
À mesure que la taille du projet devient de plus en plus grande, de nouveaux modules seront introduits en continu. Différents modules imprimeront leurs propres journaux, ce qui entraînera éventuellement le journal incapable d'être affiché. Par exemple, dans mon propre projet, les journaux suivants existent:
Parmi eux, la quantité de données de journal du journal des messages et du thread d'arrière-plan est très grande. Si tous les journaux sont imprimés dans un seul fichier et à l'aide du fichier tail -f log.log , vous constaterez que les journaux font défiler rapidement et que vous ne pouvez pas afficher ou même localiser un journal d'accès SQL ou de service spécifique.
La solution consiste à classer et à publier différents journaux afin que les journaux mutuels ne se affectent pas mutuellement. L'accès aux journaux par des interfaces particulièrement importants peut facilement localiser et résoudre les problèmes.
Étape 1: Configurer dans log4j.properties
Postez d'abord toutes mes propres configurations log4j.properties :
log4j.rootlogger = info, console, fichier log4j.appender.console = net.czt.log.asyncconsoleAppenderLog4j.appenden % -17c {2} (% 13f:% l)% x {user_id} |% x {user_ip} |% x {server_address} |% x {server_name} |% x {request_uri} |% x {session_id} - % m% nlog4j.appender.console.buffersize = 10000log4j.appender.console.encoding = utf-8 log4j.appender.file = org.apache.log4j.rollingFileAppenderLog4j.appender.file.file = / home / work / apache-tomcat-6.0.39 / logs / crazyant.loglog4j.appender.file.maxb ackupindex = 5log4j.appender.file.maxfilesize = 1gblog4j.appender.file.layout = org.apache.log4j.patternlayoutlog4j.appender.file.layout.conversionPattern = [% - 5p] crazyant-web% d {yyyy-mm-dd hh: mm: ss, sss}% x {user_id} |% x {user_ip} |% x {server_address} |% x {server_name} |% x {request_uri} |% x {session_id} Méthode:% l% n% m% nlog4j.appender.file.buffersize = 10000log4j.appender.file.encoding = utf-8 log4j.logger.net.czt.crazyant.msg = debug, MessageLog4j.additivity.net.czt.crazyant.msg = falselog4j.appendender.message = org.apache.log4j.rollingFileAppenderlog4j.appender.message.file = / home / work / apache-tomcat-6.0.39 / logs / crazyant_message.loglog4j Âge.APPEnd = truelog4j.appender.message.maxFileSize = 1GBlog4j.appender.Message.maxBackupIndex = 5Log4j.APPENDER.Message.Layout = org.apache.Log4j.PatternlayoutLog4j.apprender HH: mm: ss} [% -5p] [% c {1}] [% t] -% m% nlog4j.appender.mesage.encoding = utf-8 log4j.logger.net.czt.crazyant.async.service = debug, asynclog4j.additivité.net.czt.crazyant.async.service = fallog4j.appendender.async = org.apache.log4j.rollingFileAppenderLog4j.appender.async.file = / home / work / apache-tomcat-6.0.39 / logs / crazyant_async.Loglog4j. R.Async.APPEND = truelog4j.appendender.async.maxFileSize = 1GBLOG4J.APPENDER.Async.maxbackupindex = 5log4j.appendender.async.layout = org.apache.log4j.patternlayoutlog4j.apprender.async.layout.conversionpattern =% d {yyyymmmmmmmmmmmmmmmm-mmm HH: mm: ss} [% -5p] [% c {1}] [% t] -% m% nlog4j.appender.async.encoding = utf-8 log4j.logger.net.czt.orm.mybatis.sqlmonitormanager = debug, showsqllog4j.additivity.net.czt.orm.mybatis.sqlmonitorManager = falselog4j.logger.net.czt.transaction.interceptor.smartTransactionInterceptor = Debug, showsqllog4j.additivity.net.czt.transaction.interceptor.smartTransActionInterceptor = falselog4j.appender.showsql = org.apache.log4j.rollingFileAppenderLog4j.apprender.showsql.file = / home / work og4j.appender.showsql.append = truelog4j.appender.showsql.maxfilesize = 1gblog4j.appender.showsql.maxbackupindex = 5log4j .appender.showsql.layout = org.apache.log4j.patternlayoutlog4j.appenden HH: mm: ss} [% -5p] [% c {1}] [% t] -% m% nlog4j.appender.showsql.encoding = utf-8 log4j.logger.net.czt.crazyant.service = debug, ServiceLog4j.additivity.net.czt.crazyant.service = falselog4j.appendender.service = org.apache.log4j.rollingFileAppenderLog4j.appender.service.file = / home / work / apache-tomcat-6.0.39 / logs / crazyant_sservice.log3 rvice.append = truelog4j.appender.service.maxfilesize = 1gblog4j.appender.service.maxbackupindex = 5log4j.appender.service.layout = org.apache.log4j.patternlayoutlog4j.apprender HH: mm: ss} [% -5p] [% c {1}] [% t] -% m% nlog4j.appender.service.encoding = utf-8Sous le fichier de configuration, vous pouvez facilement voir que je publie le message (message), async (thread backend), showSQL (journal de base de données) et service (appel d'interface) à différents fichiers journaux respectivement.
Certaines de ces explications:
log4j.rootLogger=INFO, console, file
Log4j a le concept de RootLogger et de l'enregistreur ordinaire. Par défaut, nous n'avons besoin que d'un rootlogger, c'est-à-dire que tous les journaux ne seront sortis que dans ce fichier journal.
Jetez un œil à la configuration d'un enregistreur normal (en prenant le service de journal d'interface comme exemple):
1. log4j.logger.net.czt.crazyant.service=DEBUG, service
Le " net.czt.crazyant.service " dans cette phrase indique le chemin complet du package qui entre en vigueur dans la configuration du journal normal
Le service couleur indique le nom de l'enregistreur ordinaire
2. log4j.additivity.net.czt.crazyant.service=false
Le " net.czt.crazyant.service " est le même que celui ci-dessus, indiquant le package ciblé par l'élément de configuration.
La signification de la configuration dans cette phrase est qui ne publie pas le journal du package au journal RootLogger, mais ne le publie que dans le journal que vous avez configuré;
3. log4j.appender.service=org.apache.log4j.RollingFileAppender , et les éléments de configuration sous cette section de configuration
La chaîne "Service" ici est la même que le "service" du premier élément de configuration ci-dessus, indiquant la configuration du journaliste ordinaire;
Les éléments de configuration ci-dessous sont les mêmes que RootLogger, indiquant le fichier de sortie tous les jours, codant UTF8, Règles de rupture, mode de sortie pour chaque ligne, etc.
Le problème que j'ai rencontré était qu'après log4j.properties ci-dessus, j'ai constaté que chaque fichier journal avait été créé, mais il n'y avait pas de contenu. Pourquoi est-ce? Jetons un coup d'œil à la deuxième chose à laquelle vous faites attention ci-dessous;
Étape 2: Lors de la sortie du journal, vous devez définir la classe spécifique correspondant à l'objet log.
Qu'est-ce que ça veut dire? Dans l'élément de configuration ci-dessus, il existe une chaîne de package " net.czt.crazyant.service ". Réfléchissons donc nous-mêmes, comment le journal de sortie LOG4J se connecte-t-il à différents packages à différents fichiers? Pensez-y, il existe deux méthodes:
1. Utiliser l'intercepteur ou la méthode AOP, Log4j détecte la sortie du journal par lui-même. Lorsqu'il détecte quel package le journal est généré, il sera sorti dans le fichier correspondant;
2. L'utilisateur transmet un paramètre de classe, Log4j obtient le package correspondant de la classe et l'utilise comme base pour localiser différents fichiers journaux;
En regardant le code, il est évident que Log4j utilise cette dernière méthode simple et directe:
import org.apache.commons.logging.log; import org.apache.commons.logging.logfactory; La classe publique MyClasSIMPL implémente MyClass {/ ** * LOGER * / PRIVATE STATIC FINAL LOG LOGGER = LOGFACTORY.GETLOG (MYCLASSIMPL.CLASS); / ** * mon func * / public void myfunc () {logger.info ("Méthode d'appel myfunc."); }} Dans logger = LogFactory.getLog(MyClassImpl.class) , le paramètre de classe utilisant le journal de bûcher est passé, et l'adresse du package que la classe est réfléchie est l'adresse de package utilisée par Log4j pour sortir le journal.
Cette approche a également des fonctionnalités puissantes, ce qui facilite la classification logique logique. Par exemple, de nombreux codes n'appartiennent pas à un package, mais ils appartiennent à logiquement ensemble. Par exemple, le traitement des messages n'est pas seulement l'interface appelant le package de service, mais peut également appeler le fonctionnement de l'envoi de msg. Si vous souhaitez publier certains journaux dans le package MSG au service, alors lorsque le journal MSG est initialisé, une classe de service est très bien.
Ou pour tous les journaux d'une certaine classe, tous leurs objets de bûcheron peuvent provenir d'une seule instance d'objet encapsulé, et il n'y a qu'un seul paramètre passé dans cette instance d'objet unique, qui peut être utilisé pour identifier cette classification logique.
Résumer
Dans Log4j.properties , la sortie séparée des journaux du package ou de la classe spécifique est prise en charge, mais il nécessite également que l'initialisation du journalisation dans le code puisse correspondre au package dans la configuration du journal.
D'accord, ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article sera d'une aide à l'étude ou au travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer.