2025年9月17日水曜日

オープンソースのLoggerパッケージを使用してログを記録する

PL/SQLによるアプリケーション開発で広く使用されているパッケージにLoggerがあります。Oracle APEXはログを記録するパッケージとしてAPEX_DEBUGを提供していますが、このパッケージはAPEXアプリケーションで使用することを前提としています。APEXのアプリケーション開発であっても、Oracle REST Data Servicesから呼ばれるプロシージャやutPLSQLによる単体テストでのログの記録には、APEX_DEBUGは使えないことからLoggerが使われるケースは多いです。

LoggerはGitHubの以下のリポジトリからダウンロードできます。

Loggerの最終版である3.1.1がリリースされたのは2015年8月17日で、10年も前になります。Issue#257として、"Is this project still maintained?"が作成されています。このIssueの最後に現在のメンテナーのMartin D'Souzaさんがコメントされています。


メンテナンスはされていないけれど、「Regardless I (and I know a lot of others) use Logger in many projects and is very stable.」とのことです。もともとオープンソースのパッケージですから、使う使わないの判断はそれぞれの開発者がすべきですが、海外のPL/SQL開発者は概ねこれで十分と判断されていて、それぞれのプロジェクトに組み込んで使用しています。

提供されている資料から必読といえるのは、以下の3ページです。

Installation - Loggerのインストール手順を説明しています。
Best Practices - ログを記録するAPI(log, log_info, log_warn, log_error, log_permanent)の使い方を説明しています。
Logger API - Logger APIのリファレンスです。

以下よりLoggerのインストール手順と基本的な使い方を紹介します。

Loggerのreleasesフォルダを開き、logger_3.1.1.zipをダウンロードします。



ファイルlogger-3.1.1.zipがダウンロードされたら、unzipコマンドで解凍します。解凍先のフォルダとしてlogger-3.1.1を指定します。

unzip -d logger-3.1.1 logger_3.1.1.zip

% unzip -d logger-3.1.1 logger_3.1.1.zip 

Archive:  logger_3.1.1.zip

  inflating: logger-3.1.1/create_user.sql  

   creating: logger-3.1.1/demos

  inflating: logger-3.1.1/demos/demo_large_string.sql  

  inflating: logger-3.1.1/demos/demo_ok_to_log.sql  

  inflating: logger-3.1.1/demos/demo_params.sql  

  inflating: logger-3.1.1/demos/demo_plugin.sql  

  inflating: logger-3.1.1/demos/demo_set_level.sql  

   creating: logger-3.1.1/docs

  inflating: logger-3.1.1/docs/.DS_Store  

  inflating: logger-3.1.1/docs/Addons.md  

  inflating: logger-3.1.1/docs/Best Practices.md  

  inflating: logger-3.1.1/docs/Change Logs.md  

  inflating: logger-3.1.1/docs/Development Guide.md  

  inflating: logger-3.1.1/docs/Installation.md  

  inflating: logger-3.1.1/docs/Logger API Template.md  

  inflating: logger-3.1.1/docs/Logger API.md  

  inflating: logger-3.1.1/docs/Plugins.md  

  inflating: logger-3.1.1/docs/README.md  

  inflating: logger-3.1.1/drop_logger.sql  

  inflating: logger-3.1.1/LICENSE    

  inflating: logger-3.1.1/logger.pkb  

  inflating: logger-3.1.1/logger.pks  

  inflating: logger-3.1.1/logger.pks.orig  

  inflating: logger-3.1.1/logger_install.sql  

  inflating: logger-3.1.1/logger_no_op.sql  

  inflating: logger-3.1.1/README.md  

   creating: logger-3.1.1/scripts

  inflating: logger-3.1.1/scripts/create_logger_synonyms.sql  

  inflating: logger-3.1.1/scripts/grant_logger_to_user.sql  

% 


解凍先のディレクトリに移動して、インストール・スクリプトを実行します。

