2013-08-03 42 views
11

Tôi đã đấu tranh với nhật ký tăng cường trong một thời gian - Tôi đã viết ví dụ đơn giản của mình vào một tệp nhật ký (http://boost-log.sourceforge.net/libs/log/example/doc/tutorial_file.cpp). Tuy nhiên, khi tôi cố gắng sao chép mã đó vào một lớp 'Logger', tôi không thể ghi nó vào tệp nhật ký. Tôi có thể xem các tập tin default.log được tạo ra, nhưng không có gì trong đó.tập tin nhật ký tăng cường không được ghi vào

Tôi đang sử dụng debian 7 64bit. Tất cả mọi thứ biên dịch tốt - biên dịch dòng là:

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 

Dưới đây là mã của tôi:

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_ */ 

Trả lời

31

bạn cần phải thuộc tính này khi tạo file log

keywords::auto_flush = true 

cách nhập nhật ký đó được viết ngay lập tức. theo mặc định, trình ghi tệp có vẻ ghi vào tệp khi nó nằm ngoài phạm vi hoặc tại một số điểm bí ẩn khác, tài liệu không đề cập đến bất kỳ điều gì về

+4

Điều đó chính xác - rất lạ. Ví dụ này thậm chí còn không đề cập đến từ khóa đó, nhưng vẫn hoạt động hoàn hảo. Cảm ơn @ user1283078! – Jarrett

+1

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

Các vấn đề liên quan