четверг, 7 июля 2016 г.

Логирование работы программы

Следующий скрипт создает пакет и таблицы для записи логов.

Логи пишутся в двух режимах:
1. логи которые откатываются при откате транзакции
2. логи которые коммитятся в автономной транзакции и которые невозможно откатить.

DROP SEQUENCE seq_tbl_system_log
/
DROP SEQUENCE seq_tbl_log
/
DROP TABLE tbl_log
/
DROP TABLE tbl_system_log
/

CREATE SEQUENCE seq_tbl_system_log
/
CREATE TABLE tbl_system_log(
  id                 INTEGER CONSTRAINT pk_tbl_system_log PRIMARY KEY,
  name               VARCHAR2(30) NOT NULL CONSTRAINT un_tbl_system_log UNIQUE
)
/

CREATE SEQUENCE seq_tbl_log
/
CREATE TABLE tbl_log(
  id                 INTEGER CONSTRAINT pk_tbl_log PRIMARY KEY,
  system_log_id      INTEGER        NOT NULL,
  message            VARCHAR2(4000) NOT NULL,
  log_type_id        INTEGER        NOT NULL,
  ts                 TIMESTAMP DEFAULT SYSDATE NOT NULL,
  CONSTRAINT fk_tbl_log_tbl_system_log FOREIGN KEY (system_log_id) REFERENCES tbl_system_log (id)
)
/

CREATE OR REPLACE FORCE VIEW v_log
AS
SELECT tllg.id
     , tslg.name
     , tllg.message
     , DECODE(tllg.log_type_id, 1, 'INFO', 2, 'WARNING', 3, 'ERROR') log_type
     , tllg.ts
  FROM tbl_log tllg
       JOIN
       tbl_system_log tslg
         ON tllg.system_log_id = tslg.id
/
CREATE OR REPLACE PACKAGE pkg_log IS

PROCEDURE reg_system_log
  (p_name               IN VARCHAR2);

FUNCTION get_system_log_id
  (p_name               IN VARCHAR2)
 RETURN NUMBER;

PROCEDURE ins_log_info
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_info_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_warning
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_warning_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_error
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE ins_log_error_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2);

PROCEDURE del_log
  (p_id                 IN NUMBER);
PROCEDURE del_log_autonomous
  (p_id                 IN NUMBER);

END pkg_log;
/

CREATE OR REPLACE PACKAGE BODY pkg_log
IS
PROCEDURE reg_system_log
  (p_name               IN VARCHAR2)
IS
BEGIN
  INSERT INTO tbl_system_log
    (id,
     name)
  VALUES(
   seq_tbl_system_log.NEXTVAL,
   p_name);
END;

FUNCTION get_system_log_id
  (p_name               IN VARCHAR2)
 RETURN NUMBER
IS
  l_id NUMBER;
BEGIN
  SELECT id
    INTO l_id
    FROM tbl_system_log
   WHERE name = p_name;

  RETURN l_id;
END;

PROCEDURE ins_log
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2,
   p_log_type_id        IN NUMBER)
IS
BEGIN
  INSERT INTO tbl_log
    (id,
     system_log_id,
     message,
     log_type_id)
  VALUES(
     seq_tbl_log.NEXTVAL,
     p_system_log_id,
     p_message,
     p_log_type_id);
END;

--- INFO -----------------------------------
PROCEDURE ins_log_info
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
BEGIN
  ins_log(p_system_log_id, p_message, 1);
END;

PROCEDURE ins_log_info_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  ins_log(p_system_log_id, p_message, 1);
  COMMIT;
END;

--- WARNING -------------------------------
PROCEDURE ins_log_warning
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
BEGIN
  ins_log(p_system_log_id, p_message, 2);
END;

PROCEDURE ins_log_warning_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  ins_log(p_system_log_id, p_message, 2);
  COMMIT;
END;

--- ERROR ---------------------------------
PROCEDURE ins_log_error
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
BEGIN
  ins_log(p_system_log_id, p_message, 3);
END;

PROCEDURE ins_log_error_autonomous
  (p_system_log_id      IN NUMBER,
   p_message            IN VARCHAR2)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  ins_log(p_system_log_id, p_message, 3);
  COMMIT;
END;

--- DELETE -----------------------------
PROCEDURE del_log
  (p_id                 IN NUMBER)
IS
BEGIN

  DELETE FROM tbl_log
    WHERE id = p_id;

END;

PROCEDURE del_log_autonomous
  (p_id                 IN NUMBER)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN

  del_log(p_id);
  COMMIT;

END;

END pkg_log;
/

Комментариев нет:

Отправить комментарий