Подтвердить что ты не робот

PL/SQL Logging - Как управлять?

Я хочу представить структуру ведения журнала в нашем существующем приложении Oracle, чтобы заменить использование DBMS_OUTPUT.

Фрейм будет использоваться в первую очередь для облегчения отладки и будет описывать такие вещи, как начальная процедура x, детали параметров, процедура окончания x и т.д. Она также должна включать функции для всех или только одного программного модуля, различные уровни трассировки на самом деле являются довольно стандартными функциями ведения журнала.

Реализация этих требований должна быть относительно простой, однако, если бы я хотел, чтобы ваша помощь помогла вам как можно лучше отключить эту функцию. То, что я пытаюсь достичь, - это наименьшая возможная производительность при отключении трассировки. Что, надеюсь, должно быть в большинстве случаев!

Как приложение использует 10g release 2, мне вначале мне понравился вид обертывания механизма ведения журнала в условной компиляции, так что фреймворк регистрации даже не отображается во время нормальной работы. К сожалению, мне пришлось неохотно отказаться от этой идеи, поскольку большая часть приложения построена с использованием автономных процедур и функций, поэтому включение функции ведения журнала может потенциально привести к недействительности большого количества кода.

Я искал несколько существующих открытий и других фреймворков\функциональность для вдохновения:

log4plsql (http://log4plsql.sourceforge.net/)

Обзор APC здесь, особенно под приемлемым воздействием, вызывает у меня озабоченность.

Проект OraLog (http://oralog.sourceforge.net)

Обновления с 2007 года

PL/VISION (здесь)

Выглядит довольно старым, никаких изменений с Oracle 8i?

Спросите Tom Instrumentation (здесь)

Обновление 01/04/2014 Tom Kyte теперь рекомендует Tyler Muth Logger

Мне было бы очень интересно услышать ваши впечатления, если бы вы ввели какую-то форму входа в ваше приложение Oracle, как вы его реализовали, и особенно, как вы его контролируете.

4b9b3361

Ответ 1

Вы упомянули об отказе от идеи условной компиляции из-за потенциальных каскадных недействительности - есть подход, который несколько схож, если вы хотите прикоснуться к источнику PL/SQL, где требуется ведение журнала/трассировка, не требующая перекомпиляции включить.

Вы все равно можете добавить пару имени/значения по собственному выбору в PLSQL_CCFLAGS, а ваш код приложения сделать относительно легкий запрос параметра v $, чтобы определить, включено ли ведение журнала. Самая грубая реализация - это одна пара имя/значение, но вы можете расширить ее, чтобы иметь разные пары, которые были бы специфичными для модуля, поэтому ведение журнала можно было бы включить с более тонкой детализацией.

[Изменить] Здесь очень простой пример в ответ на ваш комментарий/запрос - вы, очевидно, захотите быть более сложными при разборе строки PLSQL_CCFLAGS в случае, если у нее есть другая существующая информация, возможно, она будет включена в функцию и т.д.:

create or replace procedure ianc_cc
is
cc_flag_val varchar2(4000);
begin 
-- need direct select grant on v_$parameter for this...
select value into cc_flag_val 
  from v$parameter where name = 'plsql_ccflags';
if (cc_flag_val = 'custom_logging:true') then
  dbms_output.put_line('custom logging is on'); 
else  
  dbms_output.put_line('custom logging is off'); 
end if;
end;
/

Теперь, когда пользователь имеет право выпускать ALTER SYSTEM:

ALTER SYSTEM устанавливает PLSQL_CCFLAGS = 'custom_logging: true';

и переключитесь на:

ALTER SYSTEM устанавливает PLSQL_CCFLAGS = '';

Ответ 3

В нашем приложении мы используем инструментарий Ask Tom debug.f. Одна вещь, которую я быстро заметил, заключалась в том, что "debugtab" слишком часто запрашивался, чтобы узнать, включено ли ведение журнала или нет для каждого сообщения журнала. Я взломал изменение в нем, чтобы проверять таблицу только каждые 100 сообщений журнала, и теперь это работает очень хорошо.

Моя задача - попытаться избежать проверки таблицы для каждого сообщения журнала, чтобы узнать, следует ли ее выводить или нет. Часто вы хотите включить регистрацию в середине долгого процесса, поэтому важно, чтобы вы могли это сделать. В моем случае я решил, что смогу жить с ожиданием нескольких секунд, пока не будет выполнено 100 вызовов регистрации, прежде чем на самом деле заметили, что регистрация включена.

Ответ 4

Не было бы проще настроить контекст и добавить к нему пару значений имени? Вы можете изменить значение в контексте с помощью триггера в вашей таблице debugtab.