1

私は次のように関数を書いています:

bool abc::GetLoggingStatus() {
    //true or false is returned
    int value;
    if (regKey->HasValue("LoggingStatus")) {
        regKey->QueryValue("LoggingStatus", &value);
        if (value == 1)
            return true; //no logging possible
        else
            return false;
    }
    regKey->SetValue("LoggingStatus", 1);
    return true;
}

ログ レベルは次のように定義されます。

typedef enum {
    Entry,
    Exit,
    Debug,
    Warning,
    Notification,
    Error
} TYPE;

1 を選択した場合に必要なのは、ロギングのレベル、つまりデバッグ、エラーを表示する必要があります... regedit で、0 の場合は何も表示されず、ロギングが無効になります。

4

1 に答える 1

3

regeditでドロップダウンメニューを作成することはできませんが、できることは、という名前の新しいエントリを作成することですLoggingLevelLoggingStatusが0の場合、このエントリは無視されLoggingLevelます。はレベルを定義する文字列です。

この文字列を列挙型に戻す場合、最も簡単な方法は、文字列から列挙型へのマップを作成することです。

std::map<std::string, TYPE> typeMap;
typeMap["Warning"] = Warning;
...

コードで、ロギングレベルをクエリします。

char* level;
regKey->QueryValue("LoggingLevel", level);
TYPE theLevel = typeMap[level];

もちろん、適切なエラーチェックを行う必要があります。

編集

ログ設定を取得するには、2つの関数を追加する必要がありshouldLog()ますgetLevel()。ログ関数は次のようになります。

void log(Logger* logger, TYPE type, string sClassName, string sMethodName, string sMessage = "") { 
if (!logger || !abc::shouldLog()) {
   return;
}


TYPE curLevel = abc::getLevel();
bool shouldLog = false;

if (type == Warning && (curLevel == All || curLevel == Warning) ...) {
  shouldLog = true;
}

if (shouldLog) {logger->WriteEntry(sClassName, sMethodName); }

}

複雑なif構造を避けたい場合は、列挙型を値にマップして比較することもできます。たとえば、Warning=1およびALL=0です。次にcurLevel < type、ロガーがログに記録する必要があるかどうかを確認できます。

于 2012-08-14T10:09:37.320 に答える