2012-03-30 4 views
3

Я пытаюсь импортировать содержимое файла журнала в базу данных с помощью Spring Batch.Spring Batch: Как обрабатывать многострочные файлы журнала

В настоящее время я использую FlatFileItemReader, но, к сожалению, есть много записей журнала, которые не улавливаются. Двумя основными проблемами являются:

  1. Строки, содержащие многоканальный 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 
    }' 
    
  2. Строки, которые содержат стек следы

    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) 
    

В принципе, я нужен FlatFileItemReader, чтобы продолжать чтение, пока не достигнет следующей отметки времени, пока агрегирует все строки до этого. Раньше это делалось раньше (весенняя партия)

ответ

1

Решение заключалось в том, чтобы написать пользовательский считыватель, который отслеживает последние несколько строк и ищет определенный шаблон, который отмечает правильные строки. Я не нашел ничего готового в Spring Batch, но я мог бы использовать много существующего кода. Решение является проприетарным, поэтому я не могу опубликовать его здесь, извините, но вот как это работает:

  1. Держите LinkedList линий. LinkedList важен, потому что мы будем обращаться к нему как к списку, так и к очереди.
  2. В вашем методе чтения запустите цикл: прочитайте следующую строку и запишите ее в свою очередь. Проверьте свою очередь, чтобы увидеть, есть ли у вас две допустимые строки (вам нужен доступ к списку здесь). Если вы это сделаете, верните все строки перед второй допустимой линией (и удалите их из очереди). Если вы не найдете допустимую строку, верните нуль.

Излишне говорить, что это решение заметно медленнее, чем встроенный FlatFileItemReader, но он получает правильные данные.