UDXロギングの理解
UDXと同様、AEも統合されたNPSログ機能を利用できる。 UDXロギングの詳細については、NetezzaUser-Defined FunctionsDocumentationを参照してください。
--mask DEBUG
--mask TRACEmaskオプションを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で実行されるために発生する。