Der nachfolgende Code ist frei verfügbar, solange er nicht kommerziell verwendet wird! Falls er so wie veröffentlicht, in Teilen oder abgewandelt zum Einsatz kommt, würde ich mich sehr über eine kurze E-Mail freuen.
Datenmodel:
Beschreibung:
Batches und Proceduren sollten ihren Ablauf möglichst umfassend protokollieren. In der Regel werden dazu die Outputs der Batches in Logfiles auf das Filesystem geschrieben. Häufig werden aber auch Proceduren über Client-Applications aufgerufen. Da auch in solchen Fällen die Log-Informationen zentral gespeichert werden sollen, bietet es sich an die Log-Informationen mit auf der Datenbank zu speichern. Dies ermöglicht auch ein komfortables analysieren und suchen in den Log-Informationen.
Beim Speichern von Log-Informationen ergibt sich aber die Schwierigkeit, daß diese Informationen bei einem Rollback mit zurückgerollt werden. Da die Log-Informationen gerade im Fehlerfall benötigt werden, ist dies nicht wirklich wünschenswert. Das Package logging übernimmt daher nicht nur das Speichern der Log-Informationen in der dafür vorgesehenen Tabellenstruktur, sondern speichert die Daten auch noch zusätzlich in einer Variablenstruktur (INDEX BY Tabelle). Nach einem Rollback können so mittels der im Package logging definierten Procedure commit_log die mit zurückgerollten Log-Informationen wiederhersgestellt werden.
Das Package ermöglicht es neben dem Speichern der Log-Informationen auf der Datenbank diese auch zusätzlich (wie gehabt) in Logfiles auf dem Filesystem zu speichern.
Tabellen:
tlog_log_entries
Enthält die Log-Einträge, gruppiert nach Processen und Art der Einträge. Die Reihenfolge der Einträäge für eine Session wird über die Zeilennummer log_row_id bestimmt.
Spalte
Datentyp
Comment
log_los_id
NUMBER(6)
Referenz-ID zu [tlos_log_session] (Session)
log_row_id
INTEGER
Zeilen-Nr. des Log-Eintrags für diesen Prozess
log_lmt_id
VARCHAR2(3)
Referenz-ID zu [tlmt_log_message_type] (Art der Einträge)
log_datetime
TIMESTAMP
Zeitpunkt des Eintrags
log_source
VARCHAR2(32)
Programmmodul, das diese Meldung erzeugt hat
log_message
VARCHAR2(255)
Log-Message
tlos_log_session
Damit die Log-Einträge dem ausführenden Batch, bzw. der ausführenden Procedure zugeordnet werden können, werden alle Einträge eines Batches/Procedure unter einer Session-ID abgespeichert. tlos_log_session enthält die Log-Sessions mit ihren Stammdaten, denen die Log-Einträge zugeordnet sind.
Spalte
Datentyp
Comment
los_id
NUMBER(6)
Identifier
los_label
VARCHAR2(64)
Label
los_user
VARCHAR2(32)
Label
los_datetime
TIMESTAMP
Zeitpunkt des Eintrags
tlmt_log_message_type
Beschreibt die Art der Log-Einträge. So können z.B. gezielt nur Fehlermeldungen herausgefiltert werden.
Spalte
Datentyp
Comment
lmt_id
VARCHAR2(3)
Identifier
lmt_description
VARCHAR2(32)
Beschreibung
Die folgenden Werte sind implementiert:
INF
:
Allgemeine Meldung
ERR
:
Fehler-Meldung
TRC
:
Trace-Meldung
STA
:
Start-Meldung
STP
:
Stop-Mmeldung
Proceduren/ Funktionen:
Die Proceduren / Funktionen befinden sich im Package logging:
create_log_session_id
PROCEDURE create_log_session_id
(
label IN tlos_log_session.los_label%TYPE DEFAULT'< unknown >',
print IN INTEGER DEFAULT1
);
Erzeugt eine neue Log-Session ID, die in der Package-Variablen logging.log_session_id abgelegt wird und hierüber auch ausgelesen und verändert werden kann. create_log_session_id wird zu Anfang eines Batchaes/Procedure aufgerufen. Als label kann z.B. der Batch-/Procedurename (nebst Aufrufparameter) übergeben werden. Mit dem Parameter print = 1 werden die Messages zusätzlich auf der Standardausgabe ausgegeben. print setzt die Package-Variable logging.print, über die die Standardausgabe jederzeit mit logging.print = 0 ausgeschaltet werden kann.
set_log_message
PROCEDURE set_log_message
(
source IN VARCHAR2 DEFAULT '< unknown >',
status IN tlmt_log_message_type.lmt_id%TYPE DEFAULT'INF',
message IN VARCHAR2
);
Fügt eine Log-Message unter der in der Package-Variablen logging.log_session_id definierten Log-Session ID ein. Ist keine Log-Session ID definiert, wird automatisch einen neue Session mit dem Label '< unknown >' erzeugt. Zusätzlich zur Message kann der Procedure noch die aufrufende Sub-Procedure source (Default: '< unknown >') und in status ein Message-Beschreibung (z.B. 'ERR' für Fehlermeldung, siehe Beschreibung Tabelle tlmt_log_message_type) übergeben werden.
commit_log
PROCEDURE commit_log;
Nach einem Rollback können mittels der Procedure commit_log die mit zurückgerollten Log-Informationen wiederhersgestellt werden.