【问题标题】:Level based Logging in OracleOracle 中基于级别的日志记录
【发布时间】:2011-04-15 15:40:24
【问题描述】:

我是卡纳加拉杰。在我们的存储过程中,我们在 500 个位置记录消息,并且日志存储在我们遇到一些性能问题的表中。我们需要将这些消息拆分为 Debug、Info 和 Error 消息。根据级别,只应记录有限的消息。如有必要,我们将启用下一个级别并查看更多日志。在我们的程序中引入这种基于级别的日志记录的有效方法是什么?

提前致谢。

卡纳加拉杰。

【问题讨论】:

  • “我是 Kanagaraj”:您应该更新您的用户名以反映这一点。欢迎使用 Stackoverflow。

标签: oracle logging log-level


【解决方案1】:

这样的……

create or replace package logger as
  min_level number := 2;
  procedure ins_log(level number, message varchar2);
end;

create or replace package body logger as
  procedure ins_log(level number, message varchar2) is
    pragma autonomous_transaction;
  begin
    if level>=min_level then
      insert into loggin(ts, msg) values (sysdate, message);
    end if;
    commit; // autonomous_transaction requires that
  end;
end;

编辑:添加 pragma autonomous_transaction;,感谢 Adam

【讨论】:

  • 加上一个程序来调整min_level。您还可以为不同级别设置单独的过程,因此您可以调用logger.info(message) 等,这意味着您不需要知道调用代码中的级别值。
  • Alex:为了让它尽可能简单,我刚刚让 min_level 公开可见。现实生活中的实现会更像您所描述的那样。
  • 如果更改 min_level 的值,则必须重新编译包规范,这将导致所有已调用 ins_log 的会话得到 ORA-04061。要考虑的一个选项是将 min_level 存储在上下文中。
  • @ammoQ 我想念你可以这样做,出于某种原因,请按照正文中的定义阅读它。明白这是一个简单的例子,只是想给出一个相当简单的扩展(不要通过将它作为一个单独的答案来窃取你的风头*8-)
  • 记录器或审计程序应使用自主事务;否则回滚将消除写入的日志记录。
【解决方案2】:

可以在sourceforge 上找到用于 Oracle PL/SQL 的 log4j 端口。这允许在各个级别启用/禁用日志记录,并且对于特定的包/功能/过程只需修改配置。它还支持重定向到不同的目的地。

【讨论】:

    【解决方案3】:

    有点晚了;我建议您使用 Logger:https://github.com/tmuth/Logger---A-PL-SQL-Logging-Utility 它会满足您的要求。

    【讨论】:

      【解决方案4】:

      https://sourceforge.net/p/plj-logger/home/ 上查看 PLJ-Logger。它真的很容易实现,并且具有您想要的功能等等。 PL/SQL 代码中内置的正确日志记录将对其进行转换。

      P

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-29
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多