www.Gerhard-Raabe.de
  Oracle
 
 
Back   Logging
 
Copyright: 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: Logging
 
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 DEFAULT 1
);

 

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.
 
Beispiel:
 
BEGIN

  logging.create_log_session_id('Batch 1', 1);
  logging.set_log_message('Batch 1', 'STA', 'Batch 1 started!');
    .
    .
    .
  logging.set_log_message('Batch 1', 'INF', 'Batch 1 has something done!');
    .
    .
    .
  logging.set_log_message('Batch 1', 'INF', 'Batch 1 has something done again!');
    .
    .
    .
  logging.set_log_message('Batch 1', 'STP', 'Batch 1 stopped!');

EXCEPTION

  WHEN OTHERS THEN
    logging.set_log_message('Batch 1', 'ERR', 'Error [OTHER] in Batch 1!');
    rollback;
    logging.commit_log;
END;

 

Mit logging.print = 1 wird folgender Output auf der Standardausgabe ausgegeben:

 
----------------------------------------------------------------------------------------------------------------------------------------------------------------
       2005-12-13 15:28:03                                        : Status-Process ID for [test]: 1
----------------------------------------------------------------------------------------------------------------------------------------------------------------
    1 2005-12-13 15:28:03 Batch 1                         INF: Batch 1 started!
    2 2005-12-13 15:28:03 Batch 1                         INF: Batch 1 has something done!
    3 2005-12-13 15:28:03 Batch 1                         INF: Batch 1 has something done again!
    4 2005-12-13 15:28:03 Batch 1                         INF: Batch 1 stopped!

 
 
Download:
Next   Logging.sql   (Vollständiges SQL-Script zur Erzeugung des Packages)
Next   Logging.pdm   (Physikalisches Datenmodel für PowerDesigner 9.0)
389071 Besucher - seit dem 01.02.2005 - 1 Besucher online © 2004-2015 by Gerhard Raabe ##, ## ### #### - ##:##:##