Я хотел бы запросить помощь со скриптом 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])
Ожидаемый результат выглядит следующим образом:
Я бы разделил оригинал по регулярному выражению метки времени, а затем работал оттуда:
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