Aktuell ist mein Zwischenstand, dass alle relevanten Einträge in die Tabelle eingetragen werden und leider bei jeder Ausführung erneut.
Das soll doch durch "try and except" und "isinstance()" verhindert werden, oder?
Komme aktuell durch suchen nicht weiter.
Von meinem denken her, würde ich mit einer Abfrage die Zeilen der Tabelle in Strings einlesen und sie dann mit den match lines vergleichen.
Da allerdings täglich ca. 5 bis 8 tausend Einträge in die Datenbank kommen werden, wird das auf dauer sicherlich sehr Hardware intensiv.
Welche Möglichkeiten gibt es noch?
Kann mir das bitte nochmal jemand genauer erläurtern?
Code: Alles auswählen
#!/usr/bin/env python3
#
import os
import sys
import re
from collections import namedtuple
from contextlib import closing
from datetime import datetime as DateTime
import pymssql
LOG_PATH = '/var/log/ESI/ESI2'
LOG_FILENAME_TEMPLATE = os.path.join(LOG_PATH, 'F1log_{}.txt')
COMMON_PATTERN = r'^(\d+) (?P<zeit>\d{2}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) '
MAIN_RE = re.compile(COMMON_PATTERN + r'(?P<prom>\d{8}) (?P<message>.{14}) .+ N00 (?P<did>\d{4}) (?P<rufnummer>\d{8,12})? .+ ?SITE=(?P<site>\d{8,10})')
ERROR_RE = re.compile(COMMON_PATTERN + r'ISDN Fehlanruf C.00 (?P<did>\d{4}) (?P<rufnummer>\d{8,12})? ?Diag:(?P<message>[A-Z ]{14,18})')
Main = namedtuple('Main', 'zeit prom message did rufnummer site')
Error = namedtuple('Error', 'zeit prom message did rufnummer site')
server = 'localhost'
user = 'sa'
password = 'xxx'
database = 'F1'
def create_tables(connection):
with closing(connection.cursor()) as cursor:
cursor.execute(
'CREATE TABLE main(zeit DATETIME, prom VARCHAR(8),'
'message VARCHAR(18), did INTEGER, rufnummer VARCHAR(12)'
'site VARCHAR(10))'
)
def get_common(match):
zeit = DateTime.strptime(match.group('zeit'), '%d/%m/%y %H:%M:%S')
did = int(match.group('did'))
rufnummer = match.group('rufnummer')
return (zeit, did, rufnummer)
def parse_log(lines):
for line in lines:
match = MAIN_RE.match(line)
if match:
zeit, did, rufnummer = get_common(match)
message = match.group('message')
prom = match.group('prom')
site = match.group('site')
yield Main(zeit, prom, message, did, rufnummer, site)
else:
match = ERROR_RE.match(line)
if match:
zeit, did, rufnummer = get_common(match)
prom = None
site = None
message = match.group('message')
yield Error(zeit, prom, message, did, rufnummer, site)
def insert_entries(connection, entries):
with closing(connection.cursor()) as cursor:
for entry in entries:
if isinstance(entry, Main):
cursor.execute(
'INSERT INTO main (zeit, prom, message, did, rufnummer, site)'
'VALUES (%s, %s, %s, %s, %s, %s)',
entry
)
elif isinstance(entry, Error):
cursor.execute(
'INSERT INTO main (zeit, prom, message, did, rufnummer, site)'
'VALUES (%s, %s, %s, %s, %s, %s)',
entry
)
def main():
log_filename = LOG_FILENAME_TEMPLATE.format(sys.argv[1])
with open (log_filename) as lines:
connection = pymssql.connect(
server, user, password, database
)
with closing(connection):
try:
insert_entries(connection, parse_log(lines))
except:
connection.rollback()
raise
else:
connection.commit()
main()