Logging Beispiel fuer PL/SQL

PL/SQL Beispiel

Ob eine Meldung geschrieben wird, sollte nicht in der Logging Funktion selbst entschieden werden. Weniger Overhead wird erzeugt, wenn einmalig der Loglevel geprueft wird und dann in der Anwendung selbst entschieden wird.

--
-- File: logpck.pls
--
set serveroutput on
--
drop table ctl_trace ;
create table ctl_trace (id1 number(1) default 0 );
insert into ctl_trace values (0);
--
drop sequence logid_seq;
create  sequence logid_seq;

create or replace package glog as
  procedure log (p in varchar2);
  function chk_trace return boolean;
end;
/
show errors
create or replace package body glog as
  v_appinfo_mod varchar2(48);
  v_appinfo_act varchar2(32);
  procedure log (p in varchar2) is
   v_prefix varchar2(5) := chr(9) ;
   v_timestamp timestamp := systimestamp;
  begin
    dbms_application_info.read_module(v_appinfo_mod,v_appinfo_act);
    dbms_output.put_line(v_prefix || '..');
    dbms_output.put_line (v_prefix || '-----------------------');
    dbms_output.put_line (v_prefix || v_timestamp || ': Log Info => ' || p);
    dbms_output.put_line (v_prefix || v_appinfo_mod || ': ' || v_appinfo_act);
    dbms_output.put_line (v_prefix || '-----------------------');
  end log ;
  
  function chk_trace return boolean is
   v_retval number := 0 ;
   trace_on boolean := FALSE;
  begin
    select sign(id1)
    into v_retval
    from ctl_trace where rownum < 2;
    if v_retval = 0 then
      trace_on :=  false;
    else
      trace_on := true;
    end if;   
    return trace_on;
  end chk_trace ;
end;
/
show errors
--
create or replace package anwendung as
  procedure wichtig;
  procedure wichtig2;
end;
/
show errors
create or replace package body anwendung as
  trace_on boolean := FALSE;
  v_appinfo_mod varchar2(48);
  v_appinfo_act varchar2(32);
  procedure wichtig is
  begin
   trace_on := glog.chk_trace;
   v_appinfo_mod := 'wichtig';
   v_appinfo_act := 'erste Aktion';
   dbms_application_info.set_module(v_appinfo_mod,v_appinfo_act);
   dbms_output.put_line('Erste wichtige Aktion ...');
   if trace_on then
     glog.log('Loginfo ...');
   end if;
   v_appinfo_act := 'zweite Aktion';
   dbms_application_info.set_module(v_appinfo_mod,v_appinfo_act);
   dbms_output.put_line('Zweite  wichtige Aktion ...');
   if trace_on then
     glog.log('jetzt sind wir bei ZWEI');
   end if;
  end wichtig ;
  procedure wichtig2 is
  begin
   trace_on := glog.chk_trace;
   v_appinfo_mod := 'wichtig2';
   v_appinfo_act := 'erste Aktion';
   dbms_application_info.set_module(v_appinfo_mod,v_appinfo_act);
   dbms_output.put_line('wichtig2: Erste wichtige Aktion ...');
   if trace_on then
     glog.log('Loginfo ...');
   end if;
   v_appinfo_act := 'zweite Aktion';
   dbms_application_info.set_module(v_appinfo_mod,v_appinfo_act);
   dbms_output.put_line('wichtig2 Zweite  wichtige Aktion ...');
   if trace_on then
     glog.log('jetzt sind wir bei ZWEI');
   end if;
  end wichtig2 ;

end;
/
show errors

Traceing kann von aussen enabled bzw disabled werden.

SQL> update ctl_trace set id1=1;

1 row updated.

SQL> exec anwendung.wichtig;
Erste wichtige Aktion ...
        ..
        -----------------------
        09-JUN-16 05.02.04.938796 AM: Log Info => Loginfo ...
        wichtig: erste Aktion
        -----------------------
Zweite  wichtige Aktion ...
        ..
        -----------------------
        09-JUN-16 05.02.04.938863 AM: Log Info => jetzt sind wir bei ZWEI
        wichtig: zweite Aktion
        -----------------------

PL/SQL procedure successfully completed.

SQL> exec anwendung.wichtig2;
wichtig2: Erste wichtige Aktion ...
        ..
        -----------------------
        09-JUN-16 05.02.04.941332 AM: Log Info => Loginfo ...
        wichtig2: erste Aktion
        -----------------------
wichtig2 Zweite  wichtige Aktion ...
        ..
        -----------------------
        09-JUN-16 05.02.04.941357 AM: Log Info => jetzt sind wir bei ZWEI
        wichtig2: zweite Aktion
        -----------------------

PL/SQL procedure successfully completed.

SQL> update ctl_trace set id1=0;

1 row updated.

SQL> exec anwendung.wichtig2;
wichtig2: Erste wichtige Aktion ...
wichtig2 Zweite  wichtige Aktion ...

PL/SQL procedure successfully completed.

SQL>