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.
--Ouvre un fichier CSV UTF-8 avec BOM.
Je l'ai fait en faisant référence à Ajouter une expression au début de chaque fichier journal en utilisant Logback --Stack Overflow.
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();
}
}
}
}
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
));
}
}
Component
.
--PersonService est DI avec @ Autowired
.String.join
pour obtenir le CSV.
--Si vous souhaitez le mettre entre guillemets ou si la valeur de sortie contient des sauts de ligne, il est recommandé d'utiliser une bibliothèque spécifique CSV telle que opencsv.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>
/ votre / fichier / chemin
est en fait $ {log.auth.output}
, et elle est remplacée par la valeur en fonction de l'environnement en cours d'exécution lorsque l'application est construite.
--Le fileNamePattern de la RollingPolicy est % d {yyyy-MM}
car il est tourné sur une base mensuelle.
――Nous avons décidé d'utiliser la fonction Logback pour afficher la date et l'heure de l'opération, qui sont les deux premiers éléments de CSV. Par conséquent, % d {aaaa-MM-jj},% d {HH: mm: ss},
est défini au début du modèle.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.
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