对策略扩展问题进行故障排除

如果您的扩展函数未按预期运行,则可以使用扩展跟踪功能来验证扩展函数的行为。您还可以使用自定义日志记录功能向扩展函数添加日志记录,在其中可以定义要在 NetScaler 设备上捕获的日志级别。

本主题提供有关以下方面的信息:

  • 扩展追踪
  • 自定义日志

扩展追踪

为了显示您的扩展函数正在做什么,扩展跟踪功能会将该函数的执行记录到 NetScaler 系统日志 (/var/log/ns.log)。跟踪日志使用 DEBUG 日志级别,该级别通常不启用。因此,您必须启用所有日志级别。然后,您可以通过 set ns extension 命令的 -trace 选项来启用跟踪。可用设置为:

  • 关闭关闭跟踪(等同于 unset ns extension -trace)。
  • 使用参数调用 trace 函数调用,使用第一个返回值进行函数返回。
  • 行追踪上述已执行行的行号加上行号。
  • 全部追踪上述内容以及由执行行更改的局部变量。

示例:

set audit syslogParams -loglevel ALL

set ns extension combine_headers -trace all
<!--NeedCopy-->

每条跟踪消息的格式为

log-header : default NSEXTENSION Message message-number 0 : "TRACE function-name CALL call-number: event"

其中,

  • log-header 提供时间戳、NetScaler IP 地址和数据包引擎 ID。
  • 消息编号是标识日志消息的序列号。
  • 函数名是扩展函数名称。
  • call-number 是每个扩展函数调用的序列号。它可用于对扩展函数调用的所有跟踪消息进行分组。
  • 事件是以下之一:
    • CALL 函数名称;参数值表示已使用指定参数调用了该函数。
    • 从函数名称返回;return = 值表示函数已返回指定的(第一个)值。(未报告其他返回值。)
    • 行号;变量值表示某行已执行,并列出值已更改的所有变量。

其中,

  • 一个或多个值是
    • 一个数字,带或不带小数点,
    • 如前所述,用双引号括起来并带有转义字符的字符串,
    • 布尔值是真还是假,
    • 不然,
    • 一个表构造函数,格式为 {[key1]=value1,[key2]=value2, …}。
  • parameter-values 为 parameter1 = value1 ; parameter2 = value2 , …
  • 变量值是 variable1 = value1 ; variable2 = value2 , …

简短的日志消息示例:

>shell tail -f /var/log/ns.log | grep TRACE | more

... NSEXTENSION Message 3035 0 : "TRACE combine_headers CALL 30 : CALL COMBINE_HEADERS; self = "User-Agent: curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3\r\nHost: 10.217.24.7\r\nAccept: \*/\*\r\nH2: h2val1\r\nH1: abcd\r\nH2: h2val2\r\nH2: h2val3\r\n\r\n""

... NSEXTENSION Message 3036 0 : "TRACE combine_headers CALL 30 : LINE 4; headers = {}"

... NSEXTENSION Message 3037 0 : "TRACE combine_headers CALL 30 : LINE 5; combined_headers = {}"

... NSEXTENSION Message 3038 0 : "TRACE combine_headers CALL 30 : CALL gmatch"

... NSEXTENSION Message 3039 0 : "TRACE combine_headers CALL 30 : RETURN FROM gmatch; return = function 0x2bee5a80"

... NSEXTENSION Message 3040 0 : "TRACE combine_headers CALL 30 : CALL for iterator"

... NSEXTENSION Message 3041 0 : "TRACE combine_headers CALL 30 : RETURN FROM for iterator; return = " curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3""

... NSEXTENSION Message 3042 0 : "TRACE combine_headers CALL 30 : LINE 9; name = "User-Agent"; value = " curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3""

... NSEXTENSION Message 3043 0 : "TRACE combine_headers CALL 30 : LINE 10"

... NSEXTENSION Message 3044 0 : "TRACE combine_headers CALL 30 : LINE 14; headers = {["User-Agent"]={[1]="User-Agent: curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3"}}"

. . .

... NSEXTENSION Message 3117 0 : "TRACE combine_headers CALL 30 : CALL for iterator"

... NSEXTENSION Message 3118 0 : "TRACE combine_headers CALL 30 : RETURN FROM for iterator; return = nil"

... NSEXTENSION Message 3119 0 : "TRACE combine_headers CALL 30 : LINE 19"

... NSEXTENSION Message 3120 0 : "TRACE combine_headers CALL 30 : CALL concat"

... NSEXTENSION Message 3121 0 : "TRACE combine_headers CALL 30 : RETURN FROM concat; return = "User-Agent: curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3\r\nH1: abcd\r\nAccept: \*/\*\r\nHost: 10.217.24.7\r\nH2: h2val1, h2val2, h2val3"" ... NSEXTENSION Message 3122 0 : "TRACE combine_headers CALL 30 : LINE 25; result_str = "User-Agent: curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3\r\nH1: abcd\r\nAccept: \*/\*\r\nHost: 10.217.24.7\r\nH2: h2val1, h2val2, h2val3\r\n\r\n""

... NSEXTENSION Message 3123 0 : "TRACE combine_headers CALL 30 : RETURN FROM COMBINE_HEADERS; return = "User-Agent: curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3\r\nH1: abcd\r\nAccept: \*/\*\r\nHost: 10.217.24.7\r\nH2: h2val1, h2val2, h2val3\r\n\r\n""
<!--NeedCopy-->

自定义日志

您也可以将自己的日志添加到扩展函数中。为此,请使用内置的 ns.logger: level () 函数,其中级别为紧急、警报、严重、错误、警告、通知、信息或调试。 参数与 C printf () 函数相同:一个格式字符串和一个可变数量的参数,用于为格式字符串中指定的百分比提供值。例如,您可以将以下内容添加到 COMBINE_HEADERS 函数中以记录调用结果:

local result_str = table.concat(combined_headers, "\r\n") .. "\r\n\r\n"

ns.logger:info("Result: %s", result_str)

return result_str
<!--NeedCopy-->

上述函数将记录以下消息托 /var/log/ns.log 记录上述扩展跟踪部分中缩写的日志消息示例中显示的示例输入。

... : default NSEXTENSION Message 143 0 : "Result: Host: 10.217.24.7:2000^M H1: abcd, 1234^M User-Agent: curl/7.24.0 (amd64-portbld-freebsd8.4) libcurl/7.24.0 OpenSSL/0.9.8y zlib/1.2.3^M Accept: */*^M H2: h2val1, h2val2, h2val3^M ^M"

对策略扩展问题进行故障排除