2012-03-30 112 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慢得多,但它获得了正确的数据。

    相关问题