Уведомления

Группа в Telegram: @pythonsu

#1 Июль 19, 2016 18:15:55

QuAzI
Зарегистрирован: 2016-07-19
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Сконвертировать лог в CSV

Доброго дня
Есть у меня один долготекущий проект, к которому надо распарсить логи во что-то человеческое. Наткнулся тут на LogParser который вроде как умеет из CSV логи брать. Решил сконвертировать оные убогие логи в CSV быстренько скриптом и… не тут то было

Логи писались через NLog со следующей маской

${longdate} [${level:uppercase=true}] ${threadname}: ${message} ${exception}

Пример лога
2016-07-19 13:20:21.8463 [DEBUG] : Application runned at CL_YAR\yar; Version 0.12.0.0; OS Microsoft Windows NT 6.1.7601 Service Pack 1 
2016-07-19 13:20:28.1836 [TRACE] :
2016-07-19 13:20:29.7387 [TRACE] : VDV Server started
2016-07-19 13:20:29.7597 [TRACE] TinyWebServer.HTTP.HTTPServer: Web service started
2016-07-19 13:20:30.6458 [TRACE] : System monitor Alarmgrenze status. Sensor Hdd Speicher at device U4SR_SIDIS_SVR1 has value: 100%
2016-07-19 13:20:30.6498 [TRACE] : System monitor Alarmgrenze status. Sensor Ram Nutzung at device U4SR_SIDIS_SVR1 has value: 89%
2016-07-19 13:20:31.2708 [TRACE] : Loaded new filled timetable window (from: 19.07.2016 13:20:31, to: 19.07.2016 19:20:31)
2016-07-19 13:20:32.8189 [TRACE] TCPDriverClient 127.0.0.1:5978 Rx: 127.0.0.1:5978: No connection could be made because the target machine actively refused it 192.168.102.92:5978
2016-07-19 13:20:32.8679 [TRACE] TCPDriverClient 127.0.0.1:5979 Rx: 127.0.0.1:5979: No connection could be made because the target machine actively refused it 192.168.102.92:5979
2016-07-19 13:20:32.9609 [TRACE] TCPDriverClient 127.0.0.1:42000 Rx: 127.0.0.1:42000: No connection could be made because the target machine actively refused it 192.168.102.92:42000
2016-07-19 14:30:05.5796 [WARN] SystemCore: 14:30:04,826 - Profiler: [26] SystemCore ProcessLogic: >> Started
14:30:04,826 - Profiler: [26] SystemCore ProcessLogic: CheckActiveModeRelevance
14:30:04,826 - Profiler: [26] SystemCore ProcessLogic: ProcessFinished 413*SBHS 34U040000000000000000000000000000œ– –11RL1xx
14:30:04,917 - Profiler: [26] SystemCore ProcessLogic: ProcessFinished 409*SBHS 00U040300000000000000000000000000œ–Í•11HSxxx - iteration took 91 ms;

Нужный формат
Time;Level;Thread;Message
2016-07-19 13:20:29.7387;TRACE;;VDV Server started
2016-07-19 13:20:32.8679;TRACE;TCPDriverClient 127.0.0.1:5979 Rx;127.0.0.1:5979: No connection could be made because the target machine actively refused it 192.168.102.92:5979
2016-07-19 14:30:05.5796;WARN;SystemCore;14:30:04,826 - Profiler: [26] SystemCore ProcessLogic: >> Started ... and other lines here

Пока имею такой черновик
 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import sys
'''
Prepare logs for open in LogParser
'''
source = open(sys.argv[1], encoding="utf-8")
destination = open(sys.argv[1] + '.csv', 'w', encoding="utf-8")
regex = '([\d-]+\s+[\d:.]+)\s+(\[\w+\])\s+((?!\:\s).)+\:\s+(.+)'
for line in source:
    matched = re.match(regex, line)
    if matched:
        destination.write(';'.join(matched.groups()) + '\n')
    else:
        destination.write(line.strip() + '\n')
destination.close()
source.close()
У этого кода как минимум две проблемы
1) Он бьёт третье поле там, где оно вообще заполнено, до одного последнего символа - как это обойти?
2) Последние строки лога - это многострочное сообщение - как корректно его взять регуляркой?

Или подскажите вменяемые уже существующие решения для разбора логов?

Отредактировано QuAzI (Июль 19, 2016 18:24:51)

Офлайн

#2 Июль 20, 2016 15:28:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Сконвертировать лог в CSV

Сначала надо текст лога преобразовать в поток записей лога.
Потом поток записей лога преобразовать в поток записей, разделённых на поля.
Потом поток разделённых записей преобразовать в поток csv-записей.

То есть нужно сделать несколько функций, где каждая отвечает за свой этап преобразований. Потом построить цепочку вызовов функций. В первую функцию подаётся ввод из файла лога, а последняя функция выводит csv-записи в файл.

QuAzI
Или подскажите вменяемые уже существующие решения для разбора логов?
Да есть, скорее всего, но в них тоже надо будет разбираться.



Отредактировано py.user.next (Июль 20, 2016 15:30:00)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version