如何檢查 Job Log ? (Command CHKJOBLOG 利用 QMHLJOBL List Job Log API)
有時候系統本身的 System Job (以 Q 開頭的 Job)會寫某些通知性質的訊息至 Job Log, 但
並未將該訊息寫至 QSYSOPR message queue 或 System Log, 所以有時候系統管理人員並無法
得知需要的訊息, 如有可能需要知道誰透過ODBC, OLEDB 或 JDBC 連線進入系統, 要取
得這些資訊可以藉由 Exit Program 或利用 檢查 Job log 的方式. 這裡我僅利用檢查 Job log
的方式完成檢查 MSGID CPIAD02.
File : QRPGLESRC
Member: CHKJOBLOGR
Type : RPGLE
Usage : CRTBNDRPG CHKJOBLOGR
OS version : V5R1(but also can modify to V4R5 earlier for
%LOOKUP bulid-in function to LOOKUP opcode)
H DFTACTGRP(*NO) ACTGRP(*CALLER) BNDDIR('QC2LE') EXPROPTS(*RESDECPOS)
H DATFMT(*ISO) TIMFMT(*ISO) OPTION(*NODEBUGIO) DEBUG
*----------------------------------------------------------------
* CHKJOBLOG Check specified job's job log
* Copyright (C) 10/02/2002 Vengoal Chang
* This program is free software, you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation.
*
*----------------------------------------------------------------
* This program retrieve specified job job's log and send all log
* to QSYSOPR message queue, you could modify for checking message
* type or message id to archive yourself purpose.
*----------------------------------------------------------------
* api (application program interfaces) used:
* quscrtus create user space
* qusptrus retrieve pointer to user space
* qmhljobl list job log messages
* qmhsndm send non-program messages
*----------------------------------------------------------------
D uSpaceName s 20 inz('CHKJOBLOG QTEMP ')
D msgtxt s 256
D QUSLIB s 10
D MsgIdDs Ds
D MsgIdEntSize 4B 0
D MsgIdEntStr 7 Dim( 20 )
*Array for contain MsgIdStr
D MsgIdAry S 10 Dim( 20 )
D Inz( *HiVal ) Ascend
D Idx S 2 0
D AryIdx S 2 0
D iMsgId S 7
* -------------------------------------------------------------------
* - User space attributes data structure -
* -------------------------------------------------------------------
D QUSAttr DS
D QUSNumRec 10I 0 Inz( 1 )
D QUSKey 10I 0 Inz( 3 )
D QUSRecLen 10I 0 Inz( 1 )
D QUSRecData 1A Inz( '1' )
*----------------------------------------------------------------
D struct DS
D msgdln 10I 0
D msgq# 10I 0
D msgkey 4
D msgq 20 INZ('QSYSOPR *LIBL ')
*
*----------------------------------------------------------------
* Get user space list info from header section.
*----------------------------------------------------------------
D ds based(uHeadPtr)
D uOffSetToList 125 128i 0
D uNumOfEntrys 133 136i 0
D uSizeOfEntry 137 140i 0
*
D uListEntry1 ds Based(uListPtr )
D uOffsetToNext 10i 0 overlay(uListEntry1:1)
D uOffsetToFlds 10i 0 overlay(uListEntry1:5)
D uNumFldsRetrnd 10i 0 overlay(uListEntry1:9)
D uMsgSeverity 10i 0 overlay(uListEntry1:12)
D uMsgId 7a overlay(uListEntry1:17)
D uMsgType 2a overlay(uListEntry1:24)
D uMsgKey 4a overlay(uListEntry1:26)
D uMsgFile 20a overlay(uListEntry1:30)
D uMsgFileName 10a overlay(uListEntry1:30)
D uMsgFileLib 10a overlay(uListEntry1:40)
* these fields repeat for each key selected.
D uListEntry2 ds Based(uListPtr2)
D u2OffsetToNext 10i 0
D u2LengthOfFlds 10i 0
D u2IdentifierF 10i 0
D u2TypeOfData 1a
D u2StatOfData 1a
D u2Reserved 14a
D u2LengthOfData 10i 0
D u2Data 500
*----------------------------------------------------------------
* Error return code parm for APIs.
*----------------------------------------------------------------
D vApiErrDs ds
D vbytpv 10i 0 inz(%size(vApiErrDs))
D vbytav 10i 0 inz(0)
D vmsgid 7a
D vresvd 1a
D vrpldta 50a
*
*----------------------------------------------------------------
* Message selection data structure.
*
* Retrieve JOB Log direction
*-----------------------------|-------------|--------------------
* Parameter | From Top | From Bottom
*-----------------------------|-------------|--------------------
* msListDirection | *NEXT | *PRV
* msStartingMessageKey | X'00000000' | X'FFFFFFFF'
*----------------------------------------------------------------
D MsgSelectDS ds
D msMaxMsgRequested...
D 10i 0 inz(-1) overlay(msgSelectDS:1) num of msg requested
D msListDirection...
D 10a inz('*NEXT') overlay(msgSelectDS:5) List direction
D msQualifiedJobName...
D 10a inz('*') overlay(msgSelectDS:15) * = current job
D msQualifiedUserName...
D 10a inz(' ') overlay(msgSelectDS:25) = current job
D msQualifiedJobNumber...
D 6a inz(' ') overlay(msgSelectDS:35) = current job
D msInternalJobIdentifier...
D 16a inz(' ') overlay(msgSelectDS:41) = current job
D msStartingMessageKey...
D 4a inz(x'00000000') start newest message
D overlay(msgselectDS:57)
D msMaxMsgLength...
D 10i 0 inz(500) overlay(msgSelectDS:61) id 301,302 lengths
D msMaxMsgHelpLength...
D 10i 0 inz(100) overlay(msgSelectDS:65) id 401,402,403,404
D msOffsetToIdentifiersOfFieldstoReturn...
D 10i 0 inz(84) overlay(msgSelectDS:69) to start of array
D msNumberOfFieldsToReturn...
D 10i 0 inz(1) overlay(msgSelectDS:73)
D msOffsetToCallMsgQname...
D 10i 0 inz(88) overlay(msgSelectDS:77)
D msLengthOfCallMsgQname...
D 10i 0 inz(1) overlay(msgSelectDS:81)
D msIndentifiersOfFieldsToReturn...
D 10i 0 inz(0302) overlay(msgSelectDS:85)
D msCallMessageQueueName...
D 1a inz('*') overlay(msgSelectDS:89)
*----------------------------------------------------------------
* Create Prototypes for calls
* --------------------------------------------------------------------
* - QusCrtUs - Create User Space API -
* - -
* - Usage Length Type Parameter Description -
* - -
* - Input 20 Character Qualified user space name -
* - Input 10 Character Extended attribute -
* - Input 4 0 Binary Initial size -
* - Input 1 Character Initial value -
* - Input 10 Character Public authority -
* - Input 50 Character Text description -
* --------------------------------------------------------------------
D quscrtus PR ExtPgm('QUSCRTUS')
D 20
D 10 const
D 10i 0 const
D 1 const
D 10 const
D 50 const
D 10 const
Db like(vApiErrDS)
* -------------------------------------------------------------------
* - Qusptrus - Get user space pointer API -
* - -
* - Usage Length Type Parameter Description -
* - -
* - Input 20 Character Qualified user space name -
* - Output * Pointer UserSpace Pointer -
* - Output Error Code -
* - -----------------------------------------------------------------
D qusptrus PR ExtPgm('QUSPTRUS') retrieve pointer
D 20 Space Name
D * pointer
Db like(vApiErrDS) error parm
* -------------------------------------------------------------------
* - Quscusat - Change User Space Attributes API -
* - -
* - Usage Length Type Parameter Description -
* - -
* - Output 10 Character Returned library -
* - Input 20 Character Qualified user space name -
* - Input 13 Character Attribute structure -
* - Output Error code -
* -------------------------------------------------------------------
D quscusat PR ExtPgm( 'QUSCUSAT' )
D 10A Const
D 20A Const
D 13A Const
Db like(vApiErrDS)
* ---------------------------------------------------------------
D system PR 10I 0 extproc('system')
D i_cmd * value options(*string)
*
D EXCP_MSGID S 7A import('_EXCP_MSGID')
* --------------------------------------------------------------
D qmhljobl PR ExtPgm('QMHLJOBL ')
D 20
D 8 const
Db like(MsgSelectDS)
D 10i 0 const
D 8 const
Db like(vApiErrDS)
* --------------------------------------------------------------
D qmhsndm PR ExtPgm('QMHSNDM')
D msgid 7 const
D msgfil 20 const
D msgtxt 256 const
D msglen 10i 0 const
D msgtype 10 const
D msgq 10 const
D msgq# 10i 0 const
D rpymq 20 const
D msgkey 4 const
Db like(vApiErrDS)
* --------------------------------------------------------------
D main PR extpgm('MONJOBLOGR')
D jobname 10
D jobuser 10
D jobnumber 6
Db like(MsgIdDs)
D tomsgq 20
D main PI
D jobname 10
D jobuser 10
D jobnumber 6
D msgIdDsinput like(MsgIdDs)
D tomsgq 20
*----------------------------------------------------------------
C eval msQualifiedJobName = jobname
C eval msQualifiedUserName = jobuser
C eval msQualifiedJobNumber = jobnumber
C eval msgIdDs = msgIdDsInput
C eval msgq = tomsgq
C Eval Idx = 0
C Eval AryIdx = 0
C DoW Idx < MsgIdEntSize
C Eval Idx = Idx + 1
C Eval iMsgId = MsgIdEntStr(Idx)
* only show msgid once
* regardless of number times used.
C If AryIdx = 0 or
C %lookup(iMsgId:MsgIdAry:1:AryIdx) = 0
C Eval AryIdx = AryIdx + 1
C Eval MsgIdAry(AryIdx) = MsgIdEntStr( Idx )
C EndIf
C EndDo
*----------------------------------------------------------------
* Create user space
C callp QUSCRTUS(
C uSpaceName:
C 'TEST':
C 1500000:
C x'00':
C '*ALL':
C 'User Space CHKJOBLOG' :
C '*NO':
C vApiErrDs)
* set UserSpace to autoextended
C CallP QUSCUSAT( QUSLib :
C uSpaceName :
C QUSAttr :
C vApiErrDs )
* Get pointer to user space
C callp QUSPTRUS(
C uSpaceName:
C uHeadPtr:
C vApiErrDs)
* call api to load job log into user space.
C callp QMHLJOBL(
C uSpaceName:
C 'LJOB0100':
C MsgSelectDS:
C %len(MsgSelectDS):
C 'JSLT0100':
C vApiErrDs)
* Process elements
*
C eval uListPtr = uHeadPtr + uOffSetToList
1B C do uNumOfEntrys
C If %lookup('*ALL ':MsgIdAry:1:AryIdx) > 0 or
C %lookup(uMsgId :MsgIdAry:1:AryIdx) > 0
C eval uListPtr2 = uHeadPtr + uOffsetToFlds
C eval msgtxt = 'Job log: ' +
C %trim(jobnumber) + '/' +
C %trim(jobuser) + '/' +
C %trim(jobname) + ' ' +
C uMsgId + ': ' +
C %subst(u2Data:1:U2LengthOfData)
C CALLP QMHSNDM(
C ' ' :
C ' ' :
C %trim(msgtxt) :
C %len(%trim(msgtxt)) :
C '*INFO ' :
C msgq :
C 1 :
C ' ' :
C ' ' :
C vApiErrDs)
C EndIf
C eval uListPtr = uHeadPtr + uOffsetToNext
1E C enddo
C eval *inlr = *on
C return
File : QCMDSRC
Member: CHKJOBLOG
Type : CMD
Usage : CRTCMD CMD(CHKJOBLOG) PGM(CHKJOBLOGR)
/********************************************************************/
/* Title: CHKJOBLOG: Check jobs log */
/* */
/* Description - This command performs job log checked by MSGID */
/* */
/* The Create Command command should include the following: */
/* */
/* CRTCMD CMD(CHKJOBLOG) PGM(CHKJOBLOGR) */
/* */
/********************************************************************/
/*------------------------------------------------*/
/* Command Definition */
/*------------------------------------------------*/
CMD PROMPT('Check Job Log')
PARM KWD(JOB) TYPE(*SNAME) LEN(10) MIN(1) +
PROMPT('Job name')
PARM KWD(USER) TYPE(*SNAME) LEN(10) MIN(1) +
PROMPT('User name')
PARM KWD(JOBNBR) TYPE(*CHAR) LEN(6) RANGE(000000 +
999999) MIN(1) PROMPT('Job number')
PARM KWD(MSGID) TYPE(*CHAR) LEN(7) SPCVAL((*ALL)) +
MIN(1) MAX(20) PROMPT('Message ID to be +
checked')
PARM KWD(TOMSGQ) TYPE(MSGQ) +
PROMPT('Send log to message queue')
MSGQ: QUAL TYPE(*NAME) LEN(10) DFT(QSYSOPR) +
SPCVAL((QSYSOPR)) EXPR(*YES)
QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) +
SPCVAL((*LIBL) (*CURLIB)) EXPR(*YES) +
PROMPT(Library)
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期四, 11月 02, 2023
2002-10-16 如何檢查 Job Log ? (Command CHKJOBLOG 利用 QMHLJOBL List Job Log API)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言