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
-------------------------------------------------------------------

Reply via email to