четверг, 30 сентября 2010 г.

Логирование в таблицу

Для отладки кода часто бывает нужно собирать отладочную информацию.
Этим мы сейчас и займемся.


Для начала создадим сиквенс, который будет генерировать уникальные идентификаторы для наших логов:
CREATE SEQUENCE logs_tab_seq
  START WITH 1
  MAXVALUE 999999999999
  MINVALUE 1
  NOCYCLE
  NOCACHE
  NOORDER
/

Теперь, очередь за таблицей, в которой будут храниться логи:
create table logs_tab
(
  id          number(32)      not null,
  date_insert date            not null,
  message     varchar2(4000)      null,
  message_big clob                null,
  group_id    varchar2(16)        null,
  sessionid   number(16)      not null,
  os_user     varchar2(128)   not null
);
comment on table logs_tab is 'Table with logs (filled procedure write_log, cleaned - clear_log)';

comment on column logs_tab.id is 'ID of record';
comment on column logs_tab.date_insert is 'Date insert records into the table';
comment on column logs_tab.message is 'A short message is less than 4000 characters';
comment on column logs_tab.message_big is 'A Long message (to be filled, if in the short does not fit)';
comment on column logs_tab.group_id is 'Group ID records (selected by the user ID)';
comment on column logs_tab.sessionid is 'ID of session';
comment on column logs_tab.os_user is 'User''s name in OS';

alter table logs_tab
  add constraint logs_tab_pk primary key (id)
/

Процедура логирования:
create or replace procedure write_log(p_message  in varchar2,
                                      p_group_id in varchar2 default null) is
   pragma autonomous_transaction;
   v_message_big clob;
   v_message     varchar2(4000);
   v_sessionid   number(16);
   v_os_user     varchar2(128);
begin

   if length(p_message) < 4000 then
      v_message     := p_message;
      v_message_big := null;
   else
      v_message     := null;
      v_message_big := p_message;
   end if;

   select userenv('sessionid') into v_sessionid from dual;

   select sys_context('userenv', 'os_user') into v_os_user from dual;

   insert into logs_tab
      (id, date_insert, message, message_big, group_id, sessionid, os_user)
   values
      (logs_tab_seq.nextval,
       sysdate,
       v_message,
       v_message_big,
       p_group_id,
       v_sessionid,
       v_os_user);

   commit;
end write_log;
/

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

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