21

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

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

实现这些要求应该相对简单,但是我希望您的帮助是如何最好地关闭和打开此功能。我想要实现的是关闭跟踪时可能的最小性能损失。希望大部分时间都应该这样!

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

我已经查看了几个现有的开源和其他框架\功能以获得灵感:

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

APC在这里的审查, 尤其是在可接受的影响下,让我感到担忧。

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

自 2007 年以来没有更新

PL/VISION这里

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

问汤姆仪器这里

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

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

4

4 回答 4

8

您提到由于潜在的级联失效而放弃条件编译的想法 - 如果您愿意接触不需要重新编译启用的需要记录/跟踪的 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='';

于 2009-08-05T13:07:44.713 回答
5

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

于 2013-07-19T07:46:54.197 回答
3

在我们的应用程序中,我们大量使用了 Ask Tom 的 debug.f 工具。我很快注意到的一件事是,“调试选项卡”的查询次数过多,无法查看每条日志消息是否已启用日志记录。我对它进行了修改,每 100 条日志消息只检查一次表,现在它工作得很好。

我的观点是尽量避免检查每条日志消息的表以查看是否应该输出。通常你想在一个长时间运行的进程中打开登录,所以你能做到这一点很重要。就我而言,我决定我可以忍受等待几秒钟,直到 100 个日志记录调用过去,然后它才真正注意到日志记录已打开。

于 2009-08-05T12:24:22.983 回答
1

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

于 2010-01-14T23:48:33.737 回答