errlog_find_first , errlog_find_next 和 errlog_find_sequence 子例程
用途
使用提供的条件检索错误日志条目。
语法
library liberrlog.a
#include <sys/errlog.h>
int errlog_find_first(handle, filter, result)
errlog_handle_t handle;
errlog_match_t *filter;
errlog_entry_t *result;
int errlog_find_next(handle, result)
errlog_handle_t handle;
errlog_entry_t *result;
int errlog_find_sequence(handle, sequence, result)
errlog_handle_t handle;
int sequence;
errlog_entry_t *result;
描述
errlog_find_first 子例程使用 errlog_set_direction 子例程指定的方向来查找过滤器指定的搜索参数的第一次出现。 如果未指定任何内容,那么将使用反向。 换而言之,缺省情况下,将从最新条目开始搜索条目。
过滤器参数所指向的 errlog_match_t 结构定义要应用于每个 errlog 条目的测试表达式或表达式集。
如果在过滤器参数中传递的值为空,那么 errlog_find_first 子例程将返回日志中的第一个条目,然后可以使用 errlog_find_next 子例程来返回后续条目。 要按期望的方向读取所有日志条目,请打开日志,然后发出 errlog_find_next 调用。
要定义基本表达式,必须将 em_field 设置为要测试的 errlog 条目中的字段,必须将 em_op 设置为要应用于该字段的关系运算符,并且必须将 em_intvalue 或 em_strvalue 设置为要针对其进行测试的值。 通过将基本表达式附加到另一个 errlog_match_t 结构的 em_left 和 em_right ,并将该结构的 em_op 设置为二进制或一元运算符,可以组合这些基本表达式。 然后,这些复杂表达式可能与其他基本或复杂表达式以相同的方式组合在一起,以构建可以定义任意复杂性的过滤器的树。
errlog_find_next 子例程查找与先前 errlog_find_first 调用指定的条件匹配的下一个错误日志条目。 缺省情况下,搜索将按 errlog_set_direction 子例程指定的方向或反向继续进行。
errlog_find_sequence 子例程返回与指定的错误日志序号匹配的条目,在 errlog_entry 结构的 el_sequence 字段中找到该条目。
参数
该句柄包含先前对 errlog_open 的调用所返回的句柄。
过滤器参数指向定义搜索自变量的 errlog_match_t 元素,或者指向自变量树的第一个元素。
sequence 参数包含要检索到的项的序号。
结果参数必须指向要包含返回的错误日志条目的区域。
返回值
成功完成后, errlog_find_first, errlog_find_next和 errlog_find_sequence 子例程将返回 0 ,并且结果引用的内存将包含找到的条目。
可能返回了以下错误:
项 | 描述 |
---|---|
_ERR_INVARG | 检测到参数错误。 |
_ERR_NOMEM | 不能分配内存。 |
_ERR_IO | 发生 I/O 错误。 |
_ERR_DONE | 找不到更多条目。 |
示例
以下代码演示了如何使用 H (硬件) 或 S (软件) 类在日期范围内搜索所有 errlog 条目。
{
extern int begintime, endtime;
errlog_match_t beginstamp, endstamp, andstamp;
errlog_match_t hardclass, softclass, orclass;
errlog_match_t andtop;
int ret;
errlog_entry_t result;
/*
* Select begin and end times
*/
beginstamp.em_op = LE_OP_GT; /* Expression 'A' */
beginstamp.em_field = LE_MATCH_TIMESTAMP;
beginstamp.em_intvalue=begintime;
endstamp.em_op = LE_OP_LT; /* Expression 'B' */
endstamp.em_field = LE_MATCH_TIMESTAMP;
endstamp.em_intvalue=endtime;
andstamp.em_op = LE_OP_AND; /* 'A' and 'B' */
andstamp.em_left = &beginstamp;
andstamp.em_right = &endstamp;
/*
* Select the classes we're interested in.
*/
hardclass.em_op = LE_OP_EQUAL; /* Expression 'C' */
hardclass.em_field = LE_MATCH_CLASS;
hardclass.em_strvalue = "H";
softclass.em_op = LE_OP_EQUAL; /* Expression 'D' */
softclass.em_field = LE_MATCH_CLASS;
softclass.em_strvalue = "S";
orclass.em_op = LE_OP_OR; /* 'C' or 'D' */
orclass.em_left = &hardclass;
orclass.em_right = &softclass;
andtop.em_op = LE_OP_AND; /* ('A' and 'B') and ('C' or 'D') */
andtop.em_left = &andstamp;
andtop.em_right = &orclass;
ret = errlog_find_first(handle, &andtop, &result);
}
errlog_find_first 函数将返回第一个匹配过滤器的条目。 对 errlog_find_next 函数的连续调用将返回与最近对 errlog_find_first 函数的调用中指定的过滤器匹配的连续条目。 如果找不到更多匹配的条目,那么 errlog_find_first 和 errlog_find_next 函数将返回值 _ERR_DONE。