J'ai essayé d'utiliser Log4j2 sur un serveur Java EE

À propos de l'environnement

L'environnement est le même que dans l'article que j'ai écrit plus tôt. Préparation de l'environnement d'exécution de Tomcat dans IntelliJ Community

Pour résumer grossièrement, cela ressemble à ce qui suit.

type Logiciel
Langue Java SE 8
API serveur JavaEE
Log API Log4j2
IDE IntelliJ Community
Outil de création Gradle
récipient Tomcat

Créer un dossier d'application Web

S'il s'agit d'un projet JavaEE, il a peut-être déjà été créé, mais créez un répertoire comme suit. -> src-> main-> webapp () -> WEB-INF () (*) Répertoire à créer Aussi, définissons correctement les répertoires sur "webapp" et "WEB-INF".

Créez également des répertoires "classes" et "lib" dans WEB-INF.

Ajout de log4j2 au projet

Ajoutez ce qui suit aux dépendances de build.gradle.

dependencies {
    //Rendre log4j disponible
    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.1'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1'
    compile group: 'org.apache.logging.log4j', name: 'log4j-web', version: '2.11.1'
}

Créer une classe Logger

Lors de l'écriture d'un journal, il est gênant d'écrire le code préparatoire à chaque fois, créez donc une classe wrapper comme suit. Pour le code, je me suis référé au lien ci-dessous. Spring MVC petit diamètre, un petit détour, journalisation de petit diamètre

import org.apache.logging.log4j.LogManager;

import java.io.File;

/**
 *Effectuer le processus de journalisation
 */
public class Log4j {

    private static Log4j logger = null;

    private Log4j() {
    }

    public static synchronized Log4j getInstance() {
        if (logger == null) {
            logger = new Log4j();
        }
        return logger;
    }

    private String getMessage(final String msg) {
        String thisClassName = this.getClass().getName();
        //Obtenir le nom de la classe
        String SuperClassName = Logger.class.getName();
        Thread t = Thread.currentThread();
        StackTraceElement[] stackTraceElements = t.getStackTrace();
        int pos = 0;
        for (StackTraceElement stackTraceElement : stackTraceElements) {
            String steClassName = stackTraceElement.getClassName();
            if (thisClassName.equals(steClassName) || SuperClassName.equals(steClassName)){
                break;
            }
            pos++;
        }
        pos += 2;
        StackTraceElement m = stackTraceElements[pos];
        return m.getClassName() + ":" + m.getMethodName() + "() \n" + msg;
    }

    private String getErrorMessage(final Exception e) {
        StringBuilder sb = new StringBuilder();
        StackTraceElement[] st = e.getStackTrace();
        if (st != null && st.length > 0) {
            sb.append("Class:")
                    .append(e.getClass().getName())
                    .append("¥n")
                    .append("Detail:")
                    .append(e.getMessage())
                    .append("¥n");
            for (StackTraceElement s : st) {
                sb.append(s.toString())
                        .append("¥n");
            }
        }
        return sb.toString();
    }

    public void debug(final String msg) {
        LogManager.getLogger(this.getClass()).debug(getMessage(msg));
    }

    public void info(final String msg) {
        LogManager.getLogger(this.getClass()).info(getMessage(msg));
    }

    public void info(final Object obj, final String msg) {
        LogManager.getLogger(obj.getClass()).info(msg);
    }
    public void warn(final String msg) {
        LogManager.getLogger(this.getClass()).warn(getMessage(msg));
    }

    public void error(final Exception e) {
        LogManager.getLogger(e.getClass()).error(getErrorMessage(e));
    }

    public void trace(final String msg) {
        LogManager.getLogger(this.getClass()).trace(getMessage(msg));
    }

    public void fatal(final String msg) {
        LogManager.getLogger(this.getClass()).fatal(getMessage(msg));
    }
}

Dans EndPoint, appelez et utilisez comme suit.

Log4j logger = Log4j.getInstance();
logger.info("Écrivez le contenu du journal ici");

Les niveaux de journaux suivants sont préparés dans log4j et la méthode d'enroulement est définie en conséquence.

fatal > error > warn > info > debug > trace

Explication approfondie de Log4J

Créer le fichier de configuration log4j2

Le fichier de configuration log4j2 est décrit dans un fichier xml nommé "log4j2.xml". De plus, dans Tomcat, vous pouvez le charger automatiquement en le plaçant dans le dossier webapp-> WEB-INF-> classes. Voici un exemple de la façon de remplir log4j2.xml.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off">

    <Properties>
        <Property name="loglayout">[%d{yyyy-MM-dd HH:mm:ss.SSS}], %-5p, %t, %c, %m%n</Property>
    </Properties>

    <Appenders>
        <!--
            fileName:Nom de fichier pour sortir le journal
            filePattern:Schéma des fichiers à compresser lorsque les journaux sont accumulés
        -->
        <RollingFile name="rolling" fileName="./log/webapp.log" filePattern="./log/webapp-%d{yyyy-MM-dd}-%i.zip">
            <PatternLayout pattern="${loglayout}"/>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${ptn}" />
        </Console>
    </Appenders>

    <Loggers>
        <!--
            name:Nom du package pour la sortie du journal
            level:Niveau de sortie du journal
            additivity:S'il faut sortir le journal supérieur
        -->
        <Logger name="Logger" level="info" additivity="true">
            <AppenderRef ref="rolling"/>
        </Logger>
    </Loggers>
