Hi, True I correct this small problem in next release.
Regards, Guillaume Moulard [EMAIL PROTECTED] Project : LOG4PLSQL : Oracle Database Loggin tools see : http://log4plsql.sourceforge.net/ and : http://sourceforge.net/mailarchive/forum.php?forum=log4plsql-all-info or http://www.mail-archive.com/[EMAIL PROTECTED] for [EMAIL PROTECTED] -----Message d'origine----- De : [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Envoy� : mercredi 18 f�vrier 2004 15:15 � : [EMAIL PROTECTED] Objet : [log4plsql] PLOG.ERROR of setLevel should be comment out? This is the procedure setLevel. When executed prints 3 error on the log table. This behaveour is correct? PROCEDURE setLevel -- il est possible de modifier avec setLevell dynamiquement le niveau de log -- l'appel de setLevel sans paramettre re-poossitionne le niveaux a celuis specifier -- dans le package. -- erreur possible : -20501, 'Set Level not in LOG predefine constantes' ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pLEVEL IN TLOG.LLEVEL%type default NOLEVEL -- Level sup�rieur attribuer dynamiquement ) IS nbrl number; BEGIN PLOG.ERROR('level:'||pLEVEL); checkAndInitCTX(pCTX); PLOG.ERROR('level:'||pLEVEL); IF pLEVEL = NOLEVEL then pCTX.LLEVEL := pCTX.INIT_LLEVEL; END IF; PLOG.ERROR('level:'||pLEVEL); select count(*) into nbrl FROM TLOGLEVEL where TLOGLEVEL.LLEVEL=pLEVEL; IF nbrl > 0 then pCTX.LLEVEL := pLEVEL; ELSE raise_application_error(-20501, 'SetLevel ('||pLEVEL||') not in TLOGLEVEL table'); END IF; EXCEPTION WHEN OTHERS THEN PLOG.ERROR; end setLevel; Regards, Francesco ------------------------------------------------------- SF.Net is sponsored by: Speed Start Your Linux Apps Now. Build and deploy apps & Web services for Linux with a free DVD software kit from IBM. Click Now! http://ads.osdn.com/?ad_id56&alloc_id438&op=ick _______________________________________________ Log4plsql-all-info mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/log4plsql-all-info log4plsq : http://log4plsql.sourceforge.net
CREATE OR REPLACE PACKAGE BODY PLOG IS ------------------------------------------------------------------- -- -- Nom package : PLOG -- -- Objectif : plog code -- -- Version : 3.0 ------------------------------------------------------------------- -- see package spec for history ------------------------------------------------------------------- ------------------------------------------------------------------- -- Variable global priv� au package ------------------------------------------------------------------- /* * Copyright (C) LOG4PLSQL project team. All rights reserved. * * This software is published under the terms of the The LOG4PLSQL * Software License, a copy of which has been included with this * distribution in the LICENSE.txt file. * see: <http://log4plsql.sourceforge.net> */ ------------------------------------------------------------------- LOG4PLSQL_VERSION VARCHAR2(200) := '3.1.2.1'; ------------------------------------------------------------------- -- Code priv� au package ------------------------------------------------------------------- ------------------------------------------------------------------- -------------------------------------------------------------------- FUNCTION getNextID ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN TLOG.ID%type IS temp number; BEGIN select SLOG.nextval into temp from dual; return temp; end getNextID; ---------------------------------------------------------------------- --function instrLast(ch1 varchar2, ch2 varchar2) return number --is --ret number := 0; --begin -- FOR i IN REVERSE 0..length(Ch1) LOOP -- if instr(substr(ch1,i),ch2) > 0 then -- return i; -- end if; -- end loop; -- return ret; --end; -------------------------------------------------------------------- FUNCTION calleurname return varchar2 IS endOfLine constant char(2) := chr(10); endOfField constant char(2) := ' '; nbrLine number; ptFinLigne number; ptDebLigne number; ptDebCode number; pt1 number; cpt number; allLines varchar2(4000); resultat varchar2(4000); Line varchar2(4000); UserCode varchar2(4000); myName varchar2(2000) := '.PLOG'; begin allLines := dbms_utility.format_call_stack; cpt := 2; ptFinLigne := length(allLines); ptDebLigne := ptFinLigne; While ptFinLigne > 0 and ptDebLigne > 83 loop ptDebLigne := INSTR (allLines, endOfLine, -1, cpt) + 1 ; cpt := cpt + 1; -- traite ligne Line := substr(allLines, ptDebLigne, ptFinLigne - ptDebLigne); ptDebCode := INSTR (Line, endOfField, -1, 1); UserCode := substr(Line, ptDebCode+1); IF instr(UserCode,myName) = 0 then IF cpt > 3 then resultat := resultat||'.'; end IF; resultat := resultat||UserCode; end if; ptFinLigne := ptDebLigne - 1; end loop; return resultat; end; -------------------------------------------------------------------- FUNCTION getDefaultContext -- Cette fonction est priv�, Elle retourne le contexte par default -- quand il n'est pas pr�ciss� RETURN LOG_CTX IS newCTX LOG_CTX; lSECTION TLOG.LSECTION%type; BEGIN lSECTION := calleurname; newCTX := init (pSECTION => lSECTION); RETURN newCTX; END getDefaultContext; -------------------------------------------------------------------- PROCEDURE checkAndInitCTX( pCTX IN OUT NOCOPY LOG_CTX -- Context ) IS lSECTION TLOG.LSECTION%type; BEGIN IF pCTX.isDefaultInit = FALSE THEN lSECTION := calleurname; pCTX := init (pSECTION => lSECTION); END IF; END; -------------------------------------------------------------------- procedure addRow ( pID in TLOG.id%type, pLDate in TLOG.ldate%type, pLHSECS in TLOG.lhsecs%type, pLLEVEL in TLOG.llevel%type, pLSECTION in TLOG.lsection%type, pLUSER in TLOG.luser%type, pLTEXTE in TLOG.ltexte%type ) is begin insert into TLOG ( ID , LDate , LHSECS , LLEVEL , LSECTION , LUSER , LTEXTE ) VALUES ( pID, pLDate, pLHSECS, pLLEVEL, pLSECTION, pLUSER, pLTEXTE ); end; -------------------------------------------------------------------- procedure addRowAutonomous ( pID in TLOG.id%type, pLDate in TLOG.ldate%type, pLHSECS in TLOG.lhsecs%type, pLLEVEL in TLOG.llevel%type, pLSECTION in TLOG.lsection%type, pLUSER in TLOG.luser%type, pLTEXTE in TLOG.ltexte%type ) is PRAGMA AUTONOMOUS_TRANSACTION; begin addRow ( pID => pID, pLDate => pLDate, pLHSECS => pLHSECS, pLLEVEL => pLLEVEL, pLSECTION => pLSECTION, pLUSER => pLUSER, pLTEXTE => pLTEXTE ); commit; exception when others then PLOG.ERROR; rollback; raise; end; -------------------------------------------------------------------- PROCEDURE log -- procedure priv� pour int�grer les donn�es dans la table -- RAISE : -20503 'error DBMS_PIPE.send_message. ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pID IN TLOG.ID%type , pLDate IN TLOG.LDATE%type , pLHSECS IN TLOG.LHSECS%type , pLLEVEL IN TLOG.LLEVEL%type , pLSECTION IN TLOG.LSECTION%type , pLUSER IN TLOG.LUSER%type , pLTEXTE IN TLOG.LTEXTE%type ) IS ret number; LLTEXTE TLOG.LTEXTE%type ; pt number; BEGIN IF pCTX.isDefaultInit = FALSE THEN plog.error('please is necessary to use plog.init for yours contexte.'); END IF; IF PLTEXTE is null then LLTEXTE := 'SQLCODE:'||SQLCODE ||' SQLERRM:'||SQLERRM; ELSE BEGIN LLTEXTE := pLTEXTE; EXCEPTION WHEN VALUE_ERROR THEN ASSERT (pCTX, length(pLTEXTE) <= 2000, 'Log Message id:'||pID||' too long. '); LLTEXTE := substr(pLTEXTE, 0, 2000); WHEN OTHERS THEN PLOG.FATAL; END; END IF; IF pCTX.USE_LOGTABLE = TRUE then IF pCTX.USE_OUT_TRANS = FALSE then addRow ( pID => pID, pLDate => pLDate, pLHSECS => pLHSECS, pLLEVEL => pLLEVEL, pLSECTION => pLSECTION, pLUSER => pLUSER, pLTEXTE => LLTEXTE ); ELSE addRowAutonomous ( pID => pID, pLDate => pLDate, pLHSECS => pLHSECS, pLLEVEL => pLLEVEL, pLSECTION => pLSECTION, pLUSER => pLUSER, pLTEXTE => LLTEXTE ); END IF; END IF; IF pCTX.USE_LOG4J = TRUE then DBMS_PIPE.pack_message(pID); DBMS_PIPE.pack_message(TO_CHAR(pLDATE, 'DD month YYYY HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09'))); DBMS_PIPE.pack_message(pLLEVEL); DBMS_PIPE.pack_message(pLSECTION); DBMS_PIPE.pack_message(LLTEXTE); DBMS_PIPE.pack_message(pLUSER); DBMS_PIPE.pack_message('SAVE_IN_LOG'); ret := DBMS_PIPE.send_message(pCTX.DBMS_PIPE_NAME); IF RET <> 0 then raise_application_error(ERR_CODE_DBMS_PIPE, MES_CODE_DBMS_PIPE || RET); END IF; END IF; IF pCTX.USE_ALERT = TRUE then sys.dbms_system.ksdwrt(2,'PLOG:'||TO_CHAR(pLDATE, 'YYYY-MM-DD HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09'))||' user: '||PLUSER||' level: '||getLevelInText(pLLEVEL)||' logid: '||pID ||' '||pLSECTION); sys.dbms_system.ksdwrt(2,substr(LLTEXTE,0,1000)); if (length(LLTEXTE) >= 1000) then sys.dbms_system.ksdwrt(2,substr(LLTEXTE,1000)); end if; END IF; IF pCTX.USE_TRACE = TRUE then sys.dbms_system.ksdwrt(1,'PLOG:'||TO_CHAR(pLDATE, 'YYYY-MM-DD HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09'))||' user: '||PLUSER||' level: '||getLevelInText(pLLEVEL)||' logid: '||pID ||' '||pLSECTION); sys.dbms_system.ksdwrt(1,substr(LLTEXTE,0,1000)); if (length(LLTEXTE) >= 1000) then sys.dbms_system.ksdwrt(1,substr(LLTEXTE,1000)); end if; END IF; IF pCTX.USE_DBMS_OUTPUT = TRUE then sys.DBMS_OUTPUT.PUT_LINE(TO_CHAR(pLDATE, 'HH24:MI:SS')||':'||LTRIM(TO_CHAR(MOD(pLHSECS,100),'09'))||'-'||getLevelInText||'-'||pLSECTION); pt := 0; while pt <= length(LLTEXTE) loop sys.DBMS_OUTPUT.PUT_LINE(substr(LLTEXTE,pt,255)); pt := pt + 255; end loop; END IF; end log; ------------------------------------------------------------------- ------------------------------------------------------------------- -- Code public du package ------------------------------------------------------------------- ------------------------------------------------------------------- -------------------------------------------------------------------- FUNCTION init -- initialisation du contexte ( pSECTION IN TLOG.LSECTION%type default NULL , -- log section pLEVEL IN TLOG.LLEVEL%type default PLOGPARAM.DEFAULT_LEVEL , -- log level (Use only for debug) pLOG4J IN BOOLEAN default PLOGPARAM.DEFAULT_USE_LOG4J, -- if true the log is send to log4j pLOGTABLE IN BOOLEAN default PLOGPARAM.DEFAULT_LOG_TABLE, -- if true the log is insert into tlog pOUT_TRANS IN BOOLEAN default PLOGPARAM.DEFAULT_LOG_OUT_TRANS, -- if true the log is in transactional log pALERT IN BOOLEAN default PLOGPARAM.DEFAULT_LOG_ALERT, -- if true the log is write in alert.log pTRACE IN BOOLEAN default PLOGPARAM.DEFAULT_LOG_TRACE, -- if true the log is write in trace file pDBMS_OUTPUT IN BOOLEAN default PLOGPARAM.DEFAULT_DBMS_OUTPUT, -- if true the log is send in standard output (DBMS_OUTPUT.PUT_LINE) pDBMS_PIPE_NAME IN VARCHAR2 default PLOGPARAM.DEFAULT_DBMS_PIPE_NAME -- ) RETURN LOG_CTX IS pCTX LOG_CTX; BEGIN pCTX.isDefaultInit := TRUE; pCTX.LSection := nvl(pSECTION, calleurname); pCTX.INIT_LSECTION := pSECTION; pCTX.LLEVEL := pLEVEL; pCTX.INIT_LLEVEL := pLEVEL; pCTX.USE_LOG4J := pLOG4J; pCTX.USE_OUT_TRANS := pOUT_TRANS; pCTX.USE_LOGTABLE := pLOGTABLE; pCTX.USE_ALERT := pALERT; pCTX.USE_TRACE := pTRACE; pCTX.USE_DBMS_OUTPUT := pDBMS_OUTPUT; pCTX.DBMS_PIPE_NAME := pDBMS_PIPE_NAME; return pCTX; end init; -------------------------------------------------------------------- PROCEDURE setBeginSection -- initialisation d'un debut de niveaux hierarchique de log ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pSECTION IN TLOG.LSECTION%type -- Texte du log ) IS BEGIN checkAndInitCTX(pCTX); pCTX.LSection := pCTX.LSection||PLOGPARAM.DEFAULT_Section_sep||pSECTION; end setBeginSection; -------------------------------------------------------------------- FUNCTION getSection -- renvoie la section en cours ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN TLOG.LSECTION%type IS BEGIN return pCTX.LSection; end getSection; -------------------------------------------------------------------- FUNCTION getSection -- renvoie la section en cours RETURN TLOG.LSECTION%type IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getSection(pCTX =>generiqueCTX) ; end getSection; -------------------------------------------------------------------- PROCEDURE setEndSection -- fin d'un niveau hierarchique de log et dee tout c'est sup�rieur -- par default [/] ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pSECTION IN TLOG.LSECTION%type default 'EndAllSection' -- Texte du log ) IS BEGIN checkAndInitCTX(pCTX); if pSECTION = 'EndAllSection' THEN pCTX.LSection := nvl(pCTX.INIT_LSECTION, calleurname); RETURN; END IF; pCTX.LSection := substr(pCTX.LSection,1,instr(UPPER(pCTX.LSection), UPPER(pSECTION), -1)-2); end setEndSection; ------------------------------------------------------------------- PROCEDURE setTransactionMode -- utlisation des log dans ou en dehors des transactions -- TRUE => Les log sont dans la transaction -- FALSE => les log sont en dehors de la transaction ( pCTX IN OUT NOCOPY LOG_CTX , -- Context inTransaction IN boolean default TRUE -- TRUE => Les log sont dans la transaction, -- FALSE => les log sont en dehors de la transaction ) IS BEGIN checkAndInitCTX(pCTX); pCTX.USE_OUT_TRANS := inTransaction; end setTransactionMode; ------------------------------------------------------------------- FUNCTION getTransactionMode -- TRUE => Les log sont dans la transaction -- FALSE => les log sont en dehors de la transaction ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN boolean IS BEGIN return pCTX.USE_OUT_TRANS; end getTransactionMode; ------------------------------------------------------------------- FUNCTION getTransactionMode RETURN boolean IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getTransactionMode(pCTX => generiqueCTX); end getTransactionMode; ------------------------------------------------------------------- PROCEDURE setUSE_LOG4JMode --TRUE => Log is send to USE_LOG4J --FALSE => Log is not send to USE_LOG4J ( pCTX IN OUT NOCOPY LOG_CTX , -- Context inUSE_LOG4J IN boolean default TRUE -- TRUE => Log is send to USE_LOG4J, -- FALSE => Log is not send to USE_LOG4J ) IS BEGIN checkAndInitCTX(pCTX); pCTX.USE_LOG4J := inUSE_LOG4J; end setUSE_LOG4JMode; ------------------------------------------------------------------- FUNCTION getUSE_LOG4JMode --TRUE => Log is send to USE_LOG4J --FALSE => Log is not send to USE_LOG4J ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN boolean IS BEGIN return pCTX.USE_LOG4J; end getUSE_LOG4JMode; ------------------------------------------------------------------- FUNCTION getUSE_LOG4JMode RETURN boolean IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getTransactionMode(pCTX => generiqueCTX); end getUSE_LOG4JMode; ------------------------------------------------------------------- PROCEDURE setLOG_TABLEMode --TRUE => Log is send to LOG_TABLEMODE --FALSE => Log is not send to LOG_TABLEMODE ( pCTX IN OUT NOCOPY LOG_CTX , -- Context inLOG_TABLE IN boolean default TRUE -- TRUE => Log is send to LOG_TABLEMODE, -- FALSE => Log is not send to LOG_TABLEMODE ) IS BEGIN checkAndInitCTX(pCTX); pCTX.USE_LOGTABLE := inLOG_TABLE; end setLOG_TABLEMode; ------------------------------------------------------------------- FUNCTION getLOG_TABLEMode --TRUE => Log is send to LOG_TABLEMODE --FALSE => Log is not send to LOG_TABLEMODE ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN boolean IS BEGIN return pCTX.USE_LOGTABLE; end getLOG_TABLEMode; ------------------------------------------------------------------- FUNCTION getLOG_TABLEMode RETURN boolean IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getTransactionMode(pCTX => generiqueCTX); end getLOG_TABLEMode; ------------------------------------------------------------------- PROCEDURE setLOG_ALERTMode --TRUE => Log is send to LOG_ALERT --FALSE => Log is not send to LOG_ALERT ( pCTX IN OUT NOCOPY LOG_CTX , -- Context inLOG_ALERT IN boolean default TRUE -- TRUE => Log is send to LOG_ALERT, -- FALSE => Log is not send to LOG_ALERT ) IS BEGIN checkAndInitCTX(pCTX); pCTX.USE_ALERT := inLOG_ALERT; end setLOG_ALERTMode; ------------------------------------------------------------------- FUNCTION getLOG_ALERTMode --TRUE => Log is send to LOG_ALERT --FALSE => Log is not send to LOG_ALERT ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN boolean IS BEGIN return pCTX.USE_ALERT; end getLOG_ALERTMode; ------------------------------------------------------------------- FUNCTION getLOG_ALERTMode RETURN boolean IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getTransactionMode(pCTX => generiqueCTX); end getLOG_ALERTMode; ------------------------------------------------------------------- PROCEDURE setLOG_TRACEMode --TRUE => Log is send to LOG_TRACE --FALSE => Log is not send to LOG_TRACE ( pCTX IN OUT NOCOPY LOG_CTX , -- Context inLOG_TRACE IN boolean default TRUE -- TRUE => Log is send to LOG_TRACE, -- FALSE => Log is not send to LOG_TRACE ) IS BEGIN checkAndInitCTX(pCTX); pCTX.USE_TRACE := inLOG_TRACE; end setLOG_TRACEMode; ------------------------------------------------------------------- FUNCTION getLOG_TRACEMode --TRUE => Log is send to LOG_TRACE --FALSE => Log is not send to LOG_TRACE ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN boolean IS BEGIN return pCTX.USE_TRACE; end getLOG_TRACEMode; ------------------------------------------------------------------- FUNCTION getLOG_TRACEMode RETURN boolean IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getTransactionMode(pCTX => generiqueCTX); end getLOG_TRACEMode; ------------------------------------------------------------------- PROCEDURE setDBMS_OUTPUTMode --TRUE => Log is send to DBMS_OUTPUT --FALSE => Log is not send to DBMS_OUTPUT ( pCTX IN OUT NOCOPY LOG_CTX , -- Context inDBMS_OUTPUT IN boolean default TRUE -- TRUE => Log is send to DBMS_OUTPUT, -- FALSE => Log is not send to DBMS_OUTPUT ) IS BEGIN checkAndInitCTX(pCTX); pCTX.USE_DBMS_OUTPUT := inDBMS_OUTPUT; end setDBMS_OUTPUTMode; ------------------------------------------------------------------- FUNCTION getDBMS_OUTPUTMode --TRUE => Log is send to DBMS_OUTPUT --FALSE => Log is not send to DBMS_OUTPUT ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN boolean IS BEGIN checkAndInitCTX(pCTX); return pCTX.USE_DBMS_OUTPUT; end getDBMS_OUTPUTMode; ------------------------------------------------------------------- FUNCTION getDBMS_OUTPUTMode RETURN boolean IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getTransactionMode(pCTX => generiqueCTX); end getDBMS_OUTPUTMode; ------------------------------------------------------------------- PROCEDURE setLevel -- il est possible de modifier avec setLevell dynamiquement le niveau de log -- l'appel de setLevel sans paramettre re-poossitionne le niveaux a celuis specifier -- dans le package. -- erreur possible : -20501, 'Set Level not in LOG predefine constantes' ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pLEVEL IN TLOG.LLEVEL%type default NOLEVEL -- Level sup�rieur attribuer dynamiquement ) IS nbrl number; BEGIN checkAndInitCTX(pCTX); IF pLEVEL = NOLEVEL then pCTX.LLEVEL := pCTX.INIT_LLEVEL; END IF; select count(*) into nbrl FROM TLOGLEVEL where TLOGLEVEL.LLEVEL=pLEVEL; IF nbrl > 0 then pCTX.LLEVEL := pLEVEL; ELSE raise_application_error(-20501, 'SetLevel ('||pLEVEL||') not in TLOGLEVEL table'); END IF; EXCEPTION WHEN OTHERS THEN PLOG.ERROR; end setLevel; PROCEDURE setLevel -- il est possible de modifier avec setLevell dynamiquement le niveau de log -- l'appel de setLevel sans paramettre re-poossitionne le niveaux a celuis specifier -- dans le package. -- erreur possible : -20501, 'Set Level not in LOG predefine constantes' ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pLEVEL IN TLOGLEVEL.LCODE%type -- Level sup�rieur attribuer dynamiquement ) IS nbrl number; BEGIN setLevel (pCTX, getTextInLevel(pLEVEL)); end setLevel; ------------------------------------------------------------------- FUNCTION getLevel -- Retourne le level courant ( pCTX IN LOG_CTX -- Context ) RETURN TLOG.LLEVEL%type IS BEGIN return pCTX.LLEVEL; end getLevel; FUNCTION getLevel RETURN TLOG.LLEVEL%type IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getLevel( pCTX => generiqueCTX); end getLevel; ------------------------------------------------------------------------- FUNCTION islevelEnabled -- fonction outil appeler par les is[Debug|Info|Warn|Error]Enabled ( pCTX IN LOG_CTX, -- Context pLEVEL IN TLOG.LLEVEL%type -- Level a tester ) RETURN boolean IS BEGIN if getLevel(pCTX) >= pLEVEL then return TRUE; else return FALSE; end if; end islevelEnabled; FUNCTION islevelEnabled ( pLEVEL IN TLOG.LLEVEL%type -- Level a tester ) RETURN boolean IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return islevelEnabled( pCTX => generiqueCTX, pLEVEL => pLEVEL); end islevelEnabled; ------------------------------------------------------------------- FUNCTION isFatalEnabled RETURN boolean is begin return islevelEnabled(getTextInLevel('FATAL')); end; FUNCTION isErrorEnabled RETURN boolean is begin return islevelEnabled(getTextInLevel('ERROR')); end; FUNCTION isWarnEnabled RETURN boolean is begin return islevelEnabled(getTextInLevel('WARN')) ; end; FUNCTION isInfoEnabled RETURN boolean is begin return islevelEnabled(getTextInLevel('INFO')) ; end; FUNCTION isDebugEnabled RETURN boolean is begin return islevelEnabled(getTextInLevel('DEBUG')); end; FUNCTION isFatalEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('FATAL')); end; FUNCTION isErrorEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('ERROR')); end; FUNCTION isWarnEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('WARN')) ; end; FUNCTION isInfoEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('INFO')) ; end; FUNCTION isDebugEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return islevelEnabled(pCTX, getTextInLevel('DEBUG')); end; -------------------------------------------------------------------- PROCEDURE purge -- Purge de la log IS tempLogCtx PLOG.LOG_CTX; BEGIN purge(tempLogCtx); end purge; -------------------------------------------------------------------- PROCEDURE purge -- Purge de la log ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) IS BEGIN checkAndInitCTX(pCTX); execute immediate ('truncate table tlog'); purge(pCTX, sysdate+1); end purge; -------------------------------------------------------------------- PROCEDURE purge -- Purge de la log avec date max ( pCTX IN OUT NOCOPY LOG_CTX , -- Context DateMax IN Date -- Tout les enregistrements supperieur a -- la date sont purg� ) IS tempLogCtx PLOG.LOG_CTX := PLOG.init(pSECTION => 'plog.purge', pLEVEL => PLOG.LINFO); BEGIN checkAndInitCTX(pCTX); delete from tlog where ldate < DateMax; INFO(tempLogCtx, 'Purge by user:'||USER); end purge; -------------------------------------------------------------------- PROCEDURE log ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pLEVEL IN TLOG.LLEVEL%type , -- log level pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text ) IS lId TLOG.ID%type ; lLSECTION TLOG.LSECTION%type := getSection(pCTX); lLHSECS TLOG.LHSECS%type ; m varchar2(100); BEGIN checkAndInitCTX(pCTX); IF pLEVEL > getLevel(pCTX) THEN RETURN; END IF; lId := getNextID(pCTX); select HSECS into lLHSECS from V$TIMER; log ( pCTX =>pCTX, pID =>lId, pLDate =>sysdate, pLHSECS =>lLHSECS, pLLEVEL =>pLEVEL, pLSECTION =>lLSECTION, pLUSER =>user, pLTEXTE =>pTEXTE ); end log; PROCEDURE log ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pLEVEL IN TLOGLEVEL.LCODE%type , -- log level pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel(pLEVEL), pCTX => pCTX, pTEXTE => pTEXTE); end log; PROCEDURE log ( pLEVEL IN TLOG.LLEVEL%type , -- log level pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text ) IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN LOG(pLEVEL => pLEVEL, pCTX => generiqueCTX, pTEXTE => pTEXTE); end log; PROCEDURE log ( pLEVEL IN TLOGLEVEL.LCODE%type , -- log level pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel(pLEVEL), pTEXTE => pTEXTE); end log; -------------------------------------------------------------------- PROCEDURE debug ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('DEBUG'), pCTX => pCTX, pTEXTE => pTEXTE); end debug; PROCEDURE debug ( pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('DEBUG'), pTEXTE => pTEXTE); end debug; -------------------------------------------------------------------- PROCEDURE info ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('INFO'), pCTX => pCTX, pTEXTE => pTEXTE); end info; PROCEDURE info ( pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('INFO'), pTEXTE => pTEXTE); end info; -------------------------------------------------------------------- PROCEDURE warn ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('WARN'), pCTX => pCTX, pTEXTE => pTEXTE); end warn; PROCEDURE warn ( pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('WARN'), pTEXTE => pTEXTE); end warn; -------------------------------------------------------------------- PROCEDURE error ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('ERROR'), pCTX => pCTX, pTEXTE => pTEXTE); end error; PROCEDURE error ( pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('ERROR'), pTEXTE => pTEXTE); end error; -------------------------------------------------------------------- PROCEDURE fatal ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('FATAL'), pCTX => pCTX, pTEXTE => pTEXTE); end fatal; PROCEDURE fatal ( pTEXTE IN TLOG.LTEXTE%type default null -- log text ) IS BEGIN LOG(pLEVEL => getTextInLevel('FATAL'), pTEXTE => pTEXTE); end fatal; -------------------------------------------------------------------- PROCEDURE assert ( pCTX IN OUT NOCOPY LOG_CTX , -- Context pCONDITION IN BOOLEAN , -- error condition pLogErrorMessageIfFALSE IN VARCHAR2 default 'assert condition error' , -- message if pCondition is true pLogErrorCodeIfFALSE IN NUMBER default -20000 , -- error code is pCondition is true range -20000 .. -20999 pRaiseExceptionIfFALSE IN BOOLEAN default FALSE , -- if true raise pException_in if pCondition is true pLogErrorReplaceError in BOOLEAN default FALSE -- TRUE, the error is placed on the stack of previous errors. -- If FALSE (the default), the error replaces all previous errors -- see Oracle Documentation RAISE_APPLICATION_ERROR ) IS BEGIN checkAndInitCTX(pCTX); IF not islevelEnabled(pCTX, PLOGPARAM.DEFAULT_ASSET_LEVEL) then RETURN; END IF; IF NOT pCONDITION THEN LOG (pLEVEL => PLOGPARAM.DEFAULT_ASSET_LEVEL, pCTX => pCTX, pTEXTE => 'AAS'||pLogErrorCodeIfFALSE||': '||pLogErrorMessageIfFALSE); IF pRaiseExceptionIfFALSE THEN raise_application_error(pLogErrorCodeIfFALSE, pLogErrorMessageIfFALSE, pLogErrorReplaceError); END IF; END IF; END assert; PROCEDURE assert ( pCONDITION IN BOOLEAN , -- error condition pLogErrorMessageIfFALSE IN VARCHAR2 default 'assert condition error' , -- message if pCondition is true pLogErrorCodeIfFALSE IN NUMBER default -20000 , -- error code is pCondition is true range -20000 .. -20999 pRaiseExceptionIfFALSE IN BOOLEAN default FALSE , -- if true raise pException_in if pCondition is true pLogErrorReplaceError in BOOLEAN default FALSE -- TRUE, the error is placed on the stack of previous errors. -- If FALSE (the default), the error replaces all previous errors -- see Oracle Documentation RAISE_APPLICATION_ERROR ) IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN assert ( pCTX => generiqueCTX, pCONDITION => pCONDITION, pLogErrorCodeIfFALSE => pLogErrorCodeIfFALSE, pLogErrorMessageIfFALSE => pLogErrorMessageIfFALSE, pRaiseExceptionIfFALSE => pRaiseExceptionIfFALSE, pLogErrorReplaceError => pLogErrorReplaceError ); END assert ; -------------------------------------------------------------------- PROCEDURE full_call_stack IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN full_call_stack (Pctx => generiqueCTX); END full_call_stack; PROCEDURE full_call_stack ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) IS BEGIN checkAndInitCTX(pCTX); LOG (pLEVEL => PLOGPARAM.DEFAULT_FULL_CALL_STACK_LEVEL, pCTX => pCTX, pTEXTE => dbms_utility.format_call_stack ); END full_call_stack; -------------------------------------------------------------------- FUNCTION getLOG4PLSQVersion return varchar2 IS begin return LOG4PLSQL_VERSION; end getLOG4PLSQVersion; -------------------------------------------------------------------- FUNCTION getLevelInText ( pLevel TLOG.LLEVEL%type default PLOGPARAM.DEFAULT_LEVEL ) return varchar2 IS ret varchar2(1000); BEGIN SELECT LCODE into ret FROM TLOGLEVEL WHERE LLEVEL = pLevel; RETURN ret; EXCEPTION WHEN OTHERS THEN return 'UNDEFINED'; END getLevelInText; -------------------------------------------------------------------- FUNCTION getTextInLevel ( pCode TLOGLEVEL.LCODE%type ) return TLOG.LLEVEL%type IS ret TLOG.LLEVEL%type ; BEGIN SELECT LLEVEL into ret FROM TLOGLEVEL WHERE LCODE = pCode; RETURN ret; EXCEPTION WHEN OTHERS THEN return PLOGPARAM.DEFAULT_LEVEL; END getTextInLevel; FUNCTION getDBMS_PIPE_NAME ( pCTX IN OUT NOCOPY LOG_CTX -- Context ) RETURN varchar2 IS BEGIN return pCTX.DBMS_PIPE_NAME; END getDBMS_PIPE_NAME; FUNCTION getDBMS_PIPE_NAME RETURN varchar2 IS generiqueCTX PLOG.LOG_CTX := PLOG.getDefaultContext; BEGIN return getDBMS_PIPE_NAME( pCTX => generiqueCTX); end getDBMS_PIPE_NAME; PROCEDURE setDBMS_PIPE_NAME ( pCTX IN OUT NOCOPY LOG_CTX , -- Context inDBMS_PIPE_NAME IN VARCHAR2 ) IS BEGIN pCTX.DBMS_PIPE_NAME := inDBMS_PIPE_NAME; END setDBMS_PIPE_NAME; -------------------------------------------------------------------- -------------------------------------------------------------------- END PLOG; / sho error ------------------------------------------------------------------- -- End of document -------------------------------------------------------------------
