Wie zum bereinigen von log-Meldungen in Log4j das speichern in Datenbank
Ich versuche zu speichern von log-Meldungen an eine zentrale Datenbank. Um dies zu tun, habe ich Folgendes konfiguriert Appender in log4j xml Konfiguration:
<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
<param name="URL" value="jdbc:postgresql://localhost/logging_test" />
<param name="user" value="test_user" />
<param name="password" value="test_password" />
<param name="sql" value="INSERT INTO log_messages ( log_level, message, log_date ) VALUES ( '%p', '%m', '%d{yyyy-MM-dd HH:mm:ss}' )" />
</appender>
Dies funktioniert gut, außer einige der Nachrichten, die enthalten ', und dann werden die appender ausfällt.
Gibt es eine einfache Möglichkeit, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick auf diese nicht-offiziellen Log4J JDBCAppender, die behebt dieses Problem und ist veröffentlicht unter der Apache-2.0-Lizenz. Zitieren seine Funktionen im Vergleich zu
org.apache.log4j.jdbc.JDBCAppender
:Oder, und sollten Sie ernsthaft erwägen diese option, wechseln Sie von log4j zu seinem Nachfolger, logback (dies ist, wo die Dinge passieren), hat einen
DBAppender
verwendetPreparedStatement
(siehe Quellen), das kann eine JNDI datasource, connection-pooling (dies ist ein großes plus), etc. Für weitere Informationen zu dieser Appen finden Sie im online-Handbuch http://logback.qos.ch/manual/appenders.html#DBAppenderorg.apache.log4j.jdbc.JDBCAppender
Ich würde vorschlagen, erstellen Sie eine benutzerdefinierte Appen und überschreiben der
flushBuffer
undexecute
Methoden, wo man flüchten kann deine Saiten oder verwenden SiePreparedStatement
:Erklären, warum Sie außer Kraft setzen müssen
flushBuffer
- die appender legtLogEvent
Objekte in einen Puffer, das später gespült in Richtung auf das Ziel (Datenbank, in diesem Fall). Hier dieflushBuffer
Methode verwendetgetLogStatement
(überexecute
) ein normalesStatement
. Sie können ersetzen, dass das Verhalten vollständig. Werfen Sie einen Blick auf der aktuelle QuellcodeDann registrieren Sie Ihre Appen statt
JDBCAppender
.Ich bin nicht vertraut mit log4j oder JDBC, aber ich weiß, JDBC unterstützt prepared statements. Vielleicht gibt es einen Weg zu verwenden, die mit der JDBCAppender
löste ich die Sache in der folgenden Weise :
Kopiert den Quellcode der
JDBCAppender
genanntACMEJDBCAppender
überschreiben der
getLogStatement(LoggingEvent event)
Methode, das Klonen der alten Veranstaltung und bietet die neue one mit dem entkam Nachricht.Nicht die sauberste Lösung aus der oop-Sicht, sondern es macht die Arbeit. Hoffe, es hilft.
Als pro die Javadocs, die offizielle JDBCAppender ziemlich beschränkt ist, und insbesondere hat keinen guten Umgang mit diesem Problem.
Ein Weg, um es zu verwenden eine alternative appender, wie diese eine die Ziele funktional kompatibel mit der Log4J-außer, Sie wissen, arbeiten.
Dieses problem zu umgehen, Protokollierung in Oracle verwenden, können Sie Oracle-quote-operator.
Wickeln Sie den quote-operator um %m (d.h. q#'%m'#)
Beispiel:
Joao, sorry für die Verspätung, aber hier ist es:
Hoffe, es hilft!
Wenn Sie SQL server verwenden, können Sie die folgenden
Das verschiebt das problem von doppelten Anführungszeichen. Wenn Sie keine doppelten Anführungszeichen in Ihren Nachrichten das könnte das problem lösen.
For postgresql verwenden $$
Beispiel: $$%m$$