您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

RTP记录log的机制

2024/5/1 19:41:49发布18次查看
我们 rcv 这边经常跑的一个concurrent request rtp: receiving transaction processor, 主要是用来处理 rcv_transactions_interface 里面的数据的. 这个 concurrent program 里面包含许多文件, 比较重要的有: ident rvctprvctp: $header: rvctp.oc 120.0.120
我们 rcv 这边经常跑的一个concurrent request rtp: receiving transaction processor, 主要是用来处理 rcv_transactions_interface 里面的数据的.
这个 concurrent program 里面包含许多文件, 比较重要的有:
ident rvctprvctp: $header: rvctp.oc 120.0.12000000.1 2007/01/16 23:53:49 appldev ship $ $header: rvtbm.lpc 120.13.12010000.10 2013/03/15 02:51:16 zhlee ship $ $header: rvtpt.lpc 120.28.12010000.33 2013/07/15 07:12:37 smai ship $ $header: rvtvq.lpc 120.8.12010000.17 2013/04/03 11:40:30 wayin ship $ $header: rvtuq.lpc 120.9.12000000.7 2009/07/07 09:47:49 yuzzhang01 ship $ $header: pouer.lpc 120.2 2006/06/14 07:57:02 arudas noship $ $header: rvtlo.lpc 120.1.12010000.7 2013/01/05 16:02:14 gke ship $ $header: rvtoc.lpc 120.1.12010000.5 2013/03/28 22:38:31 vthevark ship $ $header: rvtpa.lc 120.6.12010000.3 2009/07/07 08:58:22 ksivasa ship $ $header: rvtpd.lc 120.1.12010000.3 2009/07/07 09:03:17 ksivasa ship $ $header: rvtsh.lpc 120.10.12010000.3 2009/03/06 22:09:40 vthevark ship $ $header: rvtth.lpc 120.29.12010000.9 2012/05/30 15:50:03 gke ship $ $header: rvtvt.lpc 120.9.12010000.10 2013/03/28 18:19:11 vthevark ship $ $header: rvsco.lpc 120.4.12010000.12 2012/09/27 23:10:24 vthevark ship $ $header: rvsrv.lpc 120.4.12010000.16 2013/02/04 07:34:37 zhizheng ship $ $header: rvsit.lpc 120.5.12010000.6 2013/02/04 07:26:30 zhizheng ship $ $header: rvsdl.lpc 120.5.12010000.17 2011/11/28 05:19:19 xiameng ship $ $header: rvssh.lpc 120.2.12010000.3 2009/07/07 09:56:26 ksivasa ship $ $header: rvsut.lpc 120.3.12010000.14 2012/05/28 04:53:57 gke ship $ $header: rvtcl.lpc 120.6.12010000.3 2009/07/07 09:15:25 ksivasa ship $ $header: rvtii.lpc 120.19.12010000.27 2013/08/14 09:58:23 gke ship $ $header: rvtls.lpc 120.7.12010000.14 2012/01/30 12:31:22 ksivasa ship $ $header: rvtoo.lpc 120.3.12010000.3 2009/07/07 09:08:40 ksivasa ship $ $header: rvsrq.lpc 120.5.12010000.3 2009/07/07 09:53:56 ksivasa ship $ $header: rvspo.lpc 120.3.12010000.3 2009/07/07 09:53:12 ksivasa ship $
这些文件是在 rtp log 里面经常见到的. 这里我们主要看看, 在这些文件中是用怎样的机制写 log 的.
首先, 要在要写日志的函数里面声明一个变量:
text strbuf[buflen+1];
然后用下面的语句:
strcpy((char *)strbuf,); sprintf((char *)strbuf,rvtuq:370 req_line_id %ld\n, (long)req_line_id); debug(strbuf,true,true);
第一句把 strbuf 清空, 然后把后面的字符串和整型数写入 strbuf, 第三句 debug 把 strbuf 写入日志. debug 后面有两个参数:
#define debug(message,check_sql_error,no_rows_is_error)
第二个参数 check_sql_error 表示 如果希望检查 sql error, 就设为 true, 否则设为 false. no_rows_is_error 表示 是不是把 no_data_found 当做一个 error. 如果是, 设为true.
concurrent request 里面的文件都是 .c 的代码, 如果里面要写sql, 就要写一句:
exec sql
然后下面写上 sql. 这句 sql 有可能会出错, 这时需要一个方法把错误消息写到 log 里面去. 比如: exec sql select transaction_id, unit_of_measure into :parent_trx_id, :rec_uom from rcv_transactions where transaction_type in ('receive','match') start with transaction_id = :p_trx_id connect by transaction_id = prior parent_transaction_id;
为了捕获这句sql 可能发生的错误, 我们在这句后面写一句:
pouersql(rvtuq, 134, false )
pouersql() 这个函数是在 pouer.lpc 文件 (po user error) 中定义的, 如果上面的sql 发生了错误, 那么就会把 error message 写入 message stack. 并且返回 true.这里面有三个参数, routine, location, no_rows_is_err.
routine 表示sql 发生错误的文件名, 上面的例子中是 rvtuq.
location 表示sql 发生错误的位置, 上面的例子中是 134. 这样我们看到日志里面的这个位置就很容易定位到这句sql.
no_rows_is_err 表示 是不是把 no_data_found 当做 error 来处理. 上面的例子中我们没有当做 error.
在 pouersql 这个函数的内部, 会去sqlca 里面提取 sqlcode. sqlca 全称是: sql communications area, 是一个用来记录sql 执行信息的地方. 每次执行一个sql 都会返回 sqlcode. 如果sqlcode = 0, 那么表示没有错误. 如果 sqlcode > 0, 表示有exception, 如果 sqlcode < 0, 表示发生 error, 要rollback. 我们平时接触的error 都是小于0 的, 但是 no_data_found 是 大于0 的, 代码 1403. pousersql() 函数会去 sqlca 里面提取 sqlcode, 然后判断是否 sqlcode 0, 如果判断小于0, 那么才把错误消息写入 message stack. 如果大于0, 并且参数里面 no_rows_is_err 设为 true, 那么也会写如message stack.
每次执行一次 sql 就会更新一次 sqlca, 所以这个结构只记录最近一次执行sql 的信息 . 错误消息是记录在sqlca.sqlerrm.sqlerrmc 里面的. 所以会把这个里面的字符串写入message stack. 但是sqlerrmc 最多只能记录70 个字符, 所以如果错误消息很长的话, 就会被截断.
上面的sql 发生错误的话, pouersql () 返回值为 true. 那么在调用这个函数的地方, 比如 rvtpt.lpc 文件中, 就会捕捉到这个返回值, 判断返回值之后确定发生error 了, 就会调用:
pouertrace( rvtuq, 000, rvtuqdebitmemo() )
pouertrace () 这个函数也是在pouer.lpc 文件中定义的, 这个函数的返回值总是 false. 它的主要作用也是把错误消息写入 message stack. 三个参数分别为:file: 表示发生错误的文件
location: 表示错误的位置
subroutine: 表示发生错误的函数.
上面我们提到, sqlerrmc 只能保存70 个字符. 如果错误消息多余70 个字符, 想要得到所有的错误消息的话, 就需要用 sqlglm() 函数. 在使用这个函数之前, 我们要确保 sqlcode < 0, 否则取出来的错误消息是前面的sql 的消息.
if (pouersql(rvtuq,019,true)){ char msg[510]; size_t buf_len, msg_len; buf_len = sizeof (msg); sqlglm(msg, &buf_len, &msg_len); strcpy((char *)strbuf,); sprintf((char *)strbuf,rvtuq:001 yu sql error %s \n, (text *) msg); debug(strbuf,true,true); return( false );}
sqlglm() 函数把错误消息写入 msg, 然后只要把 msg 用 debug() 函数写入日志就可以了. sqlglm() 函数对字数也有限制, 最大为512 个字符. 相比 sqlerrmc 的70 个字符多很多了.
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product