代码之家  ›  专栏  ›  技术社区  ›  Ian Carpenter

pl/sql日志记录-如何控制?

  •  19
  • Ian Carpenter  · 技术社区  · 16 年前

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

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

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

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

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

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

    APC的回顾 here 尤其是在可接受的影响下,我感到担忧。

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

    自2007年以来没有更新

    PL/视觉 ( here )

    看起来很老,Oracle8i之后没有变化?

    询问Tom Instrumentation ( here )

    更新日期:2014年4月1日 Tom Kyte 现在推荐泰勒·穆思的 Logger

    如果您引入了某种形式的登录到您的Oracle应用程序、如何实现它,特别是如何控制它,我将非常感兴趣地听取您的经验。

    4 回复  |  直到 16 年前
        1
  •  6
  •   dpbradley    16 年前

    您提到了由于潜在的级联无效而放弃条件编译的想法-如果您愿意接触需要日志记录/跟踪而不需要重新编译来启用的pl/sql源,则有一种类似的方法。

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

    [编辑] 下面是一个非常简单的示例,用于响应您的评论/请求-您显然希望在分析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 set plsql_ccflags='custom_logging:true';

    并切换回:

    alter system set plsql_ccflags='';

        2
  •  5
  •   Patrick    12 年前

    回顾同一个问题,发现以下项目似乎仍在进行中, https://github.com/tmuth/Logger---A-PL-SQL-Logging-Utility

        3
  •  3
  •   Stephen ODonnell    16 年前

    在我们的应用程序中,我们大量使用了ask-tom的debug.f工具。我很快注意到的一件事是,对“debugtab”的查询太多,以至于无法查看每条日志消息是否都有日志记录。我对它进行了修改,每100条日志消息只检查一次表,现在它工作得很好。

    我的观点是尽量避免检查每个日志消息的表,看看是否应该输出它。通常,您希望在长时间运行的过程中打开日志记录,因此您可以这样做很重要。在我的例子中,我决定等上几秒钟,直到100个日志记录调用在它真正注意到日志记录打开之前就结束了。

        4
  •  1
  •   Rigved    15 年前

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

    推荐文章