Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Парсинг логов на java по шаблону строки  [new]
Atum1
Member

Откуда: СПБ
Сообщений: 1854
Добрый день , есть файл логов с nginx в определенном формате :

'$remote_addr [$request_time] $ssl_client_s_dn_cn [$msec] "$request" '
'$status $body_bytes_sent "$http_referer" '
'[$ssl_protocol $ssl_cipher] '
'"$ssl_client_v_start" "$ssl_client_v_end" "$ssl_client_v_remain" '
'"$ssl_session_id $ssl_session_reused" '
'"$http_user_agent" "$http_x_forwarded_for" "$http_method_type"';

есть пробелы между элементами, есть ковычки " , квадратные скобки .

Как я понимаю = нужно по пробелам между частями шаблона смотреть , но в ковычках так же есть проблемы .

Есть пример такой вот строки из логов.

Как ее разложить по строкам?

как в шаблоне ? получить из строки - набор строк - каждая будет соответствовать своей части шаблоне.

Хочется применить к строке шаблон и чтобы она разложилась по нему :)

пример строки 1

31.13.144.10 [0.000] 2000113383 [1590050392.065] "POST /api/rpc/ HTTP/1.1" 200 233 "https://www.google.com/" [TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256] "Feb 27 08:23:59 2019 GMT" "Feb 26 08:23:59 2021 GMT" "280" "8045776e39ae7b844b37918060c3d7983cb692998ad45b2472351af88b5a8b8f r" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0" "-" "refreshToken"


пример строки 2

178.67.134.48 [0.600] 2000113832 [1590050392.365] "POST /api/rpc/ HTTP/1.1" 200 102 "https://www.google.com/" [TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256] "Jul 10 09:53:29 2019 GMT" "Jul  9 09:53:29 2021 GMT" "414" "- ." "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0" "-" "getCount"



конечный список должен содержать массив массивов ( 2 элемента в данном примере 2 строки)

каждый массив это массив строки по шаблону :


+

31.13.144.10
0.000
2000113383
1590050392.065
POST /api/rpc/ HTTP/1.1
200
233 
https://www.google.com/ 
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256
Feb 27 08:23:59 2019 GMT
Feb 26 08:23:59 2021 GMT 
280 
8045776e39ae7b844b37918060c3d7983cb692998ad45b2472351af88b5a8b8f
r
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0 
- 
refreshToken



Спасибо.
21 май 20, 18:13    [22137239]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
Atum1
Хочется применить к строке шаблон и чтобы она разложилась по нему :)

Шаблон вордовский или чей?
А где программирование?
))))
Читай файл логов и сразу при чтении до пробела получил удаленный адрес.
Его bilder добавил. Потом конец строки добавил.
Лень?
Стрим нужен? Или спринг?
21 май 20, 19:08    [22137277]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
Atum1
Member

Откуда: СПБ
Сообщений: 1854
PetroNotC Sharp
Atum1
Хочется применить к строке шаблон и чтобы она разложилась по нему :)

Шаблон вордовский или чей?
А где программирование?
))))
Читай файл логов и сразу при чтении до пробела получил удаленный адрес.
Его bilder добавил. Потом конец строки добавил.
Лень?
Стрим нужен? Или спринг?


 String[] str = log.split("\"(,\")*");


я могу ее поделить на 19 элементов , по ковычкам, потом каждый парсить отдельно по пробелам и квадратным скобкам ..

но это как то криво - должно быть готовое решение - на вход шаблон строки на выходе - массив элементов из строки.
21 май 20, 20:04    [22137305]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 46537
LogStash умеет парсить логи nginx. Можно посмотреть его профили.
21 май 20, 21:50    [22137354]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
Atum1,
Split это Г.. решение а ля вижуал бейсик.
Тебе нужно быстрое решение без переключения контекста.
Это то что я сказал выше.
Как головка HDD считывает файл.
Прочитал до разделителя, скинул. Дальше читаешь опять до разделителя.
Ты на этот вариант ноль комментов.
21 май 20, 22:55    [22137377]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
Atum1
Member

Откуда: СПБ
Сообщений: 1854
PetroNotC Sharp
Atum1,
Split это Г.. решение а ля вижуал бейсик.
Тебе нужно быстрое решение без переключения контекста.
Это то что я сказал выше.
Как головка HDD считывает файл.
Прочитал до разделителя, скинул. Дальше читаешь опять до разделителя.
Ты на этот вариант ноль комментов.


код ., мне нужен код .
21 май 20, 23:15    [22137381]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5289
Atum1

код ., мне нужен код .


