ich möchte ein Skript schreiben, welche in der Endausbaustufe alle 5 Minuten ein Logfile ausliest und die Werte in eine Datenbank schreibt. Dabei sind doppelte Einträge zu vermeiden.
Die Datenbank soll für spätere Auswertungszwecke eine MSSQL-Datenbank sein.
Aktuell läuft das ganze auf einem Debian Stretch mit FreeTDS. Die Datenbank läuft ebenfalls auf dem Debian.
Die Datenbank besitzt bislang 3 Tabellen
1. "main" --> Sammlung der Daten der erfolgreichen Kommunikationen.
2. "error" --> Sammlung der Daten der fehlerbehafteten Kommunikation.
3. "transmitter" --> Zusammenstellung der Gerätespezifischen Daten.
Bislang habe ich es geschafft, die relevanten Daten, aus dem Logfile zu extrahieren und in die DB zu schreiben.
Nun tue ich mich gerade schwer die DB, vor dem Schreibvorgang abzufragen, um doppelte Einträge zu vermeiden.
Leider habe ich zu meiner Konstellation nicht allzu viel Dokumentationen gefunden und wäre deshalb für Hilfe jeglicher Art dankbar.
Code: Alles auswählen
#!/usr/bin/python
#
#
# Logfile in eine SQL Datenbank schreiben
#
# Usage: ./filename YYYY-MM-DD
#
# Laden der Module
#
import os
import sys
import re
import _mssql
#
# Definition der globalen Variablen
#
TEXT = 'N00'
ETEXT= 'C:00'
XOIP = '87878788'
ACK = 'ACQUITTEMENT'
CAR = 'CARTERNIS'
LOG_PATH = '/var/log/ESI/ESI2'
LOG_FILENAME_TEMPLATE = os.path.join(LOG_PATH, 'F1log_{}.txt')
WRITE_PATH = '/home/marc/python'
datum = sys.argv[1]
log_filename = LOG_FILENAME_TEMPLATE.format(datum)
#
# Verbindung mit dem MSSQL-Server herstellen
#
conn = _mssql.connect (server = "localhost", user = "sa", password = "xxx", database = "F1")
#
# Anlegen der einzelnen Tabellen
#
#conn.execute_non_query('CREATE TABLE main(zeit datetime, prom VARCHAR(10), message VARCHAR(15), did VARCHAR(6), rufnummer VARCHAR(12))')
#conn.execute_non_query('CREATE TABLE transmitter(prom VARCHAR(10), rufnummer VARCHAR(12))')
#conn.execute_non_query('CREATE TABLE error(zeit datetime, did VARCHAR(6), rufnummer VARCHAR(12), diag text)')
#
# öfnen des Logfiles, auslesen, der relevanten Daten und erzeugen der einzelnen Variablen.
#
with open(log_filename) as log_file:
for line in log_file:
if re.search(TEXT,line) and not re.search(XOIP,line):
zeit = '20{y}-{m}-{d} {time}'.format(y=line[11:13], m=line[8:10], d=line[5:7], time=line[14:22])
prom = line[23:31]
message = line[32:45]
did = re.search(r" [0-9]{4} ",line)
if re.search(r"[0-9]{10,12}",line):
rufnummer = re.search(r"[0-9]{10,12}",line)
# print zeit, prom, message, did.group(), rufnummer.group()
#
# Füllen der Tabellen, "main" und "transmitter" mit den Daten aus dem Logfile
#
conn.execute_non_query("""INSERT INTO main (zeit, prom, message, did, rufnummer) VALUES (%s, %s, %s, %s, %s )""",(zeit, prom, message, did.group(), rufnummer.group()))
conn.execute_non_query("""INSERT INTO transmitter(prom, rufnummer) VALUES (%s, %s )""",(prom, rufnummer.group()))
else:
#
# Füllen der spalte, "Rufnummer" falls keine im Logfile angegeben ist.
#
rufnummer = '0000000000'
#print zeit, prom, message, did.group(), rufnummer
conn.execute_non_query("""INSERT INTO main (zeit, prom, message, did, rufnummer) VALUES (%s, %s, %s, %s, %s )""",(zeit, prom, message, did.group(), rufnummer))
conn.execute_non_query("""INSERT INTO transmitter(prom, rufnummer) VALUES (%s, %s )""",(prom, rufnummer))
#
# Füllen der Tabelle, "error" mit den Daten aus dem Logfile
#
elif re.search(ETEXT,line) and not re.search(CAR,line) :
zeit = '20{y}-{m}-{d} {time}'.format(y=line[11:13], m=line[8:10], d=line[5:7], time=line[14:22])
did = re.search(r" [0-9]{4} ",line)
diag = re.search(r"Diag:.{20}",line)
if re.search(r"[0-9]{10,12}",line):
rufnummer = re.search(r"[0-9]{10,12}",line)
#print zeit, did.group(), rufnummer.group(), diag.group()[5:25]
conn.execute_non_query("""INSERT INTO error (zeit, did, rufnummer, diag) VALUES (%s, %s, %s, %s )""",(zeit, did.group(), rufnummer.group(), diag.group()[5:22]))
#
# Füllen der spalte, "Rufnummer" falls keine im Logfile angegeben ist.
#
else:
rufnummer = '0000000000'
#print zeit, did, rufnummer, diag.group()[5:25]
conn.execute_non_query("""INSERT INTO error (zeit, did, rufnummer, diag) VALUES (%s, %s, %s, %s )""",(zeit, did.group(), rufnummer, diag.group()[5:22]))