web-dev-qa-db-ja.com

PL / SQLロギング-制御方法は?

DBMS_OUTPUTの使用を置き換えるために、既存のOracleアプリケーションにロギングフレームワークを導入しようとしています。

フレームワークは主にデバッグを支援するために使用され、開始xプロシージャ、パラメータの詳細、終了プロシージャxなどの詳細を示します。また、すべてまたは1つのプログラムユニット、さまざまなレベルのトレースに対してオンにする機能も備えている必要があります。実際、ほとんど標準的なロギング機能とは何ですか。

これらの要件の実装は比較的簡単なはずですが、私があなたの助けを求めているのは、この機能をオフまたはオンにする最善の方法です。私が達成しようとしているのは、トレースがオフになっているときのパフォーマンスへの影響を最小限に抑えることです。うまくいけば、ほとんどの場合です!

アプリケーションは10gリリース2を使用しているので、最初は条件付きコンパイル内にロギングメカニズムをラップして、通常の操作中にロギングフレームワークが表示されないようにする外観が好きでした。残念ながら、ほとんどのアプリケーションはスタンドアロンのプロシージャと関数を使用して構築されているため、ログ機能をオンにすると多くのコードが無効になる可能性があるため、このアイデアを惜しみなく放棄する必要がありました。

インスピレーションを得るために、いくつかの既存のオープンソースやその他のフレームワーク\機能を調べました。

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

APCのレビュー ここ 特に許容できる影響の下で私は懸念を抱いています。

OraLogプロジェクト( http://oralog.sourceforge.net

2007年以降の更新はありません

PL/VISIONここ

かなり古く見えますが、Oracle 8i以降の変更はありませんか?

Tom Instrumentationに質問するここ

2014年1月4日更新Tom Kyte Tyler Muthの Logger を推奨するようになりました

Oracleアプリケーションに何らかの形式のログインを導入した場合、それをどのように実装したか、特にどのように制御したかについて、あなたの経験を聞いてみたいと思います。

20
Ian Carpenter

カスケード無効化の可能性があるため、条件付きコンパイルの概念を破棄するとおっしゃいました。ロギング/トレースが必要なPL/SQLソースに触れてもかまわない場合は、有効にするための再コンパイルを伴わない、多少似たアプローチがあります。

PLSQL_CCFLAGSに独自に選択した名前と値のペアを追加し、アプリケーションコードにv $ parameterの比較的軽量なクエリを実行させて、ロギングが「オン」になっているかどうかを判断することもできます。最も大雑把な実装は1つの名前と値のペアですが、これを拡張してモジュール固有の異なるペアを設定し、より細かい粒度でロギングをオンにすることができます。

[編集]コメント/リクエストに対する非常に簡単な例を次に示します。PLSQL_CCFLAGS文字列に他の既存の情報がある場合、おそらく関数にラップする場合など、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 set PLSQL_CCFLAGS = 'custom_logging:true';

次の方法で切り替えます。

ALTER SYSTEM set PLSQL_CCFLAGS = '';

7
dpbradley

同じ問題を確認し、まだアクティブであると思われる次のプロジェクトを見つけました https://github.com/tmuth/Logger---A-PL-SQL-Logging-Utility

5
Patrick

このアプリケーションでは、AskTomのdebug.fインストルメンテーションを多用します。私がすぐに気付いたのは、「debugtab」がクエリされすぎて、すべてのログメッセージでログがオンになっているかどうかを確認できないことでした。 100ログメッセージごとに1回だけテーブルをチェックするように変更をハッキングしましたが、今ではかなりうまく機能しています。

私のポイントは、各ログメッセージのテーブルをチェックして、出力する必要があるかどうかを確認しないようにすることです。多くの場合、長時間実行されるプロセスの途中でログオンをオンにしたいので、それを実行できることが重要です。私の場合、ロギングがオンになっていることに実際に気付く前に、100回のロギング呼び出しが終了するまで数秒待つことで生きていけると決めました。

3

コンテキストを設定して名前と値のペアを追加する方が簡単ではないでしょうか。 debugtabテーブルのトリガーを使用して、コンテキスト内の値を変更できます。

1
Rigved