</Configuration>

Pour plus d'informations, consultez les liens ci-dessous.

Sortie du journal avec Log4j2

Changer le chemin du fichier lorsqu'il devient une guerre

Dans le projet Gradle, le chemin relatif se trouve directement sous le projet, le répertoire du fichier est donc . -> log Cependant, dans Tomcat, la racine du chemin relatif est le dossier d'installation de tomcat, donc .-> webapps-> -> WEB-INF-> log Doit être. Il semblait y avoir un moyen de le spécifier en xml, log4j2.xml // Pour le développement log4j2_exe.xml // Pour la production Seulement quand c'est une guerre log4j2_test.xml // Pour le développement log4j2.xml // Pour la production Cela correspondait en changeant le nom en.

En fait, ajoutez le code suivant à build.gradle.

//exécuter avant d'exécuter la tâche de guerre
war.doFirst {
    //Obtenir le fichier enfant
    java.io.File[] flist = (new java.io.File("./src/main/webapp/WEB-INF/classes")).listFiles();
    for(i in flist) {
        //Jugement du nom de fichier
        switch (i.getName()) {
            case "log4j2.xml":
                //Renommer
                i.renameTo(new java.io.File("./src/main/webapp/WEB-INF/classes/log4j2_test.xml"));
                break;

            case "log4j2_exe.xml":
                i.renameTo(new java.io.File("./src/main/webapp/WEB-INF/classes/log4j2.xml"));
                break;
        }
    }
}

//Exécuter après l'exécution de la tâche de guerre
war.doLast {
    java.io.File[] flist = (new java.io.File("./src/main/webapp/WEB-INF/classes")).listFiles();
    for(i in flist) {
        switch (i.getName()) {
            case "log4j2_test.xml":
                i.renameTo(new java.io.File("./src/main/webapp/WEB-INF/classes/log4j2.xml"));
                break;

            case "log4j2.xml":
                i.renameTo(new java.io.File("./src/main/webapp/WEB-INF/classes/log4j2_exe.xml"));
                break;
        }
    }
}

problème

Lors de la création d'un fichier pour chaque exécution de tâche de guerre, git ne le reconnaît pas comme un fichier de gestion -> Vous devriez pouvoir le définir dans un xml

Recommended Posts

J'ai essayé d'utiliser Log4j2 sur un serveur Java EE
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé d'exécuter Java dans un terminal Mac
J'ai essayé d'utiliser Java REPL
J'ai essayé de gratter un graphique boursier en utilisant Java (Jsoup)
J'ai créé un environnement Java EE sur AWS et essayé d'exécuter une application Web
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé d'utiliser JWT en Java
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai essayé d'utiliser Google HttpClient de Java
J'ai essayé d'utiliser le référentiel GitHub comme serveur de bibliothèque
J'ai essayé d'utiliser l'API Elasticsearch en Java
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
J'ai essayé d'utiliser Junit avec Mac VScode Maven
J'ai essayé de mettre facilement Java sur mon Mac
java j'ai essayé de casser un simple bloc
J'ai essayé de frapper une méthode Java d'ABCL
Essayez la communication en utilisant gRPC sur un serveur Android + Java
J'ai essayé de casser le bloc avec java (1)
J'ai essayé d'utiliser Gson
J'ai essayé d'utiliser TestNG
J'ai essayé d'utiliser Galasa
[Java] J'ai essayé de me connecter en utilisant le pool de connexion avec Servlet (tomcat) & MySQL & Java
Créez un environnement de développement Java à l'aide de jenv sur votre Mac
J'ai essayé d'utiliser une connexion à une base de données dans le développement Android
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'utiliser YOLO v4 sur Ubuntu et ROS
J'ai essayé OCR de traiter un fichier PDF avec Java
Utilisation de la base de données (SQL Server 2014) à partir d'un programme Java 04/01/2018
Ce que j'ai appris lors de la création d'un serveur en Java
J'ai essayé d'utiliser l'instruction Extended for en Java
J'ai essayé d'exécuter une application d'accès à la base de données sur IKS + Db2 sur IBM Cloud (6. Préparation de l'application d'accès à la base de données (java))
Je souhaite l'implémenter en plus lors de l'utilisation de kotlin sur un site exécutant Java
J'ai essayé d'utiliser azure cloud-init
J'ai essayé d'utiliser Apache Wicket
Faire un diamant en utilisant Java
J'ai essayé la métaprogrammation avec Java
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé d'ajouter une ligne de séparation à TabLayout sur Android
Essayez de lancer un serveur WebAP sur le micro à l'aide d'Helidon
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai essayé d'utiliser Dapr en Java pour faciliter le développement de microservices
Essayez Hello World en utilisant Java brut sur le conteneur Docker
J'ai créé un client RESAS-API en Java
J'ai essayé OCR de traiter un fichier PDF avec Java part2
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
J'ai créé un Dockerfile pour démarrer Glassfish 5 en utilisant Oracle Java
[Java] J'ai essayé de créer un jeu Janken que les débutants peuvent exécuter sur la console
J'ai essayé d'utiliser anakia + Jing maintenant
Exécutez l'application Java EE sur CICS
OSX 10.15 (Catalina) Utilisation de Java avec β