2017-11-30 3 views
8

Wenn ich Null-Wert in der Datumsspalte setze bekomme ich "1900-01-01 00: 00: 00.000" Wert in meiner Tabelle und ich erwarte NULL in dieser Spalte. Da dies richtig in jdbc behandelt, wenn ich wie diesesWie behandelt man Null beim Einstellen des Datums in log4j2 jdbcpender?

preparedStatement.setBindParam(Types.TIMESTAMP, 12, startdate); 

log4j2.xml

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

    <CustomLevels> 
     <CustomLevel name="TESTLOG" intLevel="552" /> 
    </CustomLevels> 

    <Appenders> 

     <JDBC name="myAppender" tableName="MYTABLE"> 
      <DataSource jndiName="java:MyDataSource" /> 
      <Column name="ID" pattern="%X{ID}" isUnicode="false"/> 
      <Column name="startdate" pattern="%X{startdate}" isUnicode="false"/> 
      <Column name="enddate" pattern="%X{enddate}" isUnicode="false"/> 
     </JDBC> 

    </Appenders> 

    <Loggers> 
     <Root level="trace" includeLocation="false"> 
      <AppenderRef ref="myAppender" level="TESTLOG" /> 
     </Root> 
    </Loggers> 

</Configuration> 

Datentyp der Spalten Startdatum und Enddatum ist Datumzeit

ThreadContext.put("startdate", startdate != null ? startdate.toString() : null); 
ThreadContext.put("enddate", a_reportEndDate != null ? enddate.toString() : null); 
final Logger LOGGER = LogManager.getLogger(); 
LOGGER.log(Level.forName("TESTLOG", 552), ""); 

Das gleiche für String mit Nullwert.

+1

Möglicherweise wurde Ihre Tabelle mit Standardwerten für Zeitstempelspalten erstellt? – Ivan

Antwort

2

Einfügen von null

Ich glaube nicht, dass es möglich null in jede Spalte jeder Art JDBCAppender wie diese mit Mustern zu bekommen.

This thread vor ein paar Jahren aufgetaucht, gefolgt von this Jira issue. Nichts davon scheint Aufmerksamkeit erregt zu haben.

Die kurze Version ist, dass ein StringBuilder zwischen Mustern und vorbereiteter Anweisung verwendet wird, und damit die INSERT bekommt immer ein Nicht-Null-String, auch wenn (in Ihrem Beispiel) null der Wert im ThreadContext ist. So ist es möglich, eine leere Zeichenfolge oder die Zeichenfolge "null" einzufügen, aber es scheint nicht möglich zu sein, den Wertnull einzufügen.

1. Januar 1900

Wenn ich dein Beispiel gegen eine MySQL-Datenbank ausführen, schlägt der Einsatz vorne, weil MySQL nicht weiß, wie ein DATETIME aus einem leeren String zu erstellen.

Ich vermute, Sie SQL Server verwenden, die gerne einen leeren String in 1900-01-01 00:00:00.000, weil natürlich schaltet das ist, was Sie gemeint.

Unabhängig von der von Ihnen verwendeten Datenbank wird JDBCAppender die INSERT-Anweisung mit Nicht-Null-Strings füllen. Was von dort passiert, wird von DB zu DB variieren.

Warum?

Zunächst mag es seltsam erscheinen, dass das Framework Ihren Wert (null) auf einen anderen Wert (leere Zeichenfolge) ändert. Im Kern ist die Protokollierung jedoch über Textzeichenfolgen.

Ja, es gibt einen Appender, der diese Strings in eine Datenbank schreibt. Und ja, Ihre Datenbank kann diese Zeichenketten wiederum in Typen wie DATETIME oder INTEGER überführen. Aber bei jedem Appender geht es nur darum, Strings zu manipulieren und auszugeben.

Mögliche Behelfslösung

Wenn Sie wirklich null in die Datenbank mit JDBCAppender erhalten möchten, können Sie in der Lage sein, write a trigger.

Schluss Beobachtung

nicht sicher, ob dies irgendwelche hilft, aber ich kann auch anwesend alle meine Erkenntnisse:

Mit ColumnMapping statt Column in Ihrem log4j Konfiguration ermöglicht es Ihnen, einen Klassennamen angeben. Die Anwesenheit (oder Abwesenheit) und der Wert dieses Klassennamens ändern den Wert, der in die Datenbank eingefügt wird. Zum Beispiel die Verwendung von SQL Server Express 2014:

<ColumnMapping name="startdate" pattern="%X{startdate}" type="java.sql.Timestamp"/> 

wird das aktuelle Datum und die Uhrzeit protokolliert, wenn startdate null ist, statt 1900-01-01. Wenn Sie stattdessen java.sql.Date verwenden, wird das aktuelle Datum ohne Zeitangabe protokolliert.

+0

Da ich Java 6 verwende und ColumnMapping in log4j-core-2.3.jar nicht unterstützt wird – happy

Verwandte Themen