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

Oracle PL/SQL日志记录-如何控制?,oracle,plsql,oracle10g,instrumentation,Oracle,Plsql,Oracle10g,Instrumentation,我希望在现有的Oracle应用程序中引入一个日志框架,以取代DBMS_输出的使用 该框架将主要用于帮助调试,并将详细说明诸如启动x过程、参数细节、结束x过程等内容。它还应具有为所有或仅一个程序单元打开的功能,以及各种级别的跟踪,事实上,这几乎是标准的日志记录功能 实现这些需求应该相对简单,但是我希望您的帮助是如何最好地关闭和打开此功能。我试图实现的是,当跟踪关闭时,性能受到的影响最小。希望大部分时间都是这样 由于应用程序使用的是10g release 2,我最初喜欢将日志机制包装在条件编译中的外

我希望在现有的Oracle应用程序中引入一个日志框架,以取代DBMS_输出的使用

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

实现这些需求应该相对简单,但是我希望您的帮助是如何最好地关闭和打开此功能。我试图实现的是,当跟踪关闭时,性能受到的影响最小。希望大部分时间都是这样

由于应用程序使用的是10g release 2,我最初喜欢将日志机制包装在条件编译中的外观,这样日志框架在正常操作期间甚至不可见。不幸的是,我不得不勉强放弃这个想法,因为大多数应用程序都是使用独立的过程和函数构建的,因此打开日志功能可能会使许多代码失效

我查看了一些现有的开源软件和其他软件的框架\功能以获得灵感:

log4plsql()

APC的审查,特别是在可接受的影响下,让我感到担忧

OraLog项目()

自2007年以来没有更新

PL/VISION()

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

询问Tom Instrumentation()

更新日期2014年4月1日 现在推荐Tyler Muth的


如果您在Oracle应用程序中引入了某种形式的登录,我非常想听听您的经验,您是如何实现它的,尤其是如何控制它的。

在我们的应用程序中,我们大量使用Ask Tom的debug.f工具。我很快注意到的一件事是,“debugtab”被查询得太多了,无法查看每个日志消息的日志是否都已打开。我对它做了一个改动,每100条日志消息只检查一次表,现在它运行得很好


我的观点是尽量避免检查每个日志消息的表,以确定是否应该输出它。通常你想在长时间运行的过程中启动日志记录,所以你可以这么做。就我而言,我决定我可以等几秒钟,直到100个日志调用过去,它才真正注意到日志记录已打开。

您提到放弃条件编译的想法,因为可能会出现级联失效-如果您愿意接触PL/SQL源代码,有一种方法有点类似需要不涉及重新编译的日志记录/跟踪来启用

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

[编辑] 下面是一个响应您的评论/请求的非常简单的示例-您显然希望在解析PLSQLCCFlags字符串时更加复杂,以防它包含其他现有信息,或者封装到函数中,等等:

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 set PLSQL_CCFLAGS='custom_logging:true'

并通过以下方式切换回:


更改系统设置PLSQLCCFlags=''

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

查看相同的问题,发现以下项目似乎仍处于活动状态,

+1感谢Stephen,特别是关于TK插装的一些实际使用的反馈以及定制它的技巧。嘿@StephenODonnell你可以提示数据库进行函数缓存,这可以缓存结果,直到debugtab表使缓存无效为止。@AndrewRussell-这可能是一个很好的主意,我在使用这个工具时没有尝试过(这是很久以前的事了),但我下次会尝试一下。+1谢谢你的回复-有没有可能通过一个小演示来证明你的想法?我正在努力想办法避免重新编译的问题。这是我一直在使用的过程(由于空间原因,我不得不“展平”它:创建或替换过程IANC\u CC是BEGIN$如果$$debug$,那么DBMS\u OUTPUT.PUT\u LINE('CC代码已就位');$END DBMS\u OUTPUT.PUT\u LINE('normal execution'));END;--在alter-procedure ianc_cc compile plsql_ccflags='debug:true'重用设置上打开plsql标志;感谢IanThanks花时间提供一个示例,如果可以的话,我会对响应进行更高的投票!再次感谢Tom Instrumentation链接断开,您能修复它吗?嗨,Sathya,感谢您指出这一点-现在应该可以了。谢谢,那个演示很有趣。Tom现在不推荐他的旧仪器,所以他推荐@iancarcenter Tyler Muth的记录器再次转向感谢我一直在等待Tyler把这个放到github上。