[JAVA] Déconnectez un fichier CSV qui peut être lu par Excel à l'aide de la fonction logback

introduction

Nous avons reçu une demande d'un utilisateur pour analyser et auditer l'état d'utilisation des applications Web. À l'origine, logback était utilisé pour la sortie du journal, j'ai donc décidé de le prendre en charge en sortant un fichier CSV à partir de logback.

Ce que j'ai fait

--Ouvre un fichier CSV UTF-8 avec BOM.

Méthode de réalisation

Je l'ai fait en faisant référence à Ajouter une expression au début de chaque fichier journal en utilisant Logback --Stack Overflow.

Créez votre propre Appender

Préparez un Appender qui place la nomenclature et le libellé fixe au début du fichier.

AuthFileAppender.java


public class AuthFileAppender extends RollingFileAppender {
    @Override
    public void openFile(String fileName) throws IOException {
        super.openFile(fileName);
        File activeFile = new File(getFile());
        if (activeFile.exists() && activeFile.isFile() && activeFile.length() == 0) {
            //Sortie de la nomenclature et de l'en-tête uniquement lorsque la cible de sortie est un fichier vide
            lock.lock();
            try {
                OutputStream outputStream = super.getOutputStream();
                //BOM de sortie
                outputStream.write(0xef);
                outputStream.write(0xbb);
                outputStream.write(0xbf);
                //Libellé fixe de sortie (en-tête CSV)
                outputStream.write("Date d'opération,Moment de l'opération,Identifiant d'utilisateur,Nom d'utilisateur,Détails de l'opération,ID de la personne cible de l'opération ・ ・ ・\n".getBytes());
                if (super.isImmediateFlush()) {
                    outputStream.flush();
                }
            } finally {
                lock.unlock();
            }
        }
    }
}

Création d'une classe pour la sortie du journal

Je voulais standardiser le processus d'acquisition des informations de connexion des utilisateurs, et je voulais également standardiser Logger, j'ai donc décidé de préparer un cours.

AuthLogger.java


@Component
public class AuthLogger {

    /**Enregistreur qui génère des journaux d'audit*/
    public static final Logger AUTH_LOGGER = LoggerFactory.getLogger(AuthLogger.class);

    /**Service aux particuliers*/
    @Autowired
    protected PersonService personService;

    /**
     *Le journal d'audit est généré sans spécifier l'individu cible.
     *
     * @opération param Détails de l'opération
     */
    public void log(String operation) {
        log(operation, null);
    }

    /**
     *Spécifiez la personne cible et éditez le journal d'audit.
     *
     * @opération param Détails de l'opération
     * @param personId ID de la personne qui l'a géré
     */
    public void log(String operation, String personId) {
        SsoLoginData ssoLoginData = SsoLoginDataUtil.getSsoLoginData(); //Obtenir les informations de connexion de l'utilisateur
        AUTH_LOGGER.trace(String.join(
            ",", //Sortie séparée par des virgules
            //La date et l'heure de l'opération sont enregistrées.Non requis ici car il est défini dans la mise en page en xml
            ssoLoginData.getPersonId(), //Identifiant d'utilisateur
            ssoLoginData.getUserName(), //Nom d'utilisateur
            operation, //Détails de l'opération
            personId //Nom d'utilisateur
            //En fait, définissez le contenu de sortie à l'aide de personService ici
        ));
    }
}

Ajout des paramètres logback.xml

Ajoutez les paramètres suivants à logback.xml.

logback.xml


  <appender name="AUTH_APPENDER" class="your.project.web.common.util.AuthFileAppender">
    <file>/your/file/path.csv</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>/your/file/path.%d{yyyy-MM}.csv</fileNamePattern>
    </rollingPolicy>
    <encoder>
      <charset>UTF-8</charset>
      <pattern>%d{yyyy-MM-dd},%d{HH:mm:ss},%msg%n</pattern>
    </encoder>
  </appender>

  <logger name="your.project.web.common.util.AuthLogger" level="TRACE" additivity="false">
    <appender-ref ref="AUTH_APPENDER" />
  </logger>

Ajouter une sortie de journal à une implémentation individuelle

Cette fois, j'ai décidé de DI le AuthLogger mentionné ci-dessus dans le contrôleur de Spring MVC et d'exécuter la méthode de journalisation directement. (La mise en œuvre est omise ici.) En fonction de l'échelle et des exigences du projet, je pense qu'il existe une option de sortie par AOP.

Résumé et impressions

Logback n'avait pas de fonction pour mettre un libellé fixe (y compris la nomenclature) au début du fichier, j'ai donc décidé de préparer mon propre Appender, mais c'était relativement facile à réaliser. Cette fois, il a été supposé que l'utilisateur vérifierait le fichier journal de sortie directement dans Excel, nous avons donc pris les mesures ci-dessus. En fonction des besoins, vous pouvez sortir le fichier journal sans nomenclature / en-tête, puis le combiner avec la nomenclature / en-tête avec un script.

Recommended Posts

Déconnectez un fichier CSV qui peut être lu par Excel à l'aide de la fonction logback
Créez un fichier jar qui peut être exécuté sur Gradle
Ecrire une classe qui peut être ordonnée en Java Un petit mémo standard
Lire les éléments contenant des virgules dans les fichiers CSV sans fractionnement (Java)
Comment créer une paire de clés d'ecdsa dans un format lisible par Java
Je souhaite pouvoir lire des fichiers en utilisant refile avec administrate [rails6]
Lire une chaîne dans un fichier PDF avec Java
Un fichier bat qui utilise Java dans Windows
Interface fonctionnelle de base compréhensible en 3 minutes
Touches de raccourci pratiques pour Eclipse
Liste des appareils pouvant être prévisualisés avec Swift UI
Créer un contrôle de page qui peut être utilisé avec RecyclerView
Activez la cellule A1 de chaque feuille de fichier Excel avec Java
Introduction à Rakefile qui peut être effectuée en 10 minutes environ
Rechercher une instruction Switch qui peut être convertie en une expression Switch
Java (édition super débutante) compréhensible en 180 secondes