←フエルチラシノウラ。トップページへもどる。

【C++】標準ライブラリSTLのみを利用したJavaのLoggerっぽいロガークラス。

C++ STL Logger ロガー ロギングツール Log4Jもどき 自作クラス

JavaのLoggerっぽいものをC++で自作してみました。
標準ライブラリしか使ってませんのでほとんどの環境でコンパイルできると思います。
基本的な使い方は、

 ? logger.ini を自分のすきな設定に書き換える。
 ? #include "Logger.h" でインクルードする。
 ? Logger::configure("./logger.ini"); で設定ファイルを読み込む。
 ? Logger::debug("hoge", __FILE__, __func__); で出力する。

以上。

以下はそのメ[スコード等です。
バグがあっても責任取りませんのでー笑

Logger.h (Loggerクラス)

#ifndef _LOGGER_ #define _LOGGER_ #include <string> #include <iostream> #include <fstream> #include <map> using namespace std; /* * ロガークラス。 * * author: ぶらざーほわいつ * date: 2006/09/13 10:10:13 * * 説明: * JavaのLoggerもどきです。 * * 使い方: * * #include "Logger.h" * * Logger::configure("./logger.ini"); * Logger::info("いんふぉ", __FILE__, __func__); * Logger::debug("でばっぐ", __FILE__, __func__); * Logger::warn("わーん", __FILE__, __func__); * Logger::error("えらー", __FILE__, __func__); * * 上記の処理で "./logger.log" というログファイルが吐き出されます。 * 出力レベルの調整は "./logger.ini" で行えます。 * */ // ログファイルのパス static string filePath = "./logger.log"; // ログ設定ファイルのパス static string inifilePath = "./logger.ini"; // 読み込んだINI情報 static map<string, string > iniMap; class Level { public: static const int INFO = 40; static const int DEBUG = 50; static const int WARN = 60; static const int ERROR = 70; }; class Logger : public basic_string<char> { private: public: static void configure(string inifilePath) { // 読み込み用ファイルストリーム ifstream fin; // ファイルオープン fin.open(inifilePath.c_str()); while (!fin.eof()) { string line; string key; string value; fin >> line; Logger::splitstring(line, "=", key, value); if (key == "NULL" || value == "NULL") { continue; } iniMap.insert(pair<string, string>(key, value)); } // ファイルクローズ fin.close(); } static void info(string msg, string file, string func) { if (Logger::isEnabled(Level::INFO)) { Logger::log(Level::INFO, msg, file, func); } } static void debug(string msg, string file, string func) { if (Logger::isEnabled(Level::DEBUG)) { log(Level::DEBUG, msg, file, func); } } static void warn(string msg, string file, string func) { if (Logger::isEnabled(Level::WARN)) { log(Level::WARN, msg, file, func); } } static void error(string msg, string file, string func) { if (Logger::isEnabled(Level::ERROR)) { log(Level::ERROR, msg, file, func); } } private: static bool isEnabled(int logLevel) { int logLevelFromIni = 999; string key; string logLevelStringFromIni; // キーから値を検索 map<string, string>::iterator itr; itr = iniMap.find("LOG_LEVEL"); if (itr != iniMap.end()) { // キーを取得します。 key = itr->first; // 値も取得します。 logLevelStringFromIni = itr->second; } else { return false; } if (logLevelStringFromIni == "INFO") { logLevelFromIni = Level::INFO; } else if (logLevelStringFromIni == "DEBUG") { logLevelFromIni = Level::DEBUG; } else if (logLevelStringFromIni == "WARN") { logLevelFromIni = Level::WARN; } else if (logLevelStringFromIni == "ERROR") { logLevelFromIni = Level::ERROR; } if (logLevel >= logLevelFromIni) { return true; } else { return false; } } static void log(int level, string msg, string file, string func) { time_t aclock; char *now; struct tm *newtime; FILE *pf; string logLevel; // 現在の時刻を取得。 time(&aclock); newtime = localtime(&aclock); now = asctime(newtime); string nowStr = now; // nowの末尾の改行をチョップ。 nowStr = nowStr.substr(0, nowStr.size() - 1); if (level == Level::INFO) { logLevel = "INFO "; } else if (level == Level::DEBUG) { logLevel = "DEBUG"; } else if (level == Level::WARN) { logLevel = "WARN "; } else if (level == Level::ERROR) { logLevel = "ERROR"; } if ((pf = fopen(filePath.c_str(), "at")) != NULL){ fprintf(pf, "%s [%s] %s#%s - %sn", nowStr.c_str(), logLevel.c_str(), file.c_str(), func.c_str(), msg.c_str()); fclose(pf); } return; } static string getValue(string key) { // イテレータを生成 map<string, string>::iterator itr; // キーから値を検索 itr = iniMap.find(key); if (itr != iniMap.end()) { // キーを取得します。 string key = itr->first; // 値も取得します。 string value = itr->second; return value; } return NULL; } /** * split * @param target string * @param delimiter * @param first of two splited * @param second of two splited */ static void splitstring(string str, string seperater, string &first, string &second) { int i = (int)str.find(seperater); //find seperator if(i != -1) { int y = 0; if(!str.empty()) { while(y != i) { first += str[y++]; //creating first string } y = y+(int)seperater.length(); //jumping forward seperater length while(y != str.length()) { second += str[y++]; //creating second string } } } else { first = str; second = "NULL"; //if seperator is not there then second string == null } } }; #endif

設定ファイル logger.ini

# INFO, DEBUG, WARN, ERROR LOG_LEVEL=DEBUG

テスト用main関数

#include <cstdlib> #include <iostream> #include "Logger.h" using namespace std; int main(int argc, char *argv[]) { Logger::configure("./logger.ini"); Logger::info("いんふぉ", __FILE__, __func__); Logger::debug("でばっぐ", __FILE__, __func__); Logger::warn("わーん", __FILE__, __func__); Logger::error("えらー", __FILE__, __func__); system("PAUSE"); return EXIT_SUCCESS; }

logger.log への出力結果

⇒ logger.ini の LOG_LEVEL=DEBUG な場合 Wed Sep 13 09:56:08 2006 [DEBUG] main.cpp#main - でばっぐ Wed Sep 13 09:56:08 2006 [WARN ] main.cpp#main - わーん Wed Sep 13 09:56:08 2006 [ERROR] main.cpp#main - えらー

http://goodjob.boy.jp/chirashinoura/id/101.html

作成日: 2006-09-13 10:21:51

最終更新日: 2006-09-13 10:25:14

▲このページの上へ