Herman,
Line 327 in pblog, if you change by this line :
pCTX.LSection := substr(pCTX.LSection,1,instr(UPPER(pCTX.LSection),
UPPER(pSECTION), -1)-2);
You don't have a same problem ?
Regards,
Guillaume Moulard
[EMAIL PROTECTED]
Project : LOG4PLSQL : Oracle Database Loggin tools
see : http://log4plsql.sourceforge.net/
-----Message d'origine-----
De : [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED]
Envoy� : lundi 10 novembre 2003 15:07
� : [EMAIL PROTECTED]
Objet : [log4plsql] Problem with SetEndSection
I have a package called test_controller. It has a procedure 'controller'.
When I call
PLOG.SetBeginSection(pCTX, 'controller');
PLOG.debug(pCTX, 'test');
PLOG.SetEndSection(pCTX, 'controller');
The name in this section is: test_controller.controller.
After SetEndSection, the name of the pCTX is 'test' instead of
'test_controller'.
The EndSection routine looks for the first occurrence of 'controller' and
then takes the substring from the begin to one character before controller:
test_controller.controller
controller
test
One way to do this is to search also for the dot:
'.controller' instead of 'controller'.
test_controller.controller
.controller
test_controller
But this will stay a problem when two times the same sectionname is used,
'controller':
test_controller.controller.controller
.controller
Better would be to search for the last occurrence or a regexp like:
\.controller$
I'm looking forward to a new release, allthough this is the only problem
noticed so far.
Herman Suijs
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Whitehorses B.V. Phone +31 26 3226900
Herman Suijs Mobile: +31 6 52002531
Postbus 4064 Fax: +31 26 3226909
6803 EB Arnhem Email [EMAIL PROTECTED]
-------------------------------------------------------
This SF.Net email sponsored by: ApacheCon 2003,
16-19 November in Las Vegas. Learn firsthand the latest
developments in Apache, PHP, Perl, XML, Java, MySQL,
WebDAV, and more! http://www.apachecon.com/
_______________________________________________
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 : 2.1.1
-------------------------------------------------------------------
-- 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> */
-------------------------------------------------------------------
-------------------------------------------------------------------
-- 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
-- Cette fonction est recursive, elle doit tjs �tre appeler sans parametres !!!
(
retentionNbrCall number,
allLines varchar2 default dbms_utility.format_call_stack,
nbrCall number default 0
)
return varchar2 is
endOfLine constant char(1) := chr(10);
endOfField constant char(1) := ' ';
reste varchar2(4000);
resultat varchar2(4000);
tmpResultat varchar2(4000);
resultatSuivant varchar2(4000);
begin
if nbrCall >= retentionNbrCall then
tmpResultat := substr(allLines,1,instr(allLines,endOfLine)-1);
resultat := '.'||substr(tmpResultat, instrLast(tmpResultat, endOfField)+1);
else
resultat := '';
end if;
reste := substr(allLines,instr(allLines,endOfLine)+1);
if instr(reste,endOfLine) > 0 and nbrCall < 10 then
resultatSuivant := calleurname(retentionNbrCall, reste, nbrCall+1);
else
resultat := substr(resultat,2);
end if;
resultat:= resultatSuivant||resultat;
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(6);
newCTX := init (pSECTION => lSECTION);
RETURN newCTX;
END getDefaultContext;
--------------------------------------------------------------------
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
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;
BEGIN
IF pCTX.USE_LOG4J = FALSE then
IF pCTX.USE_OUT_TRANS = FALSE then
addRow
(
pID => pID,
pLDate => pLDate,
pLHSECS => pLHSECS,
pLLEVEL => pLLEVEL,
pLSECTION => pLSECTION,
pLUSER => pLUSER,
pLTEXTE => pLTEXTE
);
ELSE
addRowAutonomous
(
pID => pID,
pLDate => pLDate,
pLHSECS => pLHSECS,
pLLEVEL => pLLEVEL,
pLSECTION => pLSECTION,
pLUSER => pLUSER,
pLTEXTE => pLTEXTE
);
END IF;
ELSE
DBMS_PIPE.pack_message(pID);
DBMS_PIPE.pack_message(to_char(to_char(pLDATE, 'DD month YYYY
HH24:MI:SS')||':'||to_char(mod(pLHSECS,100),'09')));
DBMS_PIPE.pack_message(pLLEVEL);
DBMS_PIPE.pack_message(pLSECTION);
DBMS_PIPE.pack_message(pLTEXTE);
DBMS_PIPE.pack_message(pLUSER);
DBMS_PIPE.pack_message('SAVE_IN_LOG');
ret := DBMS_PIPE.send_message('LOG_PIPE');
IF RET <> 0 then
raise_application_error(-20503, 'error DBMS_PIPE.send_message. return
code :' || RET);
END IF;
END IF;
end log;
-------------------------------------------------------------------
-------------------------------------------------------------------
-- Code public du package
-------------------------------------------------------------------
-------------------------------------------------------------------
--------------------------------------------------------------------
FUNCTION init
-- initialisation du contexte
(
pSECTION IN TLOG.LSECTION%type default NULL , -- log text
pLEVEL IN TLOG.LLEVEL%type default DEFAULT_LEVEL , -- log level
(Use only for debug)
pLOG4J IN BOOLEAN default DEFAULT_USE_LOG4J, -- is in
transactional log
pOUT_TRANS IN BOOLEAN default DEFAULT_LOG_OUT_TRANS -- is in
transactional log
)
RETURN LOG_CTX
IS
pCTX LOG_CTX;
BEGIN
pCTX.LSection := nvl(pSECTION, calleurname(4));
pCTX.INIT_LSECTION := pSECTION;
pCTX.LLEVEL := pLEVEL;
pCTX.INIT_LLEVEL := pLEVEL;
pCTX.USE_LOG4J := pLOG4J;
pCTX.USE_OUT_TRANS := pOUT_TRANS;
return pCTX;
end init;
--------------------------------------------------------------------
PROCEDURE setBeginSection
-- initialisation d'un debut de niveaux hierraarchique de log
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pSECTION IN TLOG.LSECTION%type -- Texte du log
) IS
BEGIN
pCTX.LSection := pCTX.LSection||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
if pSECTION = 'EndAllSection' THEN
pCTX.LSection := nvl(pCTX.INIT_LSECTION, calleurname(4));
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 DEFAULT_LOG_OUT_TRANS -- TRUE => Les log
sont dans la transaction,
-- FALSE => les log
sont en dehors de la transaction
)
IS
BEGIN
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 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
BEGIN
IF pLEVEL <> LOFF AND
pLEVEL <> LFATAL AND
pLEVEL <> LERROR AND
pLEVEL <> LWARN AND
pLEVEL <> LINFO AND
pLEVEL <> LDEBUG AND
pLEVEL <> LALL
THEN
raise_application_error(-20501, 'Set Level not in LOG predefine constantes');
END IF;
IF pLEVEL = NOLEVEL then
pCTX.LLEVEL := pCTX.INIT_LLEVEL;
ELSE
pCTX.LLEVEL := pLEVEL;
END IF;
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(LFATAL); end;
FUNCTION isErrorEnabled RETURN boolean is begin return islevelEnabled(LERROR); end;
FUNCTION isWarnEnabled RETURN boolean is begin return islevelEnabled(LWARN) ; end;
FUNCTION isInfoEnabled RETURN boolean is begin return islevelEnabled(LINFO) ; end;
FUNCTION isDebugEnabled RETURN boolean is begin return islevelEnabled(LDEBUG); end;
FUNCTION isFatalEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, LFATAL); end;
FUNCTION isErrorEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, LERROR); end;
FUNCTION isWarnEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, LWARN) ; end;
FUNCTION isInfoEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, LINFO) ; end;
FUNCTION isDebugEnabled ( pCTX IN LOG_CTX ) RETURN boolean is begin return
islevelEnabled(pCTX, LDEBUG); end;
--------------------------------------------------------------------
PROCEDURE purge
-- Purge de la log
IS
tempLogCtx PLOG.LOG_CTX := PLOG.init;
BEGIN
purge(tempLogCtx);
end purge;
--------------------------------------------------------------------
PROCEDURE purge
-- Purge de la log
(
pCTX IN OUT NOCOPY LOG_CTX -- Context
) IS
BEGIN
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('plog');
BEGIN
delete from tlog where ldate < DateMax;
PLOG.SetBeginSEction (tempLogCtx, 'purge');
LOG(tempLogCtx, 1, 'Purge By '||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 := getNextID(pCTX);
lLSECTION TLOG.LSECTION%type := getSection(pCTX);
lLHSECS TLOG.LHSECS%type ;
m varchar2(100);
BEGIN
IF pLEVEL > getLevel(pCTX) THEN
RETURN;
END IF;
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
(
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 debug
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
BEGIN
LOG(pLEVEL => LDEBUG, pCTX => pCTX, pTEXTE => pTEXTE);
end debug;
PROCEDURE debug
(
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
BEGIN
LOG(pLEVEL => LDEBUG, pTEXTE => pTEXTE);
end debug;
--------------------------------------------------------------------
PROCEDURE info
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
BEGIN
LOG(pLEVEL => LINFO, pCTX => pCTX, pTEXTE => pTEXTE);
end info;
PROCEDURE info
(
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
BEGIN
LOG(pLEVEL => LINFO, pTEXTE => pTEXTE);
end info;
--------------------------------------------------------------------
PROCEDURE warn
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
BEGIN
LOG(pLEVEL => LWARN, pCTX => pCTX, pTEXTE => pTEXTE);
end warn;
PROCEDURE warn
(
pTEXTE IN TLOG.LTEXTE%type default DEFAULTEXTMESS -- log text
) IS
BEGIN
LOG(pLEVEL => LWARN, pTEXTE => pTEXTE);
end warn;
--------------------------------------------------------------------
PROCEDURE error
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type -- log text
) IS
BEGIN
LOG(pLEVEL => LERROR, pCTX => pCTX, pTEXTE => pTEXTE);
end error;
PROCEDURE error
(
pTEXTE IN TLOG.LTEXTE%type -- log text
) IS
BEGIN
LOG(pLEVEL => LERROR, pTEXTE => pTEXTE);
end error;
--------------------------------------------------------------------
PROCEDURE fatal
(
pCTX IN OUT NOCOPY LOG_CTX , -- Context
pTEXTE IN TLOG.LTEXTE%type -- log text
) IS
BEGIN
LOG(pLEVEL => LFATAL, pCTX => pCTX, pTEXTE => pTEXTE);
end fatal;
PROCEDURE fatal
(
pTEXTE IN TLOG.LTEXTE%type -- log text
) IS
BEGIN
LOG(pLEVEL => LFATAL, pTEXTE => pTEXTE);
end fatal;
END PLOG;
/
sho error
-------------------------------------------------------------------
-- End of document
-------------------------------------------------------------------