2018年12月10日月曜日

VDDK API のログを表示する方法

概要

VDDK API 側のログはデフォルトだと何も表示されません
初期化する際にログを出力するための関数を渡す必要があります
またログレベルを設定ファイルで変更することも可能です

環境

  • CentOS 7
  • VCSA 6.5.0 9451637
  • VDDK API 6.7.1

サンプルコード

#include <iostream>
#include <cstring>
#include "vixDiskLib.h"
using std::cout;
using std::endl;

#define VIXDISKLIB_VERSION_MAJOR 6
#define VIXDISKLIB_VERSION_MINOR 7

static struct {
  VixDiskLibConnection connection;
  char *libdir;
} params;

static void LogFunc(const char *fmt, va_list args) {
   printf("Log: ");
   vprintf(fmt, args);
}

static void WarnFunc(const char *fmt, va_list args) {
   printf("Warning: ");
   vprintf(fmt, args);
}

static void PanicFunc(const char *fmt, va_list args) {
   printf("Panic: ");
   vprintf(fmt, args);
   exit(10);
}

int main() {
  VixError err;

  err = VixDiskLib_InitEx(VIXDISKLIB_VERSION_MAJOR, VIXDISKLIB_VERSION_MINOR, &LogFunc, &WarnFunc, &PanicFunc, params.libdir, "init.cfg");

  VixDiskLibConnectParams *cnxParams = VixDiskLib_AllocateConnectParams();
  cnxParams->vmxSpec = {(char*)"moref=vm-20"};
  cnxParams->specType = VIXDISKLIB_SPEC_VMX;
  cnxParams->serverName = {(char*)"192.168.100.20"};
  cnxParams->credType = VIXDISKLIB_CRED_UID;
  cnxParams->creds.uid.userName = {(char*)"administrator@vsphere.local"};
  cnxParams->creds.uid.password = {(char*)"xxxxxxxxxx"};
  cnxParams->thumbPrint = {(char*)"96:09:d6:5b:e0:83:58:1b:ba:2b:cc:78:22:88:33:36:64:50:32:eb"};
  err = VixDiskLib_ConnectEx(cnxParams, 0, NULL, "nbd", &params.connection);

  err = VixDiskLib_EndAccess(cnxParams, "src");

  VixDiskLib_Disconnect(params.connection);
  return 0;
}

処理自体は大したことはしていません
大事なのは前半の LogFunc, WarnFunc, PanicFunc の 3 つです
それぞれのログレベルに応じてログ出力用の関数を用意します
ログの出力形式などをカスタマイズできるようになっています

用意した関数は VixDiskLib_InitEx の引数として渡します
こうすることで VDDK API を実行した際に標準出力にログが表示されるようになれます
また設定ファイル (今回であれば "init.cfg") を準備することでログレベルの調整もできます

  • vim init.cfg
# temporary directory for logs etc.
tmpDirectory="/usr/local/vendorapp/var/vmware/temp"
# log level 0 to 6 for quiet ranging to verbose
vixDiskLib.transport.LogLevel=6
# disable caching to disk
vixDiskLib.disklib.EnableCache=0
# whether to check SSL thumbprint on Linux - has no effect
vixDiskLib.linuxSSL.verifyCertificates=1
# network file copy options
vixDiskLib.nfc.AcceptTimeoutMs=180000
vixDiskLib.nfc.RequestTimeoutMs=180000
vixDiskLib.nfc.ReadTimeoutsMs=60000
vixDiskLib.nfc.WriteTimeoutsMs=600000
vixDiskLib.nfcFssrvr.TimeoutMs=0
vixDiskLib.nfcFssrvrWrite.TimeoutMs=0
# nfc.LogLevel (0 = Quiet, 1 = Error, 2 = Warning, 3 = Info, 4 = Debug)
vixDiskLib.nfc.LogLevel=2

サンプルにあったものをそのまま持ってきているので余計な設定も入っています
ポイントは vixDiskLib.transport.LogLevel=6 の部分です
0 から 6 までの指定が可能で 6 が一番詳細に表示されます
試しに今回のコードで 0 から 6 までログレベルを変更してどれくらいログが出力されるか確認したところ 5 以上からかなりログの量が変わりました (数字は行数です)

 68 log0
 68 log1
 68 log2
 68 log3
 68 log4
100 log5
149 log6

ちなみにデフォルトは 3 になっているようです
通常は 3 でデバッグ時には 5 以上を指定する感じで良いかなと思います

最後に

VDDK API でログを表示する方法を紹介しました
それぞれの関数に NULL を渡せば何もログは表示されません

出力は標準出力以外には選択できないっぽいです
ファイルに出力したい場合はリダイレクトなどを使いましょう

参考サイト

0 件のコメント:

コメントを投稿