Найти - Пользователи
Полная версия: Сконвертировать лог в CSV
Начало » Python для новичков » Сконвертировать лог в CSV
1
QuAzI
Доброго дня
Есть у меня один долготекущий проект, к которому надо распарсить логи во что-то человеческое. Наткнулся тут на 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) Последние строки лога - это многострочное сообщение - как корректно его взять регуляркой?

Или подскажите вменяемые уже существующие решения для разбора логов?
py.user.next
Сначала надо текст лога преобразовать в поток записей лога.
Потом поток записей лога преобразовать в поток записей, разделённых на поля.
Потом поток разделённых записей преобразовать в поток csv-записей.

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

QuAzI
Или подскажите вменяемые уже существующие решения для разбора логов?
Да есть, скорее всего, но в них тоже надо будет разбираться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB