Конвертировать файл журнала в CSV

Я хотел бы запросить помощь со скриптом Python для преобразования файла журнала в файл csv. Я ищу код Python для этого. Моя входная информация выглядит следующим образом:

Exception: Cannot open file "C:\ProgramData\Presence\Log\pco_nhp01_CT_1800.log". Access is denied
Original message: [27/01/2023 12:37:44:675] TID:[14588]
ENTER FUNCTION
SetActive :: =
{
    Value: True,
}

[27/01/2023 12:37:44:675] TID:[14588]
VERBOSE
GetServerIP : 10.10.10.155

[27/01/2023 12:37:44:691] TID:[14588]
LEAVE FUNCTION
SetActive :: =
{
    Active: True,
}

[27/01/2023 12:37:44:694] TID:[14588]
ENTER FUNCTION
SetActive :: =
{
    Value: True,
}

[27/01/2023 12:37:44:694] TID:[14588]
VERBOSE
GetServerIP : 10.10.10.155

[27/01/2023 12:37:44:703] TID:[14588]
LEAVE FUNCTION
SetActive :: =
{
    Active: True,
}

[27/01/2023 12:37:44:703] TID:[14588]
ENTER FUNCTION
MonitorDevice :: =
{
    Device: 201122,
}

[27/01/2023 12:37:44:707] TID:[7060]
ENTER FUNCTION
TEventsManager.AddEvent :: =
{
    ACSTAEvent: CSTACONFIRMATION CSTAR_MONITORS_CON,
    CTIRequestID: 2,
}

[27/01/2023 12:37:53:711] TID:[7060]
LEAVE FUNCTION
TEventsManager.AddEvent

Вот мой код, который я пытался создать, чтобы решить эту проблему; однако я что-то упускаю, так как сообщения не возвращают информацию правильно и действия, которые я не могу решить. Вот моя попытка решить эту проблему:

import csv

with open('pco_nhp01_CT_1800.log', 'r') as log_file:
    log_data = log_file.readlines()

with open('logfile.csv', 'w', newline='') as csv_file:
    writer = csv.writer(csv_file)
    
    writer.writerow(['Datetime', 'TID', 'Message'])
    
    for line in log_data:
        if line.startswith('['):
            parts = line.split(']')
            
            datetime = parts[0][1:]
            tid = parts[1][6:]
            message = parts[2][1:]
            
            writer.writerow([datetime, tid, message])

Ожидаемый результат выглядит следующим образом:

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы разделил оригинал по регулярному выражению метки времени, а затем работал оттуда:

data = r"""
[27/01/2023 12:37:44:675] TID:[14588]
ENTER FUNCTION
SetActive :: =
{
    Value: True,
}

[27/01/2023 12:37:44:675] TID:[14588]
... etc... cut for brevity
"""

import re

timestamp_re = re.compile(r"(^\[\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}:\d{3}\])", re.MULTILINE)
split = timestamp_re.split(data.strip())
timestamps, data = split[1::2], split[2::2]
for timestamp, datum in zip(timestamps, data):
    timestamp = timestamp.strip("[]")
    datum_lines = datum.strip().splitlines()
    tid_line = datum_lines.pop(0)
    tid = tid_line[5:-1]
    func = datum_lines.pop(0)
    rest = " ".join(datum_lines)
    print([timestamp, tid, func, rest])

Это выводит

['27/01/2023 12:37:44:675', '14588', 'ENTER FUNCTION', 'SetActive :: = {     Value: True, }']
['27/01/2023 12:37:44:675', '14588', 'VERBOSE', 'GetServerIP : 10.10.10.155']
['27/01/2023 12:37:44:691', '14588', 'LEAVE FUNCTION', 'SetActive :: = {     Active: True, }']
['27/01/2023 12:37:44:694', '14588', 'ENTER FUNCTION', 'SetActive :: = {     Value: True, }']
['27/01/2023 12:37:44:694', '14588', 'VERBOSE', 'GetServerIP : 10.10.10.155']
['27/01/2023 12:37:44:703', '14588', 'LEAVE FUNCTION', 'SetActive :: = {     Active: True, }']
['27/01/2023 12:37:44:703', '14588', 'ENTER FUNCTION', 'MonitorDevice :: = {     Device: 201122, }']
['27/01/2023 12:37:44:707', '7060', 'ENTER FUNCTION', 'TEventsManager.AddEvent :: = {     ACSTAEvent: CSTACONFIRMATION CSTAR_MONITORS_CON,     CTIRequestID: 2, }']
['27/01/2023 12:37:53:711', '7060', 'LEAVE FUNCTION', 'TEventsManager.AddEvent']

это то, что вы можете легко csv.writerow.

Ответ принят как подходящий

Ниже выполняются построчные процессы на случай, если журналы огромны:

import re
import csv

with open('input.log') as fin, open('output.csv', 'w', newline='') as fout:
    writer = csv.writer(fout)
    writer.writerow('Datetime TID Action Message'.split())
    for line in fin:
        # read until a timestamp/TID line is found
        m = re.search(r'\[(.*?)\] TID:\[(\d+)\]', line)
        if m:
            dt, tid = m.groups()
            action = next(fin).strip()  # next line is action
            message = []  # collect message lines, stop on blank line or end-of-file
            while line := next(fin, '').strip():
                message.append(line)
            writer.writerow([dt, tid, action, ''.join(message)])

вывод.csv

Datetime,TID,Action,Message
27/01/2023 12:37:44:675,14588,ENTER FUNCTION,"SetActive ::  = {Value: True,}"
27/01/2023 12:37:44:675,14588,VERBOSE,GetServerIP : 10.10.10.155
27/01/2023 12:37:44:691,14588,LEAVE FUNCTION,"SetActive ::  = {Active: True,}"
27/01/2023 12:37:44:694,14588,ENTER FUNCTION,"SetActive ::  = {Value: True,}"
27/01/2023 12:37:44:694,14588,VERBOSE,GetServerIP : 10.10.10.155
27/01/2023 12:37:44:703,14588,LEAVE FUNCTION,"SetActive ::  = {Active: True,}"
27/01/2023 12:37:44:703,14588,ENTER FUNCTION,"MonitorDevice ::  = {Device: 201122,}"
27/01/2023 12:37:44:707,7060,ENTER FUNCTION,"TEventsManager.AddEvent ::  = {ACSTAEvent: CSTACONFIRMATION CSTAR_MONITORS_CON,CTIRequestID: 2,}"
27/01/2023 12:37:53:711,7060,LEAVE FUNCTION,TEventsManager.AddEvent

Другие вопросы по теме