2017-11-30 17 views
8

जब मैं दिनांक कॉलम में शून्य मान सेट करता हूं तो मुझे "1 9 00-01-01 00: 00: 00.000" मेरी तालिका में मूल्य मिलता है और मैं उस कॉलम में पूर्ण होने की उम्मीद कर रहा हूं। अगर मैं इसlog4j2 jdbcappender में दिनांक निर्धारित करते समय शून्य को कैसे संभालें?

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

log4j2.xml स्तंभों की

<?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> 

डाटाटाइप STARTDATE की तरह डाल इस रूप में JDBC में ठीक से नियंत्रित किया जाता है और ENDDATE datetime

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), ""); 

ही है शून्य मूल्य के साथ स्ट्रिंग के लिए।

+1

शायद आपकी तालिका टाइमस्टैम्प कॉलम के लिए डिफ़ॉल्ट मानों के साथ बनाई गई थी? – Ivan

उत्तर

2

सम्मिलित करना अशक्त

मैं इसे किसी भी प्रकार के इस तरह के पैटर्न के साथ JDBCAppender का उपयोग कर के किसी भी स्तंभ में null प्राप्त करना संभव है नहीं लगता।

This thread कुछ साल पहले पॉप अप किया गया, उसके बाद this Jira issue। ऐसा लगता है कि इसमें से कोई भी ध्यान नहीं मिला है।

लघु संस्करण है कि एक StringBuilder पैटर्न और तैयार बयान के बीच प्रयोग किया जाता है, और इस तरह INSERT हमेशा एक गैर-शून्य स्ट्रिंग हो जाता है, भले ही (अपने उदाहरण में) nullThreadContext में मूल्य है। तो एक खाली स्ट्रिंग, या स्ट्रिंग "null" डालना संभव है, लेकिन यह मानnull डालने के लिए संभव नहीं प्रतीत होता है।

1 जनवरी, 1900

जब मैं एक MySQL डेटाबेस के खिलाफ अपने उदाहरण चलाने के लिए, डालने सामने विफल रहता है, क्योंकि MySQL कैसे एक खाली स्ट्रिंग से एक DATETIME निर्माण करने के लिए पता नहीं है।

मैं तुम्हें एसक्यूएल सर्वर है, जो खुशी से 1900-01-01 00:00:00.000 में कोई रिक्त स्ट्रिंग हो जाएगा का उपयोग कर रहे हैं, क्योंकि पाठ्यक्रम है कि आप क्या मतलब का अनुमान लगा रहा हूँ।

आपके द्वारा उपयोग किए जाने वाले डेटाबेस के बावजूद, JDBCAppender गैर-शून्य तारों के साथ INSERT कथन भरने जा रहा है। वहां से क्या होता है डीबी से डीबी में भिन्न होगा।

क्यों?

सबसे पहले यह अजीब लग सकता है कि ढांचा आपके मूल्य (null) को दूसरे मान (खाली स्ट्रिंग) में बदल रहा है। हालांकि, इसके मूल पर, लॉगिंग टेक्स्ट के तारों के बारे में है।

हां, एक एपेंडर है जो इन तारों को डेटाबेस में लिख देगा। और हां, आपका डेटाबेस बदले में उन तारों को DATETIME या INTEGER जैसे प्रकारों में जोड़ सकता है। लेकिन किसी दिए गए एपेंडर को, यह वास्तव में स्ट्रिंग्स को मैनिपुलेट करने और आउटपुट करने के बारे में है।

संभव काम के आसपास

तुम सच में डेटाबेस JDBCAppender का उपयोग करते हुए null प्राप्त करना चाहते हैं, तो आप write a trigger करने में सक्षम हो सकता है।

अंतिम अवलोकन

सुनिश्चित नहीं हैं कि अगर यह किसी भी मदद करता है, लेकिन मैं कर सकते हैं और साथ ही वर्तमान में मेरे सभी निष्कर्ष:

बजाय ColumnMapping का उपयोग करते हुए अपने log4j config में Column आप एक वर्ग के नाम निर्दिष्ट करने के लिए अनुमति देता है। उपस्थिति (या अनुपस्थिति) और इस वर्ग के नाम का मान डेटाबेस में डाले गए मान को बदल देता है। उदाहरण के लिए, SQL सर्वर एक्सप्रेस 2014 का उपयोग कर:

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

1900-01-01 के बजाय, कारण होगा वर्तमान दिनांक और समय लॉग इन करने की जब startdate रिक्त है। java.sql.Date का उपयोग करके वर्तमान समय के बिना वर्तमान दिनांक लॉग कर देगा।

+0

चूंकि मैं जावा 6 का उपयोग कर रहा हूं और कॉलम मैपिंग लॉग 4j-core-2.3.jar में समर्थित नहीं है – happy

संबंधित मुद्दे