2012-03-30 147 views
3

我想使用Spring批處理將日誌文件的內容導入到數據庫中。Spring批處理:如何處理多行日誌文件

我目前正在使用FlatFileItemReader,但不幸的是有許多日誌條目不能捕獲。的兩個主要問題是:包含多行JSON字符串

  1. 線:包含堆棧跟蹤

    2012-03-22 11:47:50,596 ERROR main com.meetup.memcached.SockIOPool.createSocket(SockIOPool.java:859): No route to host 
    java.net.NoRouteToHostException: No route to host 
         at sun.nio.ch.Net.connect0(Native Method) 
         at sun.nio.ch.Net.connect(Net.java:364) 
         at sun.nio.ch.Net.connect(Net.java:356) 
         at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:623) 
         at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:92) 
         at com.meetup.memcached.SockIOPool$SockIO.getSocket(SockIOPool.java:1703) 
         at com.meetup.memcached.SockIOPool$SockIO.<init>(SockIOPool.java:1674) 
         at com.meetup.memcached.SockIOPool.createSocket(SockIOPool.java:850) 
         at com.meetup.memcached.SockIOPool.populateBuckets(SockIOPool.java:737) 
         at com.meetup.memcached.SockIOPool.initialize(SockIOPool.java:695) 
    

基本上

2012-03-22 11:47:35,307 DEBUG main someMethod(SomeClass.java:56): Do Something(18,true,null,null,null): my.json = '{ 
    "Foo":"FooValue", 
    "Bar":"BarValue", 
    ... etc 
}' 
  • 線,我所需要的FlatFileItemReader繼續讀取,直到它達到下一個時間戳,同時聚合所有行。之前是否有過這樣的事情(在Spring批處理中)

  • 回答

    1

    解決方案是編寫一個自定義閱讀器,用於回溯最後幾行並查找標記有效行開始的特定模式。我沒有在Spring Batch中找到任何預製的東西,但我可以重複使用很多現有的代碼。該解決方案是專有的,所以我不能在這裏發佈,對不起,但這是它是如何工作的:

    1. 保留行的LinkedList。 LinkedList很重要,因爲我們將它作爲List和Queue來訪問。
    2. 在讀取方法中,啓動一個循環:讀取下一行並將其寫入隊列。檢查你的隊列,看看你有沒有兩條有效的線(你需要在這裏訪問列表)。如果是這樣,則返回第二條有效行之前的所有行(並將其從隊列中移除)。如果您沒有找到任何有效的行,則返回null。

    不用說,這個解決方案比內置的FlatFileItemReader慢得多,但它獲得了正確的數據。

    相關問題