【问题标题】:When and how we should we write the application logs for the execution of stored procedure(Oracle DB)?我们应该何时以及如何为存储过程(Oracle DB)的执行编写应用程序日志?
【发布时间】:2020-10-15 20:52:52
【问题描述】:

我想知道编写存储过程(应用程序)日志的经验法则/指导方针是什么。通常我们使用2种方法: 1)使用 UTL_FILE 包将日志写入文件(每次运行单独的文件)。 2) 使用 Log4pl 包将不同的日志(诊断、错误、警告或致命)写入表中。 几乎对于每个程序,我们都使用上述两种方法,具体取决于我们正在编写的内容。就像致命错误一样,我们使用 Log4pl 和一些信息显示(比如我们将其记录在文件中的处理)。 想知道其他组织如何维护日志?他们是否也遵循 aboe 2 方法或只使用一种方法?它是在什么基础上决定的? 注意:我正在寻找仅为应用程序编程而不是为数据库编写的日志。 任何建议或博客链接都会很棒。谢谢。

【问题讨论】:

  • 我更喜欢结构良好的数据库日志而不是表,它会自动捕获会话详细信息,例如时间戳、sid、序列号、模块、操作、客户端信息、当前代码单元、子程序、错误堆栈和经过的时间间隔。然后,您可以从中获得有用的报告,而这些报告是您无法从文件中轻松获得的。与文件相比,从桌面访问数据库表也更容易(除非您在其上定义了外部表)。
  • 这是一个重要的问题,但可能不太适合 Stack Overflow,因为关于这个主题有很多意见。

标签: oracle logging stored-procedures plsql


【解决方案1】:

您可以在 oracle 应用程序中实现日志记录机制的另一种方法- -> splunk

【讨论】:

  • 感谢分享,但我正在寻找一些应用程序编程的观点而不是数据库搜索。
【解决方案2】:

UTL_FILE 并不能很好地扩展写入日志文件,例如

SQL> create table log_table (
  2    s timestamp default systimestamp,
  3    m varchar2(1000)
  4    );

Table created.

SQL>
SQL> set timing on
SQL> begin
  2    for i in 1 .. 10000 loop
  3      insert into log_table (m) values ('My message');
  4      commit;
  5    end loop;
  6  end;
  7  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.62
SQL>
SQL> declare
  2    f utl_file.file_type;
  3  begin
  4    f := utl_file.fopen('TMP','logfile.dat','W');
  5    for i in 1 .. 10000 loop
  6      utl_file.put_line(f,to_char(systimestamp)||' '||'My message');
  7      utl_file.fflush(f);
  8    end loop;
  9    utl_file.fclose(f);
 10  end;
 11  /

PL/SQL procedure successfully completed.

Elapsed: 00:00:30.58

现在您可能会想“我将只删除 utl_file.fflush(f) 调用”,这确实会使其在与数据库表相当的时间内运行。但是,您最需要日志信息的时间是程序崩溃的时候——如果它崩溃了,而您还没有刷新,那么您就有丢失最近的日志信息的风险,这些信息对于了解程序崩溃的原因至关重要。

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 2019-08-26
    • 1970-01-01
    • 2019-01-11
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多