在 AIX 错误日志和 BSD 系统日志中记录有关故障信息或值得注意的情况的信息。
/usr/sbin/rsct/bin/fclogerr { -e event -t error_template_label -i error_template_headerfile -r resource -s source_filename -p line_of_code_pos -v sidlevel -l lpp_name -a assoc_fid { [ -d detail_data_item[,detail_data_item,...] -x detail_data_type[,detail_data_type,...] -y detail_data_len[,detail_data_len,...] ] | [ -f detail_data_file] } -b BSD_syslog_message_text } | -h
任何一个脚本程序使用该接口,用来在 AIX 错误日志和 BSD 系统日志中记录信息。写入该设备的信息,是用于系统管理员或操作员去确定系统上已发生了哪些需要关注的故障情况或其它值得注意的情况。AIX 错误日志和 BSD 系统日志的用途是记录有关某种情况的足够信息,以便从报告中确定该情况的性质、影响和响应,而不需要重新生成这种情况去检测发生了什么情况,在哪里发生的。如果任何软件遇到了需要直接干预才能消除的永久性故障情况,或者是遇到了需要引起系统管理员注意的情况,则应该使用 fclogerr 在 AIX 错误日志和 BSD 系统日志中记录该信息。
脚本程序应在使用 fclogerr 之前,通过直接创建或继承,建立一个基本的 FFDC 环境或一个 FFDC 错误堆栈环境。即使没有建立这些环境,fclogerr 也可在 AIX 错误日志和 BSD 系统日志中记录信息,但接口不能生成一个 FFDC 故障标识符,除非存在这些环境之一。
设计用来使用 FFDC 错误堆栈的进程也可以使用 fclogerr 接口,而且当进程遇到需要管理员注意或干预解决的情况时,也应使用它。
为确保正确识别发生的情况以及发生的位置,FFDC 策略建议应在脚本源代码模块中内联调用 fclogerr,并且一旦检测到情况发生时就调用。fclogerr 将记录源代码文件名和代码信息行,以帮助识别和定位遇到此情况的源代码。如果必要的话,fclogerr 能被一个子例程或自动加载的例程所调用来记录这些信息,这是在假设外部例程可以获得所有的位置信息以及必要的详细故障信息的情况下。外部的记录例程必须要记录下检测到的情况的真实位置。
虽然 fclogerr 可在 AIX 错误日志和 BSD 系统日志中记录信息,还必须给这个接口提供不同的选项以用于每一种记录设备。记录在 AIX 错误日志中的数据详细信息也不会记录在 BSD 系统日志中;BSD 系统日志信息是通过不同的命令选项提供的。这可能要求 fclogerr 的用户在该调用中复制一些信息。
该选项可以给出一个以上的数据项。 每一个数据项必须用逗号(,)分隔,中间不能有空格。如果在一个数据项中有空格字符,则该数据项必须用双引号(“”)括起来。数据项自身不能包含逗号(,),因为该命令将把命令解释为一个域分隔符。
该选项 必须 与 -x 选项和 -y 选项一起使用。
如果给出了 -d 选项,则必须给出此选项。
如果给出了 -d 选项,就必须给出此选项。
fclogerr 在成功结束时,返回下列退出状态码:
在 AIX 以外的其它 UNIX 平台上,当发生一个故障时,fclogerr 返回下列的退出状态码:
当给 fclogerr 提供了不完整的信息时,它将用缺省信息去代替缺少的信息,并试图在 FFDC 错误堆栈上产生一个记录。在这些情况下,将产生警告,并且生成警告信息,除非指定了 -q 选项。当检测到多于一个的警告情况时,该命令将返回一个退出状态码,该代码表示了该命令所认为的最严重情况。当检测到警告情况时,fclogerr 将返回下列退出状态代码:
例如,一个 Korn shell 脚本试图访问某个文件中的配置信息。如果访问没有成功,则脚本程序将使用下列模板源代码,在 AIX 错误日志中记录一个故障:
*! mymesgcat.cat + SP_FFDCEXMPL_ER: + SP_FFDCEXMPL_ER: Comment = "Configuration Failed - Exiting" Class = S Log = true Report = true Alert = false Err_Type = PERM Err_Desc = {3, 10, "CONFIGURATION FAILURE - EXITING"} Prob_Causes = E89B User_Causes = E811 User_Actions = 1056 Fail_Causes = E906, E915, F072, 108E Fail_Actions = {5, 14, "VERIFY USER HAS CORRECT PERMISSIONS TO ACCESS FILE"}, {5, 15, "VERIFY CONFIGURATION FILE"} Detail_Data = 46, 00A2, ALPHA Detail_Data = 42, EB2B, ALPHA Detail_Data = 42, 0030, ALPHA Detail_Data = 16, EB00, ALPHA Detail_Data = 16, 0027, ALPHA Detail_Data = 4, 8183, DEC Detail_Data = 4, 8015, DEC Detail_Data = 60, 8172, ALPHA
该定义产生了下列的 AIX 错误日志模板:
LABEL: ERRID_SP_FFDCEXMPL_ER IDENTIFIER: Date/Time: Sequence Number: Machine Id: Node Id: Class: S Type: PERM Resource Name: < 由 -r 选项填充到 fclogerr> Description CONFIGURATION FAILURE - EXITING Probable Causes COULD NOT ACCESS CONFIGURATION FILE User Causes USER CORRUPTED THE CONFIGRATION DATABASE OR METHOD Recommended Actions RE-CREATE FILE Failure Causes COULD NOT ACCESS CONFIGURATION FILE PERMISSIONS ERROR ACCESSING CONFIGURATION DATABASE FILE READ ERROR FILE IS CORRUPT Recommended Actions VERIFY USER HAS CORRECT PERMISSIONS TO ACCESS FILE VERIFY CONFIGURATION FILE Detail Data DETECTING MODULE <由 fclogerr 选项填充> ERROR ID <由 fclogerr 创建的 FFDC 故障标识符> REFERENCE CODE <到 fclogerr 的 -a 选项值 FILE NAME <必须作为 -d 选项列表的一部分提供给 fclogerr> FUNCTION <必须作为 -d 选项列表的一部分提供给 fclogerr> RETURN CODE<“必须”作为 fclogerr 的 -d 选项列表的一部分提供> ERROR CODE AS DEFINED IN sys/errno.h <必须作为 -d 选项列表的一部分提供给 fclogerr> USER ID< 必须作为 -d 选项列表的一部分提供给 fclogerr>
前三个“细节数据字段”由 fclogerr 例程根据参数中传递的信息来构造。其余的“详细数据”必须用 -d 选项提供,且提供的数据类型必须由 -x 选项指出。以下示例源代码段演示了这是如何实现的,以及如何调用 fclogerr 命令将信息记录在“AIX 错误日志”和“BSD 系统日志”中。
typeset CONFIG_FNAME typeset INBUF typeset MINUSDOPTS typeset MINUSXOPTS typeset MINUSYOPTS typeset FID integer MYCLIENT integer RC : MYCLIENT=$$ CONFIG_FNAME="/configfile.bin" exec 3< $CONFIG_FNAME : read -u3 INBUF RC=$? if ((RC != 0)) then # Create Detail Data Memory Block for AIX Error Log Template # Need to know the EXACT structure of the Template to do this correctly. # Field 1 - filled in by fc_log_error # Field 2 - filled in by fc_log_error # Field 3 - filled in by fc_log_error # Field 4 - name of configuration file being used - 16 bytes # Field 5 - name of function call that failed - 16 bytes # Field 6 - return code from failing function - 4 byte integer # Field 7 - errno from failing function call (unused) - 4 byte integer # Field 8 - user ID using this software - remaining space (62 bytes) # This source code supplied fields 4 through 8 in the "-d" option, and # describes the data types for each in the "-x" option. MINUSDOPTS=$CONFIG_FNAME MINUSXOPTS="ALPHA" MINUSYOPTS="16" MINUSDOPTS="$MINUSDOPTS,read" MINUSDOPTS="$MINUSDOPTS,configdabeast" MINUSXOPTS="$MINUSXOPTS,ALPHA" MINUSYOPTS="$MINUSYOPTS,16" MINUSXOPTS="$MINUSXOPTS,DEC" MINUSYOPTS="$MINUSYOPTS,4" MINUSDOPTS="$MINUSDOPTS,$MYCLIENT" MINUSYOPTS="$MINUSYOPTS,4" MINUSDOPTS="$MINUSDOPTS,0" MINUSXOPTS="$MINUSXOPTS,DEC" MINUSYOPTS="$MINUSYOPTS,4" MINUSDOPTS="$MINUSDOPTS,$MYCLIENT" MINUSXOPTS="$MINUSXOPTS,DEC" MINUSXOPTS="$MINUSXOPTS,DEC" MINUSYOPTS="$MINUSYOPTS,4" MINUSYOPTS="$MINUSYOPTS,60" FID=$(fclogerr -e FFDC_ERROR -t ERRID_SP_FFDCEXMPL_ER -i /usr/lpp/ssp/inc/ myprog.h -r myprog -s myprog.ksh -p $LINEPOS -v "1.1" -l PSSP -d $MINUSDOPTS -x $MINUSXOPTS -y $MINUSYOPTS -b "myprog Configuration Failure - Exiting") RC=$? if ((RC == 0)) then fcdispfid $FID return 1 else : fi fi
现在使用同样的 AIX 错误日志模板,考虑一下上面示例的一点变化,这一次使用一个外部命令去获取某个文件中的配置信息,该文件由源代码提供。该命令如果遇到了任何故障情况,则以非零的退出状态值退出,并在标准输出上显示一个 FFDC 故障标识符。另外,要演示在 -d 列表中使用双引号的情况,配置文件在名字中要有一个嵌入的空格:
typeset CONFIG_FNAME typeset INBUF typeset MINUSDOPTS typeset MINUSXOPTS typeset MINUSYOPTS typeset FID typeset OUTPUT integer MYCLIENT integer RC : MYCLIENT=$$ CONFIG_FNAME="This is a test" OUTPUT=$(configdabeast $CONFIG_FNAME) RC=$? if ((RC != 0)) then # Create Detail Data Memory Block for AIX Error Log Template # Need to know the EXACT structure of the Template to do this correctly. # Field 1 - filled in by fc_log_error # Field 2 - filled in by fc_log_error # Field 3 - filled in by fc_log_error # Field 4 - name of configuration file being used - 16 bytes # Field 5 - name of function call that failed - 16 bytes # Field 6 - return code from failing function - 4 byte integer # Field 7 - errno from failing function call (unused) - 4 byte integer # Field 8 - user ID using this software - remaining space (62 bytes) # This source code supplied fields 4 through 8 in the "-d" option, and # describes the data types for each in the "-x" option. MINUSDOPTS="\""$CONFIG_FNAME"\"" MINUSXOPTS="ALPHA" MINUSYOPTS="16" MINUSYOPTS="16" MINUSDOPTS="$MINUSDOPTS,configdabeast" MINUSXOPTS="$MINUSXOPTS,ALPHA" MINUSYOPTS="$MINUSYOPTS,16" MINUSXOPTS="$MINUSXOPTS,DEC" MINUSYOPTS="$MINUSYOPTS,4" MINUSDOPTS="$MINUSDOPTS,$MYCLIENT" MINUSYOPTS="$MINUSYOPTS,4" MINUSDOPTS="$MINUSDOPTS,0" MINUSXOPTS="$MINUSXOPTS,DEC" MINUSYOPTS="$MINUSYOPTS,4" MINUSDOPTS="$MINUSDOPTS,$MYCLIENT" MINUSXOPTS="$MINUSXOPTS,DEC" MINUSXOPTS="$MINUSXOPTS,DEC" MINUSYOPTS="$MINUSYOPTS,4" MINUSYOPTS="$MINUSYOPTS,60" FID=$(fclogerr -e FFDC_ERROR -t ERRID_SP_FFDCEXMPL_ER -i /usr/lpp/ssp/inc/ myprog.h -r myprog -s myprog.ksh -p $LINEPOS -v "1.1" -l PSSP -d $MINUSDOPTS -x $MINUSXOPTS -y $MINUSYOPTS -a $OUTPUT -b "myprog Configuration Failure - Exiting") RC=$? if ((RC == 0)) then fcdispfid $FID return 1 else : fi fi
命令:errpt, fcdecode, fcdispfid, fcinit, fcpushstk, fcreport
文件:ct_ffdc.h
子例程:fc_log_error (请参考 RSCT 首次故障数据捕获编程指南和参考大全))