我希望将日志记录框架引入我们现有的Oracle应用程序中,以代替使用DBMS_OUTPUT。
该框架将主要用于辅助调试,并将详细说明诸如开始x过程,参数详细信息,结束过程x等之类的内容。它还应具有为全部或仅一个程序单元,各种跟踪级别打开的功能。实际上,什么是标准的日志记录功能。
实现这些要求应该是相对简单的,但是我希望您的帮助是如何最好地打开和关闭此功能。我试图实现的是关闭跟踪时可能的最小性能影响。希望大部分时间都在哪!
当应用程序使用10g第2版时,我最初很喜欢将日志记录机制包装在条件编译中的外观,以便在正常操作期间甚至看不见日志记录框架。不幸的是,我不得不勉强放弃这个想法,因为大多数应用程序是使用独立的过程和功能构建的,因此打开日志记录功能可能会使许多代码无效。
我已经从一些现有的开源和其他框架\功能中获取灵感:
log4plsql(http://log4plsql.sourceforge.net/)
APC的审查here特别是在可接受的影响下,给我带来了担忧。
OraLog项目(http://oralog.sourceforge.net)
自2007年以来没有更新
PL / VISION (here)
看起来很旧,自Oracle 8i以来没有任何变化?
询问Tom Instrumentation (here)
更新01/04/2014
Tom Kyte现在推荐泰勒·穆特(Tyler Muth)的Logger
如果您已经引入了某种形式的登录Oracle应用程序,如何实现它,尤其是如何控制它,我将非常想听听您的经验。
最佳答案
您提到了由于潜在的级联失效而放弃条件编译的想法-如果您愿意接触不需要日志记录/跟踪的PL / SQL源,则有一种方法有些相似,而无需启用重新编译。
您仍然可以将自己选择的名称/值对添加到PLSQL_CCFLAGS,并让您的应用程序代码对v $ parameter进行相对轻量级的查询,以确定是否已“打开”日志记录。最粗略的实现是一个名称/值对,但是您可以扩展它以具有不同的对,这对特定于模块,因此可以以更精细的粒度打开日志记录。
[编辑]
这是一个响应您的注释/请求的非常简单的示例-很显然,如果它具有其他现有信息(可能包装到函数中,等等),您显然希望在解析PLSQL_CCFLAGS字符串时更加复杂。
create or replace procedure ianc_cc
is
cc_flag_val varchar2(4000);
begin
-- need direct select grant on v_$parameter for this...
select value into cc_flag_val
from v$parameter where name = 'plsql_ccflags';
if (cc_flag_val = 'custom_logging:true') then
dbms_output.put_line('custom logging is on');
else
dbms_output.put_line('custom logging is off');
end if;
end;
/
现在,作为有权发布ALTER SYSTEM的用户:
ALTER SYSTEM设置PLSQL_CCFLAGS ='custom_logging:true';
并按以下方式切换回去:
ALTER SYSTEM设置PLSQL_CCFLAGS ='';
关于oracle - PL/SQL日志记录-如何控制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1232246/