UDXロギングの理解

UDXと同様、AEも統合されたNPSログ機能を利用できる。 UDXロギングの詳細については、NetezzaUser-Defined FunctionsDocumentationを参照してください。

NPS システムの nzudxdbg コマンドユーティリティを使用してシステム全体のロギングを有効にし、register_ae -mask オプションを使用して特定の AE のロギングを有効にする。 例:
--mask DEBUG
--mask TRACE

maskオプションを2回指定すると、DEBUGとTRACEの両方の出力をログファイルに含めることができる。 ア プ リ ケーシ ョ ン コ ー ド は、 DEBUG または TRACE のいずれかで ロ グ 機能を呼び出す こ と がで き、 AE 登録時にシ ス テ ムの ロ グ記録がオ ンにな っ てい る 場合 (DEBUG または TRACE)、 そのログ機能が有効にな っ ていれば、 ロ グ メ ッ セージが送信 さ れます。

これはprintf形式のロギングに似ている。 以下はC++ AEを使用した例である:

コード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <nzaefactory.hpp>
using namespace nz::ae;
static int run(nz::ae::NzaeFunction *aeFunc);
static int doShaper(nz::ae::NzaeShaper *aeShaper);

int main(int argc, char * argv[])
{
        NzaeApiGenerator helper;
        while (true) {
            nz::ae::NzaeApi *api = helper.getApi(nz::ae::NzaeApi::ANY, 
                    true);
            if (helper.isRemote() && !api) {
                    continue; 
            }
            if (api->apiType == nz::ae::NzaeApi::FUNCTION) {
                    api->aeFunction->log(nz::ae::NzaeFunction::LOG_TRACE, 
                            "Got Function");
                    run(api->aeFunction);
            }
            else {
                    api->aeShaper->log(nz::ae::NzaeShaper::LOG_TRACE, 
                            "Got Shaper");
                    doShaper(api->aeShaper);
            }
            if (!helper.isRemote())
                    break;
            if (api)
                    break;
    }
    return 0;
}

class MyHandler : public nz::ae::NzaeFunctionMessageHandler
{
public:
        void evaluate(NzaeFunction& api, NzaeRecord &input, 
                NzaeRecord &result) {
                        const NzaeMetadata& m = api.getMetadata();
                        nz::ae::NzaeField &field = input.get(0);
                        if (!field.isNull() ) {
                            nz::ae::NzaeField &f = result.get(0);
                            f.assign(field); 
                        } 
        }
};

class MyHandler2 : public nz::ae::NzaeShaperMessageHandler
{
public:
        void shaper(NzaeShaper& api){
                const NzaeMetadata& m = api.getMetadata();
                char name[2];
                if (api.catalogIsUpper())
                        name[0] = 'I';
                else
                        name[0] = 'i';
                name[1] = 0;
                if (m.getInputType(0) == NzaeDataTypes::NZUDSUDX_FIXED ||
                        m.getInputType(0) == NzaeDataTypes::NZUDSUDX_VARIABLE ||
                        m.getInputType(0) == NzaeDataTypes::NZUDSUDX_NATIONAL_FIXED
||
                        m.getInputType(0) ==
NzaeDataTypes::NZUDSUDX_NATIONAL_VARIABLE) {
                              api.addOutputColumnString(m.getInputType(0),  
                                      name, m.getInputSize(0));
                }
                else if (m.getInputType(0) == NzaeDataTypes::NZUDSUDX_NUMERIC128
|| 
                        m.getInputType(0) == NzaeDataTypes::NZUDSUDX_NUMERIC64 ||
                        m.getInputType(0) == NzaeDataTypes::NZUDSUDX_NUMERIC32) {
                                api.addOutputColumnNumeric(m.getInputType(0), 
                                        name, m.getInputSize(0),
                                        m.getInputScale(0));
                }
                else {
                        api.addOutputColumn(m.getInputType(0), name);
                }
        }
};

static int doShaper(nz::ae::NzaeShaper *aeShaper)
{
    aeShaper->run(new MyHandler2());
    return 0;
}
static int run(nz::ae::NzaeFunction *aeFunc)
{
    aeFunc->run(new MyHandler());
    return 0;
}
次の行に注目してほしい:
api->aeFunction->log(nz::ae::NzaeFunction::LOG_TRACE, "Got Function");
api->aeShaper->log(nz::ae::NzaeShaper::LOG_TRACE, "Got Shaper");

コンパイル

AEをコンパイルする:

$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language cpp --template compile \
     --version 3 TestIdentity.cpp --exe testidentity 

登録

TRACEを有効にしてAEを登録する:

$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language cpp --version 3 \
     --template udf --sig "logger(varchar(any))" \
     --return "varchar(any)" --exe testidentity --mask TRACE

デバッグを有効にする

nzudxdbgを使用してデバッグを有効にする:

$ nzudxdbg --file
Processing 1 spus
.
done
Processing host
done

実行中

ロガーを実行するには、まず簡単なテーブルを作成する:

create table s (s varchar(100));
INZA(ADMIN)=> insert into s values('20101401');
INSERT 0 1
INZA(ADMIN)=> insert into s values('20101303');
INSERT 0 1

以下のSQLを使ってロガーを実行する:

SELECT logger(s) FROM s; 
LOGGER
----------
20101401
20101303
(2 rows)

すると、'pg.log:に次のように表示される。

2010-04-27 06:38:44.848757 EDT [27656] DEBUG: Got Shaper

そして'sysmrg.log:には次のように記述した。

2010-04-27 06:38:45.168278 EDT (event1137.1[1]) (dsid=1)[d,udx ] Got Function

上記のログメッセージは、シェーパーがpostgresで実行され、関数がSPUで実行されるために発生する。