Зачем?! Есть же ELK. :-)
22 май 20, 05:38    [22137433]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 46537
На стековере обсуждали
https://stackoverflow.com/questions/10647920/tool-for-parsing-nginx-log
https://stackoverflow.com/questions/1955505/parsing-json-with-unix-tools?rq=1
22 май 20, 10:24    [22137516]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
Atum1
PetroNotC Sharp
Atum1,
Split это Г.. решение а ля вижуал бейсик.
Тебе нужно быстрое решение без переключения контекста.
Это то что я сказал выше.
Как головка HDD считывает файл.
Прочитал до разделителя, скинул. Дальше читаешь опять до разделителя.
Ты на этот вариант ноль комментов.


код ., мне нужен код .

Не люблю ленивых.
Мой выше алгоритм требует 10 мин написания.
Главное ты его понял.
И ты как ТС должен его тут НАЧАТЬ писать.
Иначе лучше банить тут за такие топики.
. split ()
Это все что ты можешь?
22 май 20, 10:30    [22137525]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 1122
Atum1
Хочется применить к строке шаблон и чтобы она разложилась по нему :)

Регулярку можно сделать, везде, где у тебя $something заменить на (.*) и сделать ленивый matсh. Потом последовательно все результаты вытащить. Но я хз как отработает регулярка, может и правда проще посимвольно читать строку, да сбрасывать кусками
22 май 20, 11:39    [22137581]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 46537
Тут-больше подходит Comma-Separated-Values(CSV) parser. Только вместо splitter надо поставить пробел.
На выходе должна быть просто табличка полей. Заходно и quotas правильно обработаются.

А в регулярке - ехануться можно... С квотами.
22 май 20, 13:16    [22137656]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
mayton
Comma-Separated-Values(CSV) parser.

как страшно звучит
List<String> list;
		try (BufferedReader br = new BufferedReader(new FileReader(fileTrackFullName))) {
				String line;
				while ((line = br.readLine()) != null){
						System.out.println(line);
				}
		}
}
22 май 20, 13:43    [22137687]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 46537
PetroNotC Sharp,

Тыже только начал? Допиши до конца.
С корректной обработкой пробелов внутри квотированых полей.
22 май 20, 14:01    [22137702]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
mayton,
они не квотированные
StringBuffer buffOut;
while ((line = br.readLine()) != null)
       myParse(buffOut, "31.13.144.10 [0.000] 2000113383 [1590050392.065] "POST /" /*line*/);
22 май 20, 14:26    [22137725]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 46537
Видишь автор постит?

31.13.144.10 [0.000] 2000113383 [1590050392.065] "POST /api/rpc/ HTTP/1.1" 200 233 "https://www.google.com/" [TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256] "Feb 27 08:23:59 2019 GMT" "Feb 26 08:23:59 2021 GMT" "280" "8045776e39ae7b844b37918060c3d7983cb692998ad45b2472351af88b5a8b8f r" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0" "-" "refreshToken"


Есть и квоты и пробелы.
22 май 20, 14:35    [22137738]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
mayton,
говори по русски.
Пробел это разделитель.
Квота это что?
22 май 20, 14:38    [22137740]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
Atum1
31.13.144.10
0.000
2000113383
1590050392.065
POST /api/rpc/ HTTP/1.1
200
233 
https://www.google.com/ 
TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256
Feb 27 08:23:59 2019 GMT
Feb 26 08:23:59 2021 GMT 
280 
8045776e39ae7b844b37918060c3d7983cb692998ad45b2472351af88b5a8b8f
r
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0 
- 
refreshToken

тут он всё без разбора херачит на строки

Сообщение было отредактировано: 22 май 20, 14:39
22 май 20, 14:40    [22137743]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 46537
PetroNotC Sharp, символ такой.

quote == "\"" == &quot; 
22 май 20, 15:34    [22137773]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
mayton,
Ты видишь что он режет по пробелам а кавычки просто выкидывает?
Я твой пост не понял.
22 май 20, 15:37    [22137775]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 46537
А шаблон сообщения в самом верху топика - содержит переводы строк.
Еще вариант.
22 май 20, 16:06    [22137791]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
mayton
А шаблон сообщения в самом верху топика - содержит переводы строк.
Еще вариант.
пусть содержит. Главное чтобы он на выходе не вводил несколько строк))))))
Автор пример этого ещё не родил.
Он сбежал походу искать аннотацию спринга.
22 май 20, 16:29    [22137799]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4839
PetroNotC Sharp
mayton
А шаблон сообщения в самом верху топика - содержит переводы строк.
Еще вариант.
пусть содержит. Главное чтобы он на выходе не вЫводил несколько строк))))))
Автор пример этого ещё не родил.
Он сбежал походу искать аннотацию спринга.
22 май 20, 16:30    [22137800]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг логов на java по шаблону строки  [new]
mayton
Member

Откуда: loopback
Сообщений: 46537
Да он - бездельник. Всё сидит и выкуривает готовое решение.

Вот для стека ELK - коробочное https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-module-nginx.html

Пусть купит лицензии и не парится.
22 май 20, 16:47    [22137807]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить