VLOG の監視(WATCH) V6R1編

監視(WATCH) には VLOG を監視する機能もあります。

ディスクのエラーなどは、まず最初に VLOG に徴候があがります。
そういったものをキャッチして、たとえば速めにディスクの交換を行ってしまう、というのもシステムを守る予防保守の観点からは大事なことですね。


監視の開始

STRWCH コマンドで WCHLICLOG オプションを指定して、監視を開始します。たとえば↓のようなかんじですね。

STRWCH SSNID(WCH_LICLOG) WCHPGM(APITEST/WCH_LICLOG) WCHLICLOG((3300 *ALL) (1000 *ALL))

監視状況の確認

監視状況は WRKWCH コマンドで確認できます。

↑の画面からオプション 5 で「表示」を行うと、何を監視しているかを確認することができます。

VLOG/LICLOG とは?

ちなみに VLOG/LICLOG って何? って人には。。

SST の「ライセンス内部コード・ログ」から

進んだ↓の画面で、「Major code」のところにカーソルを置いて F1 キーを押すと

↓のように「Major Code」という分類項目のリストが表示されます。

これを STRWCH コマンドの「メジャーコード」に指定します。

この記事の冒頭の例では 1000 と 3300 を指定していますが、それぞれ"Storage Management"、"DASD Support"を監視しているわけです。

プログラム例

シンプルに、受け取ったVLOG 情報をそのままデータベーステーブルに書き込んでいるだけのサンプルプログラムです。

      *
      *     CREATE TABLE APITEST/LICLOG
      *            (major        CHAR(10) NOT NULL WITH DEFAULT,
      *             minor        CHAR(10) NOT NULL WITH DEFAULT,
      *             logid        CHAR( 8) NOT NULL WITH DEFAULT,
      *             logtimestamp CHAR( 8) NOT NULL WITH DEFAULT,
      *             tdeno        CHAR( 8) NOT NULL WITH DEFAULT,
      *             taskno       CHAR(16) NOT NULL WITH DEFAULT,
      *             svrtype      CHAR(30) NOT NULL WITH DEFAULT,
      *             excpid       CHAR( 2) NOT NULL WITH DEFAULT,
      *             licjobname   CHAR(10) NOT NULL WITH DEFAULT,
      *             licjobuser   CHAR(10) NOT NULL WITH DEFAULT,
      *             licjobno     CHAR( 6) NOT NULL WITH DEFAULT,
      *             threadid     CHAR( 8) NOT NULL WITH DEFAULT,
      *             modcompile   CHAR( 8) NOT NULL WITH DEFAULT,
      *             ofsmod       CHAR( 8) NOT NULL WITH DEFAULT,
      *             modru        CHAR( 8) NOT NULL WITH DEFAULT,
      *             modname      CHAR(48) NOT NULL WITH DEFAULT,
      *             modentry     CHAR(128) NOT NULL WITH DEFAULT,
      *             ofscmpdata   DEC(10, 0),
      *             lencmpdata   DEC(10, 0),
      *             logcmpdata   CHAR(128) NOT NULL WITH DEFAULT,
      *             KEY_TIMESTAMP TIMESTAMP NOT NULL WITH DEFAULT)
      *
      *     CRTSQLRPGI OBJ(APITEST/WCH_LICLOG) SRCFILE(APITEST/QRPGLESRC)
      *                COMMIT(*NONE) DBGVIEW(*SOURCE)
      *
      *     STRWCH SSNID(WCH_LICLOG) WCHPGM(APITEST/WCH_LICLOG)
      *            WCHLICLOG((3300 *ALL) (1000 *ALL))
      *
      *     You can see this WCH working under QUSRWRK by WRKWCH *ALL
      *
     H DFTACTGRP(*NO)
      *
     D wch_liclog      PR
     D  type                         10
     D  session                      10
     D  error                        10
     D  data                               LIKEDS(DATA)
     D wch_liclog      PI
     D  pType                        10
     D  pSession                     10
     D  pError                       10
     D  pData                              LIKEDS(DATA)
      *
     D data            DS          1000    qualified
     D  major                         4    OVERLAY(data:5)
     D  minor                         4    OVERLAY(data:9)
     D  logid                         8    OVERLAY(data:13)
     D  logtimestamp                  8    OVERLAY(data:21)
     D  tdeno                         8    OVERLAY(data:29)
     D  taskno                       16    OVERLAY(data:37)
     D  svrtype                      30    OVERLAY(data:53)
     D  excpid                        2    OVERLAY(data:83)
     D  licjobname                   10    OVERLAY(data:85)
     D  licjobuser                   10    OVERLAY(data:95)
     D  licjobno                      6    OVERLAY(data:105)
     D  rsvd1                         4    OVERLAY(data:111)
     D  threadid                      8    OVERLAY(data:115)
     D  modcompile                    8    OVERLAY(data:123)
     D  ofsmod                        8    OVERLAY(data:131)
     D  modru                         8    OVERLAY(data:139)
     D  modname                      48    OVERLAY(data:147)
     D  modentry                    128    OVERLAY(data:195)
     D  hascmpdata                    1    OVERLAY(data:323)
     D  rsvd2                         1    OVERLAY(data:324)
     D  ofscmpdata                   10i 0 OVERLAY(data:325)
     D  lencmpdata                   10i 0 OVERLAY(data:329)
     D  cmpagainst                   10    OVERLAY(data:333)
      *
     D pCmpData        S               *
     D cmpdata         S             75    based(pCmpData)
      *
     D APIErr          DS                  qualified
     D  ErrSize                      10i 0 inz(%size(APIErr))
     D  Errlen                       10i 0 inz(0)
     D  ErrID                         7a
     D  rsvd                          1a
     D  ErrData                   32767a
      *
      /free

       // if (%trimR(pType) = '*LICLOG' and pData.major = 'XXXX');
          if (%trimR(pType) = '*LICLOG') ;

              pCmpData = %addr(pData) + pData.ofscmpdata ;

              exec SQL
                   INSERT INTO APITEST/LICLOG
                     VALUES(
                           :pData.major,
                           :pData.minor,
                           :pData.logid,
                           :pData.logtimestamp,
                           :pData.tdeno,
                           :pData.taskno,
                           :pData.svrtype,
                           :pData.excpid,
                           :pData.licjobname,
                           :pData.licjobuser,
                           :pData.licjobno,
                           :pData.threadid,
                           :pData.modcompile,
                           :pData.ofsmod,
                           :pData.modru,
                           :pData.modname,
                           :pData.modentry,
                           :pData.ofscmpdata,
                           :pData.lencmpdata,
                           :cmpdata,
                           CURRENT_TIMESTAMP
                          ) ;

              pError = *blanks;

          endif;

          *inLR = *on;
          return;

      /end-free

プログラムの変更と監視コードの追加

さらに「メジャーコード」を追加してみました。(何に該当するかは↑のリストから探してみてください)

プログラム例

上記のサンプルプログラムに、VLOG 情報が追加された際に特定のメッセージ待ち行列にメッセージを送信する、という機能を追加しました。

      *                                                                                             
      *     CREATE TABLE APITEST/LICLOG                                                             
      *            (major        CHAR(10) NOT NULL WITH DEFAULT,                                    
      *             minor        CHAR(10) NOT NULL WITH DEFAULT,                                    
      *             logid        CHAR( 8) NOT NULL WITH DEFAULT,                                    
      *             logtimestamp CHAR( 8) NOT NULL WITH DEFAULT,                                    
      *             tdeno        CHAR( 8) NOT NULL WITH DEFAULT,                                    
      *             taskno       CHAR(16) NOT NULL WITH DEFAULT,                                    
      *             svrtype      CHAR(30) NOT NULL WITH DEFAULT,                                    
      *             excpid       CHAR( 2) NOT NULL WITH DEFAULT,                                    
      *             licjobname   CHAR(10) NOT NULL WITH DEFAULT,                                    
      *             licjobuser   CHAR(10) NOT NULL WITH DEFAULT,                                    
      *             licjobno     CHAR( 6) NOT NULL WITH DEFAULT,                                    
      *             threadid     CHAR( 8) NOT NULL WITH DEFAULT,                                    
      *             modcompile   CHAR( 8) NOT NULL WITH DEFAULT,                                    
      *             ofsmod       CHAR( 8) NOT NULL WITH DEFAULT,                                    
      *             modru        CHAR( 8) NOT NULL WITH DEFAULT,                                    
      *             modname      CHAR(48) NOT NULL WITH DEFAULT,                                    
      *             modentry     CHAR(128) NOT NULL WITH DEFAULT,                                   
      *             ofscmpdata   DEC(10, 0),                                                        
      *             lencmpdata   DEC(10, 0),                                                        
      *             logcmpdata   CHAR(128) NOT NULL WITH DEFAULT,                                   
      *             KEY_TIMESTAMP TIMESTAMP NOT NULL WITH DEFAULT)                                  
      *                                                                                             
      *     CRTMSGQ MSGQ(APITEST/LICLOGMSGQ)                           
      *                                                                                             
      *     CRTSQLRPGI OBJ(APITEST/WCH_LICLOG) SRCFILE(APITEST/QRPGLESRC)                           
      *                COMMIT(*NONE) DBGVIEW(*SOURCE)                                               
      *                                                                                             
      *     STRWCH SSNID(WCH_LICLOG) WCHPGM(APITEST/WCH_LICLOG)                                     
      *            WCHLICLOG((3300 *ALL) (1000 *ALL))                                               
      *                                                                                             
      *     You can see this WCH working under QUSRWRK by WRKWCH *ALL                               
      *                                                                                             
     H DFTACTGRP(*NO)                                                                               
      *                                                                                             
     D wch_vlog2       PR                                                                           
     D  type                         10                                                             
     D  session                      10                                                             
     D  error                        10                                                             
     D  data                               LIKEDS(DATA)                                             
     D wch_vlog2       PI                                                                           
     D  pType                        10                                                             
     D  pSession                     10                                                             
     D  pError                       10                                                             
     D  pData                              LIKEDS(DATA)                                             
      *                                                                                             
     D data            DS          1000    qualified                                                
     D  major                         4    OVERLAY(data:5)                                          
     D  minor                         4    OVERLAY(data:9)                                          
     D  logid                         8    OVERLAY(data:13)                                         
     D  logtimestamp                  8    OVERLAY(data:21)                                         
     D  tdeno                         8    OVERLAY(data:29)                                         
     D  taskno                       16    OVERLAY(data:37)                                         
     D  svrtype                      30    OVERLAY(data:53)                                         
     D  excpid                        2    OVERLAY(data:83)                                         
     D  licjobname                   10    OVERLAY(data:85)                                         
     D  licjobuser                   10    OVERLAY(data:95)                                         
     D  licjobno                      6    OVERLAY(data:105)                                        
     D  rsvd1                         4    OVERLAY(data:111)                                        
     D  threadid                      8    OVERLAY(data:115)                                        
     D  modcompile                    8    OVERLAY(data:123)                                        
     D  ofsmod                        8    OVERLAY(data:131)                                        
     D  modru                         8    OVERLAY(data:139)                                        
     D  modname                      48    OVERLAY(data:147)                                        
     D  modentry                    128    OVERLAY(data:195)                                        
     D  hascmpdata                    1    OVERLAY(data:323)                                        
     D  rsvd2                         1    OVERLAY(data:324)                                        
     D  ofscmpdata                   10i 0 OVERLAY(data:325)                                        
     D  lencmpdata                   10i 0 OVERLAY(data:329)                                        
     D  cmpagainst                   10    OVERLAY(data:333)                                        
      *                                                                                             
     D pCmpData        S               *                                                            
     D cmpdata         S             75    based(pCmpData)                                          
      *                                                                                             
     D APIErr          DS                  qualified                                                
     D  ErrSize                      10i 0 inz(%size(APIErr))                                       
     D  Errlen                       10i 0 inz(0)                                                   
     D  ErrID                         7a                                                            
     D  rsvd                          1a                                                            
     D  ErrData                   32767a                                                            
      *                                                                                             
     D SndUsrMsg       PR                  ExtPgm('QMHSNDM')                                        
     D   MsgID                        7A   const                                                    
     D   QualMsgF                    20A   const                                                    
     D   MsgTxt                   32767A   const options(*varsize)                                  
     D   MsgTxtLen                   10I 0 const                                                    
     D   MsgType                     10A   const                                                    
     D   MsgQueues                   20A   const dim(50) options(*varsize)                          
     D   NumQueues                   10I 0 const                                                    
     D   RpyQueue                    20A   const                                                    
     D   MsgKey                       4A                                                            
     D   ErrorCode                         like(APIErr)                                             
     D   CCSID                       10I 0 const options(*nopass)                                   
      *                                                                                             
     D Message         s            100A   varying                                                  
     D MsgKey          s              4A                                                            
     D UsrMsgQ         s             20A   dim(1) inz('*SYSOPR')                                    
      *                                                                                             
      /free                                                                                         
                                                                                                    
       // if (%trimR(pType) = '*LICLOG' and pData.major = 'XXXX');                                  
          if (%trimR(pType) = '*LICLOG') ;                                                          
                                                                                                    
              pCmpData = %addr(pData) + pData.ofscmpdata ;                                          
                                                                                                    
              exec SQL                                                                              
                   INSERT INTO APITEST/LICLOG                                                       
                     VALUES(                                                                        
                           :pData.major,                                                            
                           :pData.minor,                                                            
                           :pData.logid,                                                            
                           :pData.logtimestamp,                                                     
                           :pData.tdeno,                                                            
                           :pData.taskno,                                                           
                           :pData.svrtype,                                                          
                           :pData.excpid,                                                           
                           :pData.licjobname,                                                       
                           :pData.licjobuser,                                                       
                           :pData.licjobno,                                                         
                           :pData.threadid,                                                         
                           :pData.modcompile,                                                       
                           :pData.ofsmod,                                                           
                           :pData.modru,                                                            
                           :pData.modname,                                                          
                           :pData.modentry,                                                         
                           :pData.ofscmpdata,                                                       
                           :pData.lencmpdata,                                                       
                           :cmpdata,                                                                
                           CURRENT_TIMESTAMP                                                        
                          ) ;                                                                       
                                                                                                    
             Message = 'VLOG is created.';                                                          
             UsrMsgQ = 'LICLOGMSGQAPITEST   ';                                                      
                                                                                                    
             SndUsrMsg( *blanks                                                                     
                      : *blanks                                                                     
                      : Message                                                                     
                      : %len(Message)                                                               
                      : '*INFO'                                                                     
                      : UsrMsgQ                                                                     
                      : %elem(UsrMsgQ)                                                              
                      : *blanks                                                                     
                      : MsgKey                                                                      
                   : APIErr );                                                                      
                                                                                                    
              pError = *blanks;                                                                     
                                                                                                    
          endif;                                                                                    
                                                                                                    
          *inLR = *on;                                                                              
          return;                                                                                   
                                                                                                    
      /end-free                                                                      

実行例

↑のプログラムで監視を行うと、監視対象のVLOG が発生すると同時に↓のメッセージが送信されます。

送信元を見てみると、やはり V5R4の時とは違ってシステムジョブ (QSCWCHPS) が監視を行っていることがわかります。
対象がジョブログでも VLOGでも、同じ名前のジョブが統一的に監視を行っているようですね。

テーブルに書き込まれる情報はこんな↓かんじです。

[Top Pageに戻る]

Ads by TOK2