Spring批处理:如何处理多行日志文件
问题描述:
我想使用Spring批处理将日志文件的内容导入到数据库中。Spring批处理:如何处理多行日志文件
我目前正在使用FlatFileItemReader,但不幸的是有许多日志条目不能捕获。的两个主要问题是:包含多行JSON字符串
-
线:包含堆栈跟踪
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批处理中)
答
解决方案是编写一个自定义阅读器,用于回溯最后几行并查找标记有效行开始的特定模式。我没有在Spring Batch中找到任何预制的东西,但我可以重复使用很多现有的代码。该解决方案是专有的,所以我不能在这里发布,对不起,但这是它是如何工作的:
- 保留行的LinkedList。 LinkedList很重要,因为我们将它作为List和Queue来访问。
- 在读取方法中,启动一个循环:读取下一行并将其写入队列。检查你的队列,看看你有没有两条有效的线(你需要在这里访问列表)。如果是这样,则返回第二条有效行之前的所有行(并将其从队列中移除)。如果您没有找到任何有效的行,则返回null。
不用说,这个解决方案比内置的FlatFileItemReader慢得多,但它获得了正确的数据。
不错,谢谢... – 2015-01-21 15:09:27