以下の2通りのインストール方法があります。
  1. Loggerを使用するスキーマにそれぞれ、Loggerをインストールする。
  2. Logger専用のスキーマを作成してLoggerをインストールする。他のスキーマは、このスキーマにインストールされたLoggerを呼び出す。
どちらも一長一短があります(Installationに記載されています)が、最初はそれぞれのスキーマにインストールして使用することが推奨されています。

それぞれのスキーマにインストールする場合、対象のスキーマにCREATE ANY CONTEXT権限を与えます。

grant create any context to <Loggerインストール先スキーマ>;

SQL> grant create any context to wksp_apexdev;


Grantが正常に実行されました。


SQL> 


Loggerを使うスキーマに接続して、logger_install.sqlを実行します。

@logger_install.sql

SQL> @logger_install

_____________________________________________________________________________

User has all required privileges, installation will continue.

_____________________________________________________________________________



PL/SQLプロシージャが正常に完了しました。


tables/logger_logs.sql


PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。


tables/logger_prefs.sql


PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_PREFSがコンパイルされました


tables/logger_logs_apex_items.sql

Trigger BIU_LOGGER_PREFSが変更されました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_PREFSが変更されました。


tables/logger_logs_apex_items.sql


PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_APEX_ITEMSがコンパイルされました


tables/logger_prefs_by_client_id.sql


PL/SQLプロシージャが正常に完了しました。


jobs/logger_purge_job.sql


PL/SQLプロシージャが正常に完了しました。


jobs/logger_unset_prefs_by_client.sql


PL/SQLプロシージャが正常に完了しました。


views/logger_logs_5_min.sql


View LOGGER_LOGS_5_MINは作成されました。


views/logger_logs_60_min.sql


View LOGGER_LOGS_60_MINは作成されました。


views/logger_logs_terse.sql

packages/logger.pks


Package LOGGERがコンパイルされました


packages/logger.pkb


Package Body LOGGERがコンパイルされました


Recompile biu_logger_prefs after logger.pkb


Trigger BIU_LOGGER_PREFSが変更されました。


contexts/logger_context.sql


PL/SQLプロシージャが正常に完了しました。


procedures/logger_configure.plb


Procedure LOGGER_CONFIGUREがコンパイルされました


install/post_install_configuration.sql

Calling logger_configure


PL/SQLプロシージャが正常に完了しました。


Setting Logger Level


PL/SQLプロシージャが正常に完了しました。



*************************************************

Now executing LOGGER.STATUS...


Project Home Page        : https://github.com/oraopensource/logger/

Logger Version           : 3.1.1

Debug Level              : DEBUG

Capture Call Stack       : TRUE

Protect Admin Procedures : TRUE

APEX Tracing             : Enabled

SCN Capture              : Disabled

Min. Purge Level         : DEBUG

Purge Older Than         : 7 days

Pref by client_id expire : 12 hours

For all client info see  : logger_prefs_by_client_id



PL/SQLプロシージャが正常に完了しました。


*************************************************


PL/SQLプロシージャが正常に完了しました。



View LOGGER_LOGS_TERSEが変更されました。


SQL> 


個別のスキーマへのLoggerのインストールは、以上で完了です。インストールしたLoggerの削除するには、drop_logger.sqlを実行します。

@drop_logger

SQL> @drop_logger


Package LOGGERが削除されました。



Procedure LOGGER_CONFIGUREが削除されました。



Table LOGGER_LOGS_APEX_ITEMSが削除されました。



Table LOGGER_PREFSが削除されました。



Table LOGGER_LOGSが削除されました。



Table LOGGER_PREFS_BY_CLIENT_IDが削除されました。



Sequence LOGGER_LOGS_SEQが削除されました。



Sequence LOGGER_APX_ITEMS_SEQが削除されました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



View LOGGER_LOGS_5_MINが削除されました。



View LOGGER_LOGS_60_MINが削除されました。



View LOGGER_LOGS_TERSEが削除されました。


SQL> 


この他にインストール・スクリプトとしてlogger_no_op.sqlが提供されています。

これは、PL/SQLの条件コンパイルを使用して、APIとしては呼び出し可能だがログは記録しないパッケージを作成します。Loggerは使用しないが、Loggerを使用しているパッケージは使いたい、といった場合にlogger_install.sqlの代わりにlogger_no_op.sqlを実行します。

それぞれのスキーマにLoggerをインストールする以外に、専用のスキーマを作ってインストールすることができます。この場合、最初にLoggerをインストールするスキーマを作成します。

データベースにSYSで接続し、create_user.sqlを実行します。

作成されるスキーマ名はデフォルトでLOGGER_USERになります。デフォルト表領域一時表領域およびパスワードを設定して、スキーマを作成します。

logger-3.1.1 % sql sys/*********@localhost/freepdb1 as sysdba



SQLcl: 水 9月 17 13:58:14 2025のリリース25.2 Production


Copyright (c) 1982, 2025, Oracle.  All rights reserved.


接続先:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07


SQL> @create_user



Logger create schema script.

You will be prompted for a username, tablespace, temporary tablespace and password.


Name of the new logger schema to create       [LOGGER_USER] : 

Tablespace for the new logger schema           [USERS] : 

Temporary Tablespace for the new logger schema  [TEMP] : 

Enter a password for the logger schema              [] : ******


User LOGGER_USERは作成されました。



User LOGGER_USERが変更されました。



Grantが正常に実行されました。




LOGGER_USER user successfully created.

Important!!! Connect as the LOGGER_USER user and run the logger_install.sql script.



Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07から切断されました

logger-3.1.1 % 


作成したスキーマ(今回の例ではLOGGER_USER)で、データベースに接続します。

Loggerをインストールします。

@logger_install

初回実行で「バインド変数NEW.PREF_TYPEが正しくありません。」とエラーが表示された場合は、@logger_installを再実行します。

logger-3.1.1 % sql logger_user/oracle@localhost/freepdb1



SQLcl: 水 9月 17 14:03:43 2025のリリース25.2 Production


Copyright (c) 1982, 2025, Oracle.  All rights reserved.


接続先:

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.9.0.25.07


SQL> @logger_install

_____________________________________________________________________________

User has all required privileges, installation will continue.

_____________________________________________________________________________



PL/SQLプロシージャが正常に完了しました。


tables/logger_logs.sql


PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。


tables/logger_prefs.sql


PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_PREFSがコンパイルされました


LINE/COL  ERROR

--------- -------------------------------------------------------------

6/5       PLS-00049: バインド変数NEW.PREF_TYPEが正しくありません。

6/29      PLS-00049: バインド変数NEW.PREF_TYPEが正しくありません。

9/11      PLS-00049: バインド変数NEW.PREF_TYPEが正しくありません。

19/13     PLS-00049: バインド変数NEW.PREF_TYPEが正しくありません。

30/13     PLS-00049: バインド変数NEW.PREF_TYPEが正しくありません。

40/13     PLS-00049: バインド変数NEW.PREF_TYPEが正しくありません。

エラー: コンパイラ・ログを確認してください


Trigger BIU_LOGGER_PREFSが変更されました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_PREFSが変更されました。


tables/logger_logs_apex_items.sql


PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_APEX_ITEMSがコンパイルされました


tables/logger_prefs_by_client_id.sql


PL/SQLプロシージャが正常に完了しました。


jobs/logger_purge_job.sql


PL/SQLプロシージャが正常に完了しました。


jobs/logger_unset_prefs_by_client.sql


PL/SQLプロシージャが正常に完了しました。


views/logger_logs_5_min.sql


View LOGGER_LOGS_5_MINは作成されました。


views/logger_logs_60_min.sql


View LOGGER_LOGS_60_MINは作成されました。


views/logger_logs_terse.sql

packages/logger.pks


Package LOGGERがコンパイルされました


packages/logger.pkb


Package Body LOGGERがコンパイルされました


Recompile biu_logger_prefs after logger.pkb


Trigger BIU_LOGGER_PREFSが変更されました。


contexts/logger_context.sql


PL/SQLプロシージャが正常に完了しました。


procedures/logger_configure.plb


Procedure LOGGER_CONFIGUREがコンパイルされました


install/post_install_configuration.sql

Calling logger_configure


PL/SQLプロシージャが正常に完了しました。


Setting Logger Level


PL/SQLプロシージャが正常に完了しました。



*************************************************

Now executing LOGGER.STATUS...


Project Home Page        : https://github.com/oraopensource/logger/

Logger Version           : 3.1.1

Debug Level              : DEBUG

Capture Call Stack       : TRUE

Protect Admin Procedures : TRUE

APEX Tracing             : Enabled

SCN Capture              : Disabled

Min. Purge Level         : DEBUG

Purge Older Than         : 7 days

Pref by client_id expire : 12 hours

For all client info see  : logger_prefs_by_client_id



PL/SQLプロシージャが正常に完了しました。


*************************************************


PL/SQLプロシージャが正常に完了しました。



View LOGGER_LOGS_TERSEが変更されました。


SQL> @logger_install

_____________________________________________________________________________

User has all required privileges, installation will continue.

_____________________________________________________________________________



PL/SQLプロシージャが正常に完了しました。


tables/logger_logs.sql


PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。


tables/logger_prefs.sql


PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_PREFSがコンパイルされました



Trigger BIU_LOGGER_PREFSが変更されました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_PREFSが変更されました。


tables/logger_logs_apex_items.sql


PL/SQLプロシージャが正常に完了しました。



Trigger BIU_LOGGER_APEX_ITEMSがコンパイルされました


tables/logger_prefs_by_client_id.sql


PL/SQLプロシージャが正常に完了しました。


jobs/logger_purge_job.sql


PL/SQLプロシージャが正常に完了しました。


jobs/logger_unset_prefs_by_client.sql


PL/SQLプロシージャが正常に完了しました。


views/logger_logs_5_min.sql


View LOGGER_LOGS_5_MINは作成されました。


views/logger_logs_60_min.sql


View LOGGER_LOGS_60_MINは作成されました。


views/logger_logs_terse.sql

packages/logger.pks


Package LOGGERがコンパイルされました


packages/logger.pkb


Package Body LOGGERがコンパイルされました


Recompile biu_logger_prefs after logger.pkb


Trigger BIU_LOGGER_PREFSが変更されました。


contexts/logger_context.sql


PL/SQLプロシージャが正常に完了しました。


procedures/logger_configure.plb


Procedure LOGGER_CONFIGUREがコンパイルされました


install/post_install_configuration.sql

Calling logger_configure


PL/SQLプロシージャが正常に完了しました。


Setting Logger Level


PL/SQLプロシージャが正常に完了しました。



*************************************************

Now executing LOGGER.STATUS...


Project Home Page        : https://github.com/oraopensource/logger/

Logger Version           : 3.1.1

Debug Level              : DEBUG

Capture Call Stack       : TRUE

Protect Admin Procedures : TRUE

APEX Tracing             : Enabled

SCN Capture              : Disabled

Min. Purge Level         : DEBUG

Purge Older Than         : 7 days

Pref by client_id expire : 12 hours

For all client info see  : logger_prefs_by_client_id



PL/SQLプロシージャが正常に完了しました。


*************************************************


PL/SQLプロシージャが正常に完了しました。



View LOGGER_LOGS_TERSEが変更されました。


SQL> 


Loggerを使用するユーザーに、スキーマLOGGER_USERに作成されたオブジェクトへのアクセス権限を与えます。

@scripts/grant_logger_to_user <Loggerを使用するユーザー>

logger_install.sqlの実行は1度だけですが、grant_logger_to_user.sqlはLoggerを使うユーザーが増える度に実行します。

SQL> @scripts/grant_logger_to_user wksp_apexdev

旧:grant execute on logger to &to_user

新:grant execute on logger to wksp_apexdev


Grantが正常に実行されました。


旧:grant select, delete on logger_logs to &to_user

新:grant select, delete on logger_logs to wksp_apexdev


Grantが正常に実行されました。


旧:grant select on logger_logs_apex_items to &to_user

新:grant select on logger_logs_apex_items to wksp_apexdev


Grantが正常に実行されました。


旧:grant select, update on logger_prefs to &to_user

新:grant select, update on logger_prefs to wksp_apexdev


Grantが正常に実行されました。


旧:grant select on logger_prefs_by_client_id to &to_user

新:grant select on logger_prefs_by_client_id to wksp_apexdev


Grantが正常に実行されました。


旧:grant select on logger_logs_5_min to &to_user

新:grant select on logger_logs_5_min to wksp_apexdev


Grantが正常に実行されました。


旧:grant select on logger_logs_60_min to &to_user

新:grant select on logger_logs_60_min to wksp_apexdev


Grantが正常に実行されました。


旧:grant select on logger_logs_terse to &to_user

新:grant select on logger_logs_terse to wksp_apexdev


Grantが正常に実行されました。


SQL> 


データベースにLoggerを使用するユーザーで接続します。

スキーマLOGGER_USERにあるオブジェクトを参照するシノニムを作成します。シノニムを作成することにより、スキーマに直接Loggerをインストールしたときと同様に、APIを呼び出したりログを参照することができるようになります。

@scripts/create_logger_synonyms <Loggerをインストールしたユーザー>

SQL> @scripts/create_logger_synonyms LOGGER_USER

旧:create or replace synonym logger for &from_user..logger

新:create or replace synonym logger for LOGGER_USER.logger


Synonym LOGGERは作成されました。


旧:create or replace synonym logger_logs for &from_user..logger_logs

新:create or replace synonym logger_logs for LOGGER_USER.logger_logs


Synonym LOGGER_LOGSは作成されました。


旧:create or replace synonym logger_logs_apex_items for &from_user..logger_logs_apex_items

新:create or replace synonym logger_logs_apex_items for LOGGER_USER.logger_logs_apex_items


Synonym LOGGER_LOGS_APEX_ITEMSは作成されました。


旧:create or replace synonym logger_prefs for &from_user..logger_prefs

新:create or replace synonym logger_prefs for LOGGER_USER.logger_prefs


Synonym LOGGER_PREFSは作成されました。


旧:create or replace synonym logger_prefs_by_client_id for &from_user..logger_prefs_by_client_id

新:create or replace synonym logger_prefs_by_client_id for LOGGER_USER.logger_prefs_by_client_id


Synonym LOGGER_PREFS_BY_CLIENT_IDは作成されました。


旧:create or replace synonym logger_logs_5_min for &from_user..logger_logs_5_min

新:create or replace synonym logger_logs_5_min for LOGGER_USER.logger_logs_5_min


Synonym LOGGER_LOGS_5_MINは作成されました。


旧:create or replace synonym logger_logs_60_min for &from_user..logger_logs_60_min

新:create or replace synonym logger_logs_60_min for LOGGER_USER.logger_logs_60_min


Synonym LOGGER_LOGS_60_MINは作成されました。


旧:create or replace synonym logger_logs_terse for &from_user..logger_logs_terse

新:create or replace synonym logger_logs_terse for LOGGER_USER.logger_logs_terse


Synonym LOGGER_LOGS_TERSEは作成されました。


SQL> 


以上でLoggerのインストールは完了です。

Loggerによるログを記録する主要なAPIは、logger.logです。パラメータとしてp_textp_scopep_extrap_paramsを受け付けます。必須パラメータはp_textのみです。

PROCEDURE LOG

  Argument Name             Type                 In/Out Default?

  ------------------------- -------------------- ------ --------

  P_TEXT                    VARCHAR2             IN      

  P_SCOPE                   VARCHAR2             IN     Y

  P_EXTRA                   CLOB                 IN     Y

  P_PARAMS                  PL/SQL TABLE         IN     Y



実際にログを記録してみます。

exec logger.log('my first log');

SQL> exec logger.log('my first log');


PL/SQLプロシージャが正常に完了しました。


SQL>


記録されたログを確認します。表LOGGER_LOGSを検索します。5分以内、または60分以内に書き込まれたログに限定するビューLOGGER_LOGS_5_MINとLOGGER_LOGS_60_MINもあります。

select * from logger_logs;

SQL> select * from logger_logs;


   ID    LOGGER_LEVEL TEXT            TIME_STAMP                     SCOPE    MODULE    ACTION    USER_NAME       CLIENT_IDENTIFIER    CALL_STACK                               UNIT_NAME    LINE_NO       SCN EXTRA       SID CLIENT_INFO    

_____ _______________ _______________ ______________________________ ________ _________ _________ _______________ ____________________ ________________________________________ ____________ __________ ______ ________ ______ ______________ 

    6              16 my first log    25-09-17 05:52:02.934910000             SQLcl               WKSP_APEXDEV                           object      line  object

  handle    number  name

0x7bb28ec8         1  anonymous block

                                               175                


SQL>


logger.logの引数として与えられた情報以外に、セッションの情報などがログに付与されます。

SQL> desc logger_logs


名前                   Nullかどうか    タイプ               

____________________ ___________ _________________ 

ID                   NOT NULL    NUMBER            

LOGGER_LEVEL         NOT NULL    NUMBER            

TEXT                             VARCHAR2(4000)    

TIME_STAMP           NOT NULL    TIMESTAMP(6)      

SCOPE                            VARCHAR2(1000)    

MODULE                           VARCHAR2(100)     

ACTION                           VARCHAR2(100)     

USER_NAME                        VARCHAR2(255)     

CLIENT_IDENTIFIER                VARCHAR2(255)     

CALL_STACK                       VARCHAR2(4000)    

UNIT_NAME                        VARCHAR2(255)     

LINE_NO                          VARCHAR2(100)     

SCN                              NUMBER            

EXTRA                            CLOB              

SID                              NUMBER            

CLIENT_INFO                      VARCHAR2(64)      

SQL> 


ログを記録するファンクションには、LOGGING_LEVELの違いによりlogger.loglogger.log_infolog_warnlog_errorlog_permanentがあります。引数はすべてlogger.logと同じです。これらのファンクションの使い分けについては、Best Practicesを参照してください。

記録されたログをパージするには、logger.purgeまたはlogger.purge_allを呼び出します。これらのAPIの説明は、Logger APIを参照してください。

専用ユーザーにLoggerをインストールしている場合、ログは専用ユーザーのスキーマにある表となります。この場合、他のユーザーはlogger.purgeを呼び出してログを消去できません。

exec logger.purge(0,logger.g_information);

SQL> exec logger.purge(0,logger.g_information);

BEGIN logger.purge(0,logger.g_information); END;

*

行でエラーが発生しました 1:

ORA-20000: You are not authorized to call this procedure. Change Logger pref: PROTECT_ADMIN_PROCS to false to avoid this.

ORA-06512: "LOGGER_USER.LOGGER", 行420

ORA-06512: "LOGGER_USER.LOGGER", 行2121

ORA-06512: 行1


https://docs.oracle.com/error-help/db/ora-20000/



More Details :

https://docs.oracle.com/error-help/db/ora-20000/

https://docs.oracle.com/error-help/db/ora-06512/

SQL> 


デフォルトの動作を変更するには、表LOGGER_PREFSの内容を直接変更します。

update logger_prefs set pref_value = 'FALSE' where pref_name = 'PROTECT_ADMIN_PROCS' and pref_type = 'LOGGER';

SQL> select * from logger_prefs;


PREF_NAME                         PREF_VALUE            PREF_TYPE    

_________________________________ _____________________ ____________ 

LOGGER_DEBUG                      FALSE                 LOGGER       

PREF_BY_CLIENT_ID_EXPIRE_HOURS    12                    LOGGER       

PLUGIN_FN_ERROR                   NONE                  LOGGER       

PURGE_MIN_LEVEL                   DEBUG                 LOGGER       

INSTALL_SCHEMA                    LOGGER_USER           LOGGER       

INCLUDE_CALL_STACK                TRUE                  LOGGER       

LEVEL                             DEBUG                 LOGGER       

PURGE_AFTER_DAYS                  7                     LOGGER       

PROTECT_ADMIN_PROCS               TRUE                  LOGGER       

LOGGER_VERSION                    3.1.1                 LOGGER       

GLOBAL_CONTEXT_NAME               LOGGER_USER_LOGCTX    LOGGER       


11行が選択されました。 


SQL> update logger_prefs set pref_value = 'FALSE' where pref_name = 'PROTECT_ADMIN_PROCS' and pref_type = 'LOGGER';


1行更新しました。


SQL> commit;


コミットが完了しました。


SQL> 


パージに関してはPROTECT_ADMIN_PROCSをFALSEにすることにより、専用ユーザーでなくてもログをパージできるようになります(とはいえ、複数人で開発している場合は、このようなことはしないでしょう)。

SQL> exec logger.purge(0,logger.g_information);


PL/SQLプロシージャが正常に完了しました。


SQL> 


その場合でも、レベルがPERMANENTのログはPURGEプロシージャーでは消去できません。ログを完全に消去する場合は、表LOGGER_LOGSを全行削除します。

LOGやLOG_INFOのように開発者がログに書き込むメッセージを決める以外に、そのときの状態をログに記録するプロシージャが定義されています。

Logger APIから、そのうちのいくつかを紹介します。

LOGGER.LOG_USERENVを呼び出すことで、データベースのセッションに紐づく情報をログに記録できます。NLS以外にALLUSERINSTANCEを指定できます。

set serveroutput on
set long 4000
exec logger.log_userenv('NLS');
select * from logger_logs;

SQL> exec logger.log_userenv('NLS');


PL/SQLプロシージャが正常に完了しました。


SQL> select * from logger_logs;


   ID    LOGGER_LEVEL TEXT                                         TIME_STAMP                     SCOPE    MODULE    ACTION    USER_NAME       CLIENT_IDENTIFIER    CALL_STACK    UNIT_NAME    LINE_NO       SCN EXTRA                                                          SID CLIENT_INFO    

_____ _______________ ____________________________________________ ______________________________ ________ _________ _________ _______________ ____________________ _____________ ____________ __________ ______ ___________________________________________________________ ______ ______________ 

   12              64 USERENV values stored in the EXTRA column    25-09-17 06:20:23.299814000             SQLcl               WKSP_APEXDEV                                                                      NLS_CALENDAR                  : GREGORIAN

NLS_CURRENCY                  : ¥

NLS_DATE_FORMAT               : RR-MM-DD

NLS_DATE_LANGUAGE             : JAPANESE

NLS_SORT                      : BINARY

NLS_TERRITORY                 : JAPAN

LANG                          : JA

LANGUAGE                      : JAPANESE_JAPAN.AL32UTF8

       175                


SQL> 


プロシージャLOG_CGI_ENVおよびLOG_APEX_ITEMSは、ORDSのRESTサービスやAPEXのプロセスに埋め込んで、リクエストを受け付けた時点のCGI変数をログに記録したり、APEXのセッション・ステート(ページ・アイテムの値)をログに記録するために使用できます。

これら以外に多数のユーティリティ・ファンクションも含まれています。

Loggerを使い始めるにあたって、Logger APIのリファレンスを参照することにより、Loggerを上手に活用できるようになるでしょう。

表LOGGER_LOGSに書き込まれているメッセージは、Loggerをインストールしたユーザーで実行されるジョブLOGGER_PURGE_JOBにより、毎日深夜1時に消去されます。保持期間はPURGE_AFTER_DAYSで設定されている期間になり、デフォルトでは7日間です。

Loggerの紹介は以上になります。