Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring批处理:如何处理多行日志文件_Java_Spring_Spring Batch_Flat File - Fatal编程技术网

Java Spring批处理:如何处理多行日志文件

Java Spring批处理:如何处理多行日志文件,java,spring,spring-batch,flat-file,Java,Spring,Spring Batch,Flat File,我正在尝试使用SpringBatch将日志文件的内容导入数据库 我目前正在使用FlatFileItemReader,但不幸的是,有许多日志条目无法捕获。两个主要问题是: 包含多行JSON字符串的行: 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":

我正在尝试使用SpringBatch将日志文件的内容导入数据库

我目前正在使用FlatFileItemReader,但不幸的是,有许多日志条目无法捕获。两个主要问题是:

  • 包含多行JSON字符串的行:

    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
    }'
    
  • 包含堆栈跟踪的行

    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:50596错误main com.meetup.memcached.SockIOPool.createSocket(SockIOPool.java:859):没有到主机的路由
    java.net.NoRouteToHostException:没有到主机的路由
    位于sun.nio.ch.Net.connect0(本机方法)
    位于sun.nio.ch.Net.connect(Net.java:364)
    位于sun.nio.ch.Net.connect(Net.java:356)
    位于sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:623)
    位于sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:92)
    位于com.meetup.memcached.SockIOPool$SockIO.getSocket(SockIOPool.java:1703)
    在com.meetup.memcached.SockIOPool$SockIO。(SockIOPool.java:1674)
    在com.meetup.memcached.SockIOPool.createSocket(SockIOPool.java:850)上
    在com.meetup.memcached.SockIOPool.populateBuckets(SockIOPool.java:737)上
    位于com.meetup.memcached.SockIOPool.initialize(SockIOPool.java:695)
    

  • 基本上,我需要FlatFileItemReader继续读取,直到到达下一个时间戳,同时聚合之前的所有行。(在Spring Batch中)以前是否做过这样的事情?解决方案是编写一个自定义读取器,回溯最后几行并查找标记有效行开始的特定模式。我没有在SpringBatch中找到任何预先制作的东西,但我可以重用大量现有代码。该解决方案是专有的,因此我无法在此发布,抱歉,但它是这样工作的:

  • 保持一个行的链接列表。LinkedList很重要,因为我们将以列表和队列的形式访问它
  • 在read方法中,启动一个循环:读取下一行并将其写入队列。检查您的队列,看看是否有两个有效行(您需要在此处访问列表)。如果这样做,请返回第二个有效行之前的所有行(并将它们从队列中删除)。如果找不到任何有效行,请返回null
  • 不用说,这个解决方案明显比内置的FlatFileItemReader慢,但它可以获得正确的数据。

    现在,解决这个用例有一个常见问题