oracle - 我们应该何时以及如何为存储过程(Oracle DB)的执行编写应用程序日志?
问题描述
我想知道编写存储过程(应用程序)日志的拇指规则/指导方针是什么。通常我们使用两种方法: 1)使用 UTL_FILE 包将日志写入文件(每次运行单独的文件)。2) 使用 Log4pl 包将不同的日志(诊断、错误、警告或致命)写入表中。几乎对于每个程序,我们都使用上述两种方法,具体取决于我们正在编写的内容。就像致命错误一样,我们使用 Log4pl 和一些信息显示(比如我们将其记录在文件中的处理)。想知道其他组织如何维护日志?他们是否也遵循 aboe 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) 调用”,这确实会使其在与数据库表相当的时间内运行。但是你最需要日志信息的时候是程序崩溃的时候——如果它崩溃了,而你还没有刷新,那么你就有丢失最近的日志信息的风险,这对于了解程序崩溃的原因至关重要。
推荐阅读
- tcl - NS 2:跳过重复节点
- apache-spark - 使用正则表达式检查大于零的任何列的多个列
- reactjs - 如何在页面(路由)更改后完成请求之前显示加载指示器?
- oracle - 如何在 quarkus 数据源上指定当前模式?
- android - 如何在android房间加入查询中的内表中进行过滤
- r - 使用 ggplot2 创建均值分组条形图
- python-3.x - 我有我的作业代码。我不知道如何修复错误。我得到一个类型错误
- python-3.x - Ubuntu 上的 Tensorflowhub 负载问题
- python - 熊猫的 qcut 可能四舍五入?
- php - 如何在 php 或其框架中找到“::get”?