ポリシー拡張のトラブルシューティング
拡張関数が期待どおりに動作しない場合は、拡張トレース機能を使用して拡張関数の動作を検証できます。カスタムロギング機能を使用して拡張機能にロギングを追加することもできます。この機能では、NetScalerアプライアンスでキャプチャするログレベルを定義できます。
このトピックでは、次の情報を提供します。
- エクステンショントレース
- カスタムロギング
エクステンショントレース
拡張関数の実行内容を確認するために、拡張トレース機能は関数の実行をNetScalerシステムログ(/var/log/ns.log)に記録します。トレースロギングは DEBUG ログレベルを使用しますが、通常は有効になっていません。そのため、すべてのログレベルを有効にする必要があります。その後、set ns extension コマンドの-trace オプションを設定することで、トレースを有効にできます。使用可能な設定は以下のとおりです。
- off トレースをオフにする (ns extension-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"
各項目の意味は次のとおりです。
- ログヘッダーは、タイムスタンプ、NetScaler IPアドレス、およびパケットエンジンIDを提供します。
- メッセージ番号はログメッセージを識別する連続番号です。
- 関数名は拡張関数名です。
- call-number は、各拡張関数呼び出しの連続番号です。拡張関数呼び出しのすべてのトレースメッセージをグループ化するために使用できます。
- イベントは次のいずれかです。
- CALL 関数名; パラメータ値は、関数が指定されたパラメータで呼び出されたことを示します。
- RETURN FROM 関数名; return = value は、関数が指定された (最初の) 値を返したことを示します。(その他の戻り値は報告されません)。
- LINE 行番号。変数値は、行が実行されたことを示し、値が変更されたすべての変数を一覧表示します。
各項目の意味は次のとおりです。
- 1 つまたは複数の値は
- 小数点のある場合とない場合の数値
- 前述のように二重引用符で囲まれてエスケープされた文字列
- 真か偽かのブーリアン、
- nil、
- {[キー1] =値1、[キー2] =値2、…} という形式のテーブルコンストラクター。
- parameter-values is parameter1 = value1 ; parameter2 = value2 , …
- variable-values is 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"