記事
· 2023年1月5日 14m read

システムモニタを利用して特定の条件に合う時にメッセージログ(コンソールログ)に情報を出力する方法

これは InterSystems FAQ サイトの記事です。

システムモニタの中の「アプリケーションモニタ」を利用することで、ユーザが定義した特定の監視対象に対してチェックを行い特定の条件に合致した場合に通知を行ったり、メッセージログ(コンソールログ)に情報を出力したり、ユーザが定義するアクションを指定できます。

<メモ>
アプリケーションモニタはインストールにより準備されますが、ユーザが付属のアプリケーション・モニタ・クラスを有効化するまで動作しないモニタです。
付属のアプリケーションモニタには、監査のカウントやイベント詳細を収集するもの、ディスクの容量を監視するものなどが含まれます。

詳細は、以下ドキュメントをご参照ください。
【IRIS】アプリケーション・モニタのメトリック
アプリケーション・モニタのメトリック

作成手順は以下の通りです。

  1. %SYSネームスペースにアプリケーションモニタ用クラスを作成する
  2. 作成した1のクラスを、システムモニタのアプリケーションモニタ有効化メニューで有効化する
  3. 収集のインターバルを設定する(秒単位)
  4. システムモニタを再起動する

以下例で追加するユーザ定義のアプリケーションモニタクラスは、監査ログに「ログイン失敗」のイベントが記録された場合に、メッセージログ(コンソールログ)にイベント詳細を出力する流れを記述しています。
(システムに監査ログに関するアプリケーションモニタクラスが用意されていますが、特定のイベントに対する監視ではないため、ユーザ定義のアプリケーションモニタを用意します。)


具体的な流れは以下の通りです。

1、%SYSネームスペースにアプリケーションモニタ用クラスを作成する

%Monitor.Adaptorを継承するクラスを%SYSネームスペースに作成します。
継承された GetSample()メソッドが指定の間隔(デフォルト30秒)で動作するため、GetSample()メソッドをオーバーライドし、情報収集と通知の判断、出力の命令を記述します。
例の情報収集はSQLを利用していますが、グローバル変数にある情報を利用することもできます。
※GetSample()メソッドは、%Statusを戻り値に設定していますので、必ず戻り値に%Statusの情報を返してください。

例では、監査イベントが記録される %SYS.Audit テーブルを利用して、ログイン失敗のイベント(Event='LoginFailure')を抽出しています。
(前回調査した時刻よりも新しい時刻で記録されているものを抽出しています)

Class MyMetric.CheckTable Extends %Monitor.Adaptor
{

Property AuditEventTC As %String;
Method GetSample() As %Status
{
    #dim ex As %Exception.AbstractException
    set status=$$$OK
    try {

        //前回の検索時刻より後の物だけ(分単位に検査する)
        /*
        select EventData,UserName ,{fn TIMESTAMPADD(SQL_TSI_HOUR,9,UTCTimeStamp)} from %SYS.Audit
        where Event='LoginFailure' And ({fn TIMESTAMPDIFF('SQL_TSI_MINUTE',{fn TIMESTAMPADD(SQL_TSI_HOUR,9,UTCTimeStamp)},?)}<0)
        */
        set sql="select EventData,UserName ,{fn TIMESTAMPADD(SQL_TSI_HOUR,9,UTCTimeStamp)} from %SYS.Audit"
        set sql=sql_" where Event='LoginFailure' And ({fn TIMESTAMPDIFF('SQL_TSI_MINUTE',{fn TIMESTAMPADD(SQL_TSI_HOUR,9,UTCTimeStamp)},?)}<=0)"
        //set ^isjdebug("sql")=sql_"-"_..AuditEventTC
        set stmt=##class(%SQL.Statement).%New()
        set st=stmt.%Prepare(sql)
        set rset=stmt.%Execute(..AuditEventTC)         //現在のタイムスタンプに再セット
        set ..AuditEventTC=$ZDATETIME($system.Util.UTCtoLocalWithZTIMEZONE($ZTIMESTAMP),3)
        //set ^isjdebug("TC")=..AuditEventTC
        while rset.%Next() {
            set message=rset.%Get("Username")_"のアクセスでエラーが発生"_$C(13,10)
            set message=message_rset.%Get("EventData")
            //set ^isjdebug("msg",$H)=message
            $$$THROWONERROR(ex,##class(%SYS.System).WriteToConsoleLog(message,1,2))
        }

    }
    catch ex {
        set status=ex.AsStatus()
    }
    return status
}

/// 必要に応じてオーバーライドしてください。
/// このメソッドはモニタクラスの初期化処理として実行されます。
/// 例のように、情報の抽出に必要な初期データがある場合この中でセットできます。
/// このメソッドの戻り値も%Statusが定義されています。$$$OKを戻すとモニタクラスが起動し、$$$OK以外を戻すとモニタクラスは動作しません
Method Initialize() As %Status
{
    //現在のタイムスタンプを取得($ZTIMESTAMPはUTCタイム)
    if ..AuditEventTC="" {
        set ..AuditEventTC=$ZDATETIME($system.Util.UTCtoLocalWithZTIMEZONE($ZTIMESTAMP),3)
    }
    Quit $$$OK
}

}

例の中では、メッセージログ(コンソールログ)に出力するため %SYS.SystemクラスWriteToConsoleLog()メソッドを使用しています。

<注意>

  1. Caché/Ensemble の場合、日本語が含まれるメッセージを出力すると文字化けしますので、英数字のみのメッセージを出力するようにしてください。
  2. IRIS/IRIS for Healthでは、日本語が含まれるメッセージをメッセージログ(messages.log)に出力できますが、メッセージログの中身を参照できる管理ポータルのメニュー(管理ポータル > システムオペレーション > システムログ > メッセージログ)では、化けて見えます。 メッセージログファイル(messages.log)を「BOM付きUTF8」で保存し直すことで、管理ポータルから日本語を参照できるようになります。 

また、アプリケーションモニタクラスの中では、定期的に動作するGetSample()メソッドの中で定期実行時に使用する情報をプロパティとして記録しておくことができます。
例では、プロパティ AuditEventTC を作成し、GetSample()を実行した時のタイムスタンプを記録しています。
(次回起動時に前回のタイムスタンプより新しい情報を抽出するために使用しています。)

AuditEventTCプロパティの初期値は、モニタクラスが開始するときに実行される Initialize()メソッドに記載しています。

 

2、作成した1のクラスを、システムモニタのアプリケーションモニタ有効化メニューで有効化する

%SYSネームスペースに接続したターミナルを用意し、%SYSMONMGRルーチンを起動し、1で作成したクラス(MyMetric.CheckTable)を有効化します。

%SYS>do ^%SYSMONMGR  // ルーチンを実行します。
1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit

Option? 5     // 5を入力
1) Set Sample Interval
2) Manage Monitor Classes
3) Change Default Notification Method
4) Manage Email Options
5) Manage Alerts
6) Exit

Option? 2   //2を入力
1) Activate/Deactivate Monitor Class
2) List Monitor Classes
3) Register Monitor System Classes
4) Remove/Purge Monitor Class
5) Set Class Sample Interval
6) Debug Monitor Classes
7) Exit

Option? 1 //1を入力
Class? ?   // ?を入力
 Num  MetricsClassName               Activated
  1)  %Monitor.System.HistoryMemory  N
  2)  %Monitor.System.HistoryPerf    N
  3)  %Monitor.System.HistorySys     N
  4)  %Monitor.System.HistoryUser    N
  5)  %Monitor.System.AuditCount     N
  6)  %Monitor.System.AuditEvents    N
  7)  %Monitor.System.Clients        N
  8)  %Monitor.System.Diskspace      N
  9)  %Monitor.System.Freespace      N
 10)  %Monitor.System.Globals        N
 11)  %Monitor.System.Journals       N
 12)  %Monitor.System.License        N
 13)  %Monitor.System.LockTable      N
 14)  %Monitor.System.Processes      N
 15)  %Monitor.System.Routines       N
 16)  %Monitor.System.Servers        N
 17)  %Monitor.System.CSPGateway     N
 18)  MyMetric.CheckTable            N

