Oracle 日志记录工具类


在我们编写存储过程,或者PKG时,总有一些异常情况考虑不到;为了快速排查定位问题,需要及时记录异常日志;
 
1.建表语句 : 异常日志表;正常日志表
create table SSS.TC_EXCEPTION_LOG
(
  log_id         NUMBER(20) not null,
  package_name   VARCHAR2(120),
  proc_name      VARCHAR2(120),
  exception_tm   DATE default sysdate,
  exception_code VARCHAR2(200),
  exception_desc VARCHAR2(1000),
  exception_remk VARCHAR2(600),
  line_no        NUMBER(10)
);
comment on table SSS.TC_EXCEPTION_LOG
  is '系统异常日志数据';
comment on column SSS.TC_EXCEPTION_LOG.log_id
  is '主键';
comment on column SSS.TC_EXCEPTION_LOG.package_name
  is '包名';
comment on column SSS.TC_EXCEPTION_LOG.proc_name
  is '过程名';
comment on column SSS.TC_EXCEPTION_LOG.exception_tm
  is '异常时间';
comment on column SSS.TC_EXCEPTION_LOG.exception_code
  is '异常编码';
comment on column SSS.TC_EXCEPTION_LOG.exception_desc
  is '异常描述';
comment on column SSS.TC_EXCEPTION_LOG.exception_remk
  is '异常说明';
comment on column SSS.TC_EXCEPTION_LOG.line_no
  is '异常行号';
create index SSS.IDX_TC_EXCEPTION_LOG1 on SSS.TC_EXCEPTION_LOG (PROC_NAME);
alter table SSS.TC_EXCEPTION_LOG add constraint IPK_TC_EXCEPTION_LOG primary key (LOG_ID);

create table SSS.TC_EXECUTE_LOG
(
  log_id        NUMBER(20) not null,
  package_name  VARCHAR2(120),
  proc_name     VARCHAR2(120),
  strat_tm      DATE default sysdate not null,
  end_tm        DATE,
  spend_tm      NUMBER(10),
  ref_data_rows NUMBER(10),
  remk          VARCHAR2(1000)
);

comment on table SSS.TC_EXECUTE_LOG
  is '公用执行日志表';
comment on column SSS.TC_EXECUTE_LOG.log_id
  is '执行日志ID';
comment on column SSS.TC_EXECUTE_LOG.package_name
  is '包名';
comment on column SSS.TC_EXECUTE_LOG.proc_name
  is '过程名';
comment on column SSS.TC_EXECUTE_LOG.strat_tm
  is '执行开始时间';
comment on column SSS.TC_EXECUTE_LOG.end_tm
  is '执行结束时间';
comment on column SSS.TC_EXECUTE_LOG.spend_tm
  is '执行花费时间(单位: 0.01秒)';
comment on column SSS.TC_EXECUTE_LOG.ref_data_rows
  is '执行涉及数据量';
comment on column SSS.TC_EXECUTE_LOG.remk
  is '注释';
create index SSS.INK_TC_EXECUTE_LOG_01 on SSS.TC_EXECUTE_LOG (PACKAGE_NAME, PROC_NAME, REMK);
create index SSS.INK_TC_EXECUTE_LOG_02 on SSS.TC_EXECUTE_LOG (STRAT_TM);
alter table SSS.TC_EXECUTE_LOG add constraint IPK_TC_EXECUTE_LOG primary key (LOG_ID, STRAT_TM);

  

2. 记录异常的PKG

 

 
CREATE OR REPLACE PACKAGE BODY SSS.PKG_SYS_LOG IS

  --*************************************************************
  -- AUTHOR  : KELIVEN LIU
  -- CREATED : 2008-05-20
  -- PURPOSE : 记录系统中存储过程运行日志

  -- PARAMETER:
  -- P_PACKAGE_NAME VARCHAR2      包名
  -- P_PROC_NAME    VARCHAR2,    过程名
  -- P_EXCEP_DT     DATE,       执行日期
  -- P_EXCEP_CODE   VARCHAR2,   异常代码
  -- P_EXCEP_DESC   VARCHAR2,   异常描述信息
  -- P_EXCEP_REMK   VARCHAR2,  备注,可能的值为'BEGIN','END','ERROR'
  -- P_LINE_NO      NUMBER  行号

  -- MODIFY HISTORY
  -- PERSON          DATE            COMMENTS
  -- -------------------------------------------------------------
  --*************************************************************

  --*************************************************************
  -- AUTHOR  : KELIVEN LIU
  -- CREATED : 2008-05-20
  -- PURPOSE : 记录系统中存储过程运行日志

  -- PARAMETER:
  -- NAME            TYPE            DESC
  -- P_SEQ_NO       NUMBER       发生异常存储过程中主要sequence的当前值
  -- P_PROC_NAME  VARCHAR2        存储过程名
  -- P_EXCEP_DT     DATE         时间,包括开始时间,结束时间,异常发生时间
  -- P_EXCEP_CODE   VARCHAR2      异常代码
  -- P_EXCEP_DESC   VARCHAR2      异常描述信息
  -- P_EXCEP_REMK   VARCHAR2      备注,可能的值为'BEGIN','END','ERROR'
  -- P_LINE_NO      NUMBER        行号

  -- P_PACKAGE_NAME       VARCHAR2,    包名
  -- P_PROC_NAME          VARCHAR2,   过程名
  -- P_EXEC_START_TM      DATE,       执行开始时间
  -- P_EXEC_END_TM        DATE,       执行结束时间
  -- P_EXEC_PEND_TM       NUMBER,     执行花费时间
  -- P_EXEC_REF_DATA_ROWS NUMBER,     涉及数据量
  -- P_EXEC_REMK          VARCHAR2    备注,可能的值为'BEGIN','END','ERROR'

  -- MODIFY HISTORY
  -- PERSON          DATE            COMMENTS
  -- -------------------------------------------------------------
  --*************************************************************
  PROCEDURE ERROR_LOG(P_PACKAGE_NAME VARCHAR2,
                      P_PROC_NAME    VARCHAR2,
                      P_EXCEP_DT     DATE,
                      P_EXCEP_CODE   VARCHAR2,
                      P_EXCEP_DESC   VARCHAR2,
                      P_EXCEP_REMK   VARCHAR2,
                      P_LINE_NO      NUMBER) AS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    INSERT INTO TC_EXCEPTION_LOG
      (LOG_ID,
       PACKAGE_NAME,
       PROC_NAME,
       EXCEPTION_TM,
       EXCEPTION_CODE,
       EXCEPTION_DESC,
       EXCEPTION_REMK,
       LINE_NO)
    VALUES
      (SEQ_LOG.NEXTVAL,
       SUBSTR(P_PACKAGE_NAME, 1, 120),
       SUBSTR(P_PROC_NAME, 1, 120),
       P_EXCEP_DT,
       SUBSTR(P_EXCEP_CODE, 1, 200),
       SUBSTR(P_EXCEP_DESC, 1, 1000),
       SUBSTR(P_EXCEP_REMK, 1, 600),
       P_LINE_NO);

    COMMIT;

  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('STP_RUNNING_LOG' || SQLCODE || ':' || SQLERRM);
      ROLLBACK;
  END ERROR_LOG;

  ---系统执行日志
  PROCEDURE EXECUTE_LOG(P_PACKAGE_NAME       VARCHAR2,
                        P_PROC_NAME          VARCHAR2,
                        P_EXEC_START_TM      DATE,
                        P_EXEC_END_TM        DATE,
                        P_EXEC_PEND_TM       NUMBER,
                        P_EXEC_REF_DATA_ROWS NUMBER,
                        P_EXEC_REMK          VARCHAR2) AS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN

    INSERT INTO TC_EXECUTE_LOG
      (LOG_ID,
       PACKAGE_NAME,
       PROC_NAME,
       STRAT_TM,
       END_TM,
       SPEND_TM,
       REF_DATA_ROWS,
       REMK)
    VALUES
      (SEQ_LOG.NEXTVAL,
       SUBSTR(P_PACKAGE_NAME, 1, 120),
       SUBSTR(P_PROC_NAME, 1, 120),
       P_EXEC_START_TM,
       P_EXEC_END_TM,
       P_EXEC_PEND_TM,
       P_EXEC_REF_DATA_ROWS,
       SUBSTR(P_EXEC_REMK, 1, 1000));
    COMMIT;

  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('TC_EXECUTE_LOG' || SQLCODE || ':' || SQLERRM);
      ROLLBACK;
  END EXECUTE_LOG;

END PKG_SYS_LOG;
/

  

 

 

 

posted @ 2018-11-08 11:50  天蓝隐湘  阅读(421)  评论(0编辑  收藏  举报