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

标签 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 )

更新 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 的用户:

更改系统设置 PLSQL_CCFLAGS='custom_logging:true';

并通过以下方式切换回来:

更改系统设置 PLSQL_CCFLAGS='';

关于oracle - PL/SQL 日志记录 - 如何控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1232246/

相关文章:

Oracle PL/SQL : Forwarding whole row to procedure from a trigger

oracle - ORA-00922 : missing or invalid option while creating PL/SQL procedure

sql - 我写了一个触发器,但不起作用。我错过了什么吗?

database - DBMS Oracle 中的约束

oracle - 复杂的 SQL 查询

java - JPA 序列生成器不工作

oracle - 动态旋转表 Oracle

mysql - 从 Hibernate 3.6 迁移到 5.1 时 GenerationType.AUTO + @SequenceGenerator 的不同行为

oracle - 如何将日期值传递给 plsql 中的游标?

oracle - 将 WMSYS.WM_CONCAT 与 Oracle XE 10g 结合使用