PL / SQL日志记录 - 如何控制?

时间:2009-08-05 09:55:40

标签: oracle plsql oracle10g instrumentation

我希望在我们现有的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

2014年4月1日更新 Tom Kyte现在推荐Tyler Muth的Logger

如果您已经将某种形式的日志记录引入Oracle应用程序,如何实现它,尤其是如何控制它,我真的很有兴趣听听您的体验。

4 个答案:

答案 0 :(得分:6)

你提到由于潜在的级联失效而放弃了条件编译的想法 - 如果你愿意触及需要不重新编译的日志/跟踪的PL / SQL源,有一种方法有点相似启用。

您仍然可以将自己选择的名称/值对添加到PLSQL_CCFLAGS,并让您的应用程序代码执行相对轻量级的v $参数查询,以确定日志记录是否已“打开”。最粗略的实现将是一个名称/值对,但您可以将其扩展为具有特定于模块的不同对,因此可以以更精细的粒度打开日志记录。

[编辑] 这是一个非常简单的示例,用于响应您的注释/请求 - 您显然希望在解析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 ='';

答案 1 :(得分:5)

回顾同样的问题,发现以下似乎仍处于活动状态的项目https://github.com/tmuth/Logger---A-PL-SQL-Logging-Utility

答案 2 :(得分:3)

在我们的应用程序中,我们大量使用Ask Tom的debug.f工具。我很快注意到的一件事是,'debugtab'被过多地查询,无法查看是否每个日志消息都有日志记录。我修改了它只是每100条日志消息检查一次表,现在效果很好。

我的观点是尽量避免检查每个日志消息的表以查看是否应该输出。通常,您希望在长时间运行的过程中打开登录,因此您可以这样做很重要。在我的情况下,我决定等待几秒钟,直到100个日志记录呼叫已经过去,才真正注意到日志已经开启。

答案 3 :(得分:1)

设置上下文并为其添加名称值对不是更容易吗?您可以使用debugtab表上的触发器更改上下文中的值。