Log - Package Body
E Möglichkeit es eigenigs Logging z'mache
create or replace package body k.RBSC$LOG# is
subtype t_logger is rbsc$log_config.logger%type;
type t_log_config_tab is
table of pls_integer
index by t_logger;
b_log_config_tab t_log_config_tab;
b_log_config_tag number(20) := nvl(sys_context('RBSC$LOG_CFG', 'LAST_UPD'), 0);
---------------------------------------------------------------------------
-- Loads configuration for this session only
procedure log_config#reload
is
begin
b_log_config_tab.delete;
b_log_config_tag := nvl(sys_context('RBSC$LOG_CFG', 'LAST_UPD'), 0);
for c in (select * from rbsc$log_config) loop
b_log_config_tab(c.logger) := log_level#by_name(c.log_level);
end loop;
end log_config#reload;
---------------------------------------------------------------------------
function logger#log_level(
i_logger varchar2
)
return number
is
l_logger t_logger := lower(i_logger);
l_log_level number;
--
function logger#parent
return varchar2
is
l_pos number := instr(l_logger, '.', -1);
begin
if l_pos < 1 then
return null;
else
return substr(l_logger, 1, l_pos - 1);
end if;
end logger#parent;
begin
if l_logger is null then
return c_default_level;
else
if b_log_config_tab.count = 0 or
b_log_config_tag <> nvl(sys_context('RBSC$LOG_CFG', 'LAST_UPD'), 0) then
log_config#reload;
end if;
if b_log_config_tab.exists(l_logger) then
return b_log_config_tab(l_logger);
else
return logger#log_level(logger#parent);
end if;
end if;
end logger#log_level;
---------------------------------------------------------------------------
function logger#is_enbl(
i_logger varchar2
,i_log_level number
) return boolean
is
begin
return nvl(logger#log_level(i_logger), c_default_level) >= i_log_level;
end logger#is_enbl;
---------------------------------------------------------------------------
function log_level#by_name(
i_log_level varchar2
) return number
is
begin
case lower(i_log_level)
when 'error' then
return c_log_level_error;
when 'warn' then
return c_log_level_warn;
when 'info' then
return c_log_level_info;
when 'debug' then
return c_log_level_debug;
else
return null;
end case;
end log_level#by_name;
---------------------------------------------------------------------------
-- Notifies all sessions that config has changed
procedure log_config#notify_all
is
begin
dbms_session.set_context('RBSC$LOG_CFG', 'LAST_UPD', to_number(to_char(current_timestamp, 'MMDDSSSSSFF')));
end log_config#notify_all;
---------------------------------------------------------------------------
procedure upsert_logger(
i_logger varchar2
,i_log_level varchar2
)
is
l_logger varchar2(100) := lower(trim(i_logger));
l_log_level varchar2(100) := lower(trim(i_log_level));
begin
begin
insert into RBSC$LOG_CONFIG (logger, log_level)
values (l_logger, l_log_level);
exception
when dup_val_on_index then
update RBSC$LOG_CONFIG
set log_level = l_log_level
where logger = l_logger;
end;
commit;
log_config#notify_all;
exception
when others then
log#.alert(
'Error during upsert into RBSC$LOG_CONFIG'
,'Error during upsert into RBSC$LOG_CONFIG -> upsert_logger(' || l_logger || ', ' || l_log_level || ') ' || SQLERRM
);
end upsert_logger;
end RBSC$LOG#;
/