Class18 MyMetric.CheckTable   //18を入力
Activate class? Yes => Yes   // EnterまたはYesを入力
1) Activate/Deactivate Monitor Class
2) List Monitor Classes
3) Register Monitor System Classes
4) Remove/Purge Monitor Class
5) Set Class Sample Interval
6) Debug Monitor Classes
7) Exit

Option?

ターミナルはこのままの状態にします。

 

3、収集のインターバルを設定する(秒単位)
(先ほどの手順の続き)

1) Activate/Deactivate Monitor Class
2) List Monitor Classes
3) Register Monitor System Classes
4) Remove/Purge Monitor Class
5) Set Class Sample Interval
6) Debug Monitor Classes
7) Exit

Option? 5    // 5を入力
Class? ?  Num  MetricsClassName               Activated
  1)  %Monitor.System.HistoryMemory  N
  2)  %Monitor.System.HistoryPerf    N
  3)  %Monitor.System.HistorySys     N
  4)  %Monitor.System.HistoryUser    N
  5)  %Monitor.System.AuditCount     N
  6)  %Monitor.System.AuditEvents    N
  7)  %Monitor.System.Clients        N
  8)  %Monitor.System.Diskspace      N
  9)  %Monitor.System.Freespace      N
 10)  %Monitor.System.Globals        N
 11)  %Monitor.System.Journals       N
 12)  %Monitor.System.License        N
 13)  %Monitor.System.LockTable      N
 14)  %Monitor.System.Processes      N
 15)  %Monitor.System.Routines       N
 16)  %Monitor.System.Servers        N
 17)  %Monitor.System.CSPGateway     N
 18)  MyMetric.CheckTable            Y

Class18 MyMetric.CheckTable  // 18を入力
Class Sample Interval? 0 (Enter '-' to reset) => 10  // 10を入力(=10秒間隔で収集します)
1) Activate/Deactivate Monitor Class
2) List Monitor Classes
3) Register Monitor System Classes
4) Remove/Purge Monitor Class
5) Set Class Sample Interval
6) Debug Monitor Classes
7) Exit  

Option?   // Enterを入力
1) Set Sample Interval
2) Manage Monitor Classes
3) Change Default Notification Method
4) Manage Email Options
5) Manage Alerts
6) Exit

Option?  // Enterを入力
1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit

Option?

 

 4、システムモニタを再起動する

(先ほどの手順の続き)

1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit

Option? 1     // 1を入力
1) Start System Monitor
2) Stop System Monitor
3) Exit

Option? 2  // 2を入力
Stopping System Monitor... System Monitor stopped

1) Start System Monitor
2) Stop System Monitor
3) Exit

Option? 1    // 1を入力
Starting System Monitor... System Monitor started

1) Start System Monitor
2) Stop System Monitor
3) Exit

Option?      // Enterを入力
1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit

Option?    // Enterを入力
%SYS>

 

以上で手続き終了です。

テストとして、管理ポータルやターミナルにログインする際のユーザ名、パスワードを不正な状態で入力し、ログインを失敗させます(※1)。
しばらくたった後で、メッセージログ(コンソールログ)にログイン失敗時のメッセージが記録されていれば、成功です。

 メッセージログ(IRIS)は <インストールディレクトリ>\mgr\messages.log
 コンソールログ(Caché/Ensemble)は <インストールディレクトリ>\mgr\cconsole.log

をご参照ください。

メッセージ例

07/13/22-12:11:26:480 (1528) 2 [Utility.Event] abcdのアクセスでエラーが発生
エラーメッセージ:           エラー #798: パスワード 認証が失敗しました
エラー #838: ユーザ abcd が存在しません
CSPアプリケーション         /csp/sys
$I:                 |TCP|51774|1912
$P:                 |TCP|51774|1912

 

アプリケーションモニタを無効化する場合も、%SYSMONMGRルーチンを使用します(2の手続きとほぼ同様の手順です)。
モニタの状態を変えた場合は、必ずシステムモニタを再起動し、設定を反映させてください。

無効化手続きは以下の通りです。(MyMetric.CheckTableクラスを無効化する手続き)

%SYS>do ^%SYSMONMGR    // ルーチンを実行します。
 
1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit

Option? 5     // 5を入力
1) Set Sample Interval
2) Manage Monitor Classes
3) Change Default Notification Method
4) Manage Email Options
5) Manage Alerts
6) Exit

Option? 2   //2を入力
1) Activate/Deactivate Monitor Class
2) List Monitor Classes
3) Register Monitor System Classes
4) Remove/Purge Monitor Class
5) Set Class Sample Interval
6) Debug Monitor Classes
7) Exit

Option? 1 //1を入力
Class? ?   // ?を入力
 Num  MetricsClassName               Activated
  1)  %Monitor.System.HistoryMemory  N
  2)  %Monitor.System.HistoryPerf    N
  3)  %Monitor.System.HistorySys     N
  4)  %Monitor.System.HistoryUser    N
  5)  %Monitor.System.AuditCount     N
  6)  %Monitor.System.AuditEvents    N
  7)  %Monitor.System.Clients        N
  8)  %Monitor.System.Diskspace      N
  9)  %Monitor.System.Freespace      N
 10)  %Monitor.System.Globals        N
 11)  %Monitor.System.Journals       N
 12)  %Monitor.System.License        N
 13)  %Monitor.System.LockTable      N
 14)  %Monitor.System.Processes      N
 15)  %Monitor.System.Routines       N
 16)  %Monitor.System.Servers        N
 17)  %Monitor.System.CSPGateway     N
 18)  MyMetric.CheckTable            Y

Class18 MyMetric.CheckTable   //18を入力
Deactivate class? Yes => Yes   // EnterまたはYesを入力
1) Activate/Deactivate Monitor Class
2) List Monitor Classes
3) Register Monitor System Classes
4) Remove/Purge Monitor Class
5) Set Class Sample Interval
6) Debug Monitor Classes
7) Exit

Option?      // Enterを入力
1) Set Sample Interval
2) Manage Monitor Classes
3) Change Default Notification Method
4) Manage Email Options
5) Manage Alerts
6) Exit

Option?      // Enterを入力
1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit

Option? 1     //1を入力
1) Start System Monitor
2) Stop System Monitor
3) Exit

Option? 2     //2を入力
Stopping System Monitor... System Monitor stopped 

1) Start System Monitor
2) Stop System Monitor
3) Exit

Option?  1     //1を入力
Starting System Monitor... System Monitor started

1) Start System Monitor
2) Stop System Monitor
3) Exit

Option?      // Enterを入力
 
1) Start/Stop System Monitor
2) Set System Monitor Options
3) Configure System Monitor Classes
4) View System Monitor State
5) Manage Application Monitor
6) Manage Health Monitor
7) View System Data
8) Exit

Option?      // Enterを入力
%SYS>

以上で無効化手続きは終了です。

 


※1 インストール時に初期セキュリティの設定を「最小」とした場合、管理ポータル/ターミナル/スタジオ起動時、認証なしアクセスでログインします。 
 テストのため、ターミナルをパスワード認証に変更する方法をご説明します。

 

管理ポータル > システム管理 > セキュリティ > サービス を開き、Windowsの場合は %Service_Consoleサービス、Windows以外の場合は %Service_Terminal を開きます。

「許可された認証方法」以下にあるチェックボックスの中から、「パスワード」にチェックを追加し、保存ボタンをクリックすると、新しいプロセスからパスワード認証が有効になります。

テストを終え、元に戻す場合は、対象サービス名の設定から「パスワード」のチェックを外し、保存ボタンをクリックするだけで元に戻ります。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください