Wir haben eine Anfrage von einem Benutzer erhalten, den Nutzungsstatus von Webanwendungen zu analysieren und zu prüfen. Ursprünglich wurde Logback für die Protokollausgabe verwendet, daher habe ich beschlossen, es durch Ausgabe einer CSV-Datei aus Logback zu unterstützen.
Ich habe es unter Bezugnahme auf Hinzufügen eines Ausdrucks am Anfang jeder Protokolldatei mit Logback - Stapelüberlauf erstellt.
Bereiten Sie einen Anhang vor, in dem Stückliste und fester Wortlaut am Anfang der Datei stehen.
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) {
//Ausgabe Stückliste und Header nur, wenn das Ausgabeziel eine leere Datei ist
lock.lock();
try {
OutputStream outputStream = super.getOutputStream();
//Stückliste ausgeben
outputStream.write(0xef);
outputStream.write(0xbb);
outputStream.write(0xbf);
//Feste Formulierung ausgeben (CSV-Header)
outputStream.write("Betriebsdatum,Betriebszeit,Benutzeridentifikation,Nutzername,Betriebsdetails,Operation Zielperson ID ・ ・ ・\n".getBytes());
if (super.isImmediateFlush()) {
outputStream.flush();
}
} finally {
lock.unlock();
}
}
}
}
Ich wollte den Prozess des Erfassens von Anmeldebenutzerinformationen standardisieren, und ich wollte auch Logger standardisieren, also entschied ich mich, eine Klasse vorzubereiten.
AuthLogger.java
@Component
public class AuthLogger {
/**Logger, der Überwachungsprotokolle ausgibt*/
public static final Logger AUTH_LOGGER = LoggerFactory.getLogger(AuthLogger.class);
/**Service für Einzelpersonen*/
@Autowired
protected PersonService personService;
/**
*Das Überwachungsprotokoll wird ohne Angabe der Zielperson ausgegeben.
*
* @param operation Betriebsdetails
*/
public void log(String operation) {
log(operation, null);
}
/**
*Geben Sie die Zielperson an und geben Sie das Überwachungsprotokoll aus.
*
* @param operation Betriebsdetails
* @param personId ID der Person, die damit umgegangen ist
*/
public void log(String operation, String personId) {
SsoLoginData ssoLoginData = SsoLoginDataUtil.getSsoLoginData(); //Holen Sie sich Login-Benutzerinformationen
AUTH_LOGGER.trace(String.join(
",", //Ausgabe durch Kommas getrennt
//Betriebsdatum und Betriebszeit sind logback.Hier nicht erforderlich, da es im Layout in XML festgelegt ist
ssoLoginData.getPersonId(), //Benutzeridentifikation
ssoLoginData.getUserName(), //Nutzername
operation, //Betriebsdetails
personId //Nutzername
//Stellen Sie hier den Ausgabeinhalt mit personService ein
));
}
}
@ Autowired
.String.join
, um die CSV zu erhalten.
--Wenn Sie es in doppelte Anführungszeichen setzen möchten oder wenn der Ausgabewert Zeilenumbrüche enthält, wird empfohlen, eine CSV-spezifische Bibliothek wie opencsv zu verwenden.Fügen Sie logback.xml die folgenden Einstellungen hinzu.
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>
additivity =" false "
. Es wird nur AUTH_APPENDER verwendet.Dieses Mal habe ich beschlossen, den oben genannten AuthLogger im Controller von Spring MVC zu DI und die Protokollmethode direkt auszuführen. (Die Implementierung wird hier weggelassen.) Abhängig vom Umfang und den Anforderungen des Projekts gibt es meiner Meinung nach eine Option für die Ausgabe durch AOP.
Logback hatte keine Funktion, um einen festen Wortlaut (einschließlich Stückliste) am Anfang der Datei einzufügen, daher entschied ich mich, meinen eigenen Appender vorzubereiten, aber es war relativ einfach zu realisieren. Dieses Mal wurde angenommen, dass der Benutzer die Ausgabeprotokolldatei direkt in Excel überprüfen würde, daher haben wir die oben genannten Maßnahmen ergriffen. Abhängig von den Anforderungen können Sie die Protokolldatei ohne Stückliste / Kopf ausgeben und sie dann mit Stückliste / Kopf mit einem Skript kombinieren.
Recommended Posts