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

Ian*_*ter 20 oracle instrumentation plsql oracle10g

我希望在我们现有的Oracle应用程序中引入一个日志框架来替换DBMS_OUTPUT的使用.

该框架将主要用于帮助调试,并将详细说明诸如启动x过程,参数细节,结束过程x等等.它还应具有为所有或仅一个程序单元,各种级别的跟踪打开的功能实际上什么是标准的日志记录功能.

实现这些要求应该相对简单,但是我希望您的帮助是如何最好地关闭此功能.我想要实现的是在关闭跟踪时可能遇到的最小性能.希望大多数时候都应该这样!

由于应用程序使用10g版本2,我最初喜欢在条件编译中包装日志记录机制的外观,以便在正常操作期间甚至看不到日志记录框架.不幸的是,我不得不勉强放弃这个想法,因为大多数应用程序是使用独立的程序和函数构建的,因此启用日志记录功能可能会使大量代码无效.

我已经看了几个现有的opensource和其他框架\功能的灵感:

log4plsql(http://log4plsql.sourceforge.net/)

APC 在这里的审查 特别是在可接受的影响下让我关注.

OraLog项目(http://oralog.sourceforge.net)

自2007年以来没有更新

PL/VISION(这里)

看起来很旧,自Oracle 8i以来没有变化?

问汤姆仪器(这里)

更新01/04/2014 Tom Kyte现在推荐Tyler Muth的Logger

如果您已经在Oracle应用程序中引入了某种形式的日志记录,如何实现它,特别是如何控制它,我真的很想听听您的经验.

dpb*_*ley 7

你提到丢弃,因为潜在的级联废票的条件编译的想法 - 有一个方法,如果你愿意碰在需要日志记录/跟踪的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;
/
Run Code Online (Sandbox Code Playgroud)

现在,作为特权发出ALTER SYSTEM的用户:

ALTER SYSTEM设置PLSQL_CCFLAGS ='custom_logging:true';

并切换回:

ALTER SYSTEM设置PLSQL_CCFLAGS ='';


Pat*_*ick 5

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