2013-08-03 3 views
11

私はしばらくブーストログに苦労しています。ログファイル(http://boost-log.sourceforge.net/libs/log/example/doc/tutorial_file.cpp)に簡単な例を書いています。しかし、そのコードを 'Logger'クラスにコピーしようとすると、ログファイルに書き込むことができません。私はファイルdefault.logが作成されるのを見ることができますが、そこには何もありません。ブーストログファイルが書き込まれていない

私はdebian 7 64bit上にいます。すべてが正常にコンパイル - コンパイル行である:

g++ -o build/Logger.o -c -std=c++11 -Wall -g -O0 -DBOOST_LOG_DYN_LINK -DDEBUG src/Logger.cpp 
g++ -o build/logtest build/Logger.o -lboost_log -lboost_log_setup -lboost_date_time -lboost_thread -lboost_wave -lboost_regex -lboost_program_options 

ここに私のコードです:

Logger.cpp

/* 
* Logger.cpp 
* 
* Created on: 2011-01-17 
*  Author: jarrett 
*/ 

#include "Logger.h" 

namespace logging = boost::log; 
namespace sinks = boost::log::sinks; 
namespace src = boost::log::sources; 
namespace expr = boost::log::expressions; 
namespace attrs = boost::log::attributes; 
namespace keywords = boost::log::keywords; 

namespace dhlogging { 

Logger::Logger(std::string fileName) 
{ 
    initialize(fileName); 
} 

Logger::Logger(Logger const&) 
{ 
} 

Logger::~Logger() 
{ 

} 

Logger* Logger::logger_ = nullptr; 
Logger* Logger::getInstance(std::string logFile) 
{ 
    if (Logger::logger_ == nullptr) { 
     logging::add_file_log(logFile); 

     logging::core::get()->set_filter 
     (
      logging::trivial::severity >= logging::trivial::info 
     ); 

     logging::add_common_attributes(); 
     Logger::logger_ = new Logger(logFile); 
    } 

    return Logger::logger_; 
} 

void Logger::initialize(std::string fileName) 
{ 
    BOOST_LOG(log_) << "Hello, World!"; 
    BOOST_LOG_SEV(log_, info) << "Hello, World2!"; 
} 

void Logger::logInfo(std::string message) 
{ 
    BOOST_LOG_SEV(log_, info) << message; 
} 

void Logger::logDebug(std::string message) 
{ 
    BOOST_LOG_SEV(log_, debug) << message; 
} 

void Logger::logWarn(std::string message) 
{ 
    BOOST_LOG_SEV(log_, warning) << message; 
} 

void Logger::logError(std::string message) 
{ 
    BOOST_LOG_SEV(log_, error) << message; 
} 

void Logger::logFatal(std::string message) 
{ 
    BOOST_LOG_SEV(log_, fatal) << message; 
} 

} 

int main(int, char*[]) 
{ 
    logging::add_common_attributes(); 

    using namespace logging::trivial; 

    dhlogging::Logger::getInstance()->logInfo("himom"); 

    return 0; 
} 

Logger.h

/* 
* Logger.h 
* 
* Created on: 2011-01-17 
*  Author: jarrett 
*/ 

#ifndef LOGGER_H_ 
#define LOGGER_H_ 

#include <map> 
#include <boost/log/core.hpp> 
#include <boost/log/trivial.hpp> 
#include <boost/log/expressions.hpp> 
#include <boost/log/sinks/text_file_backend.hpp> 
#include <boost/log/utility/setup/file.hpp> 
#include <boost/log/utility/setup/common_attributes.hpp> 
#include <boost/log/sources/severity_logger.hpp> 
#include <boost/log/sources/record_ostream.hpp> 

namespace logging = boost::log; 
namespace sinks = boost::log::sinks; 
namespace src = boost::log::sources; 
namespace expr = boost::log::expressions; 
namespace attrs = boost::log::attributes; 
namespace keywords = boost::log::keywords; 

using namespace logging::trivial; 

namespace dhlogging { 
class Logger { 

public: 
    static Logger* getInstance(std::string logFile = "default.log"); 

    void logInfo(std::string message); 
    void logDebug(std::string message); 
    void logWarn(std::string message); 
    void logError(std::string message); 
    void logFatal(std::string message); 


private: 
    Logger(std::string fileName); 
    Logger(Logger const&); 
    Logger& operator=(Logger const&); 
    virtual ~Logger(); 

    void initialize(std::string fileName); 

    src::severity_logger<severity_level> log_; 

    static Logger* logger_; // singleton instance 
}; 
} 
#endif /* LOGGER_H_ */ 

答えて

31

ファイルログ

を作成するときに、この属性に必要
keywords::auto_flush = true 

このようにログエントリはすぐに書き込まれます。 デフォルトでは、ファイルロガーはファイルがスコープ外になったとき、または他の何か不思議な点で書き込みを行ったようですが、ドキュメントに何も言及していません。

+4

これはまさにそれです。この例ではそのキーワードについて言及していませんでしたが、完全に機能しました。ありがとう@ user1283078! – Jarrett

+1

例:http://stackoverflow.com/questions/15853981/boost-log-2-0-empty-severity-level-in-logs – lepe

関連する問題