2010-11-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Made LogFactory::logger_ as SharedHandle<Logger> to make dtor of
	Logger called at the program exit.  Rewritten A2_LOG_* macro and
	moved them to LogFactory.h
	* src/LogFactory.cc
	* src/LogFactory.h
	* src/Logger.cc
	* src/Logger.h
pull/1/head
Tatsuhiro Tsujikawa 2010-11-20 12:33:12 +00:00
parent 9a67929d8c
commit c552842505
5 changed files with 64 additions and 89 deletions

View File

@ -1,3 +1,13 @@
2010-11-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Made LogFactory::logger_ as SharedHandle<Logger> to make dtor of
Logger called at the program exit. Rewritten A2_LOG_* macro and
moved them to LogFactory.h
* src/LogFactory.cc
* src/LogFactory.h
* src/Logger.cc
* src/Logger.h
2010-11-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> 2010-11-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Renamed cuid as cuid_t in DefaultBtMessageDispatcher. Renamed cuid as cuid_t in DefaultBtMessageDispatcher.

View File

@ -40,11 +40,11 @@
namespace aria2 { namespace aria2 {
std::string LogFactory::filename_ = DEV_NULL; std::string LogFactory::filename_ = DEV_NULL;
Logger* LogFactory::logger_ = 0; SharedHandle<Logger> LogFactory::logger_;
bool LogFactory::consoleOutput_ = true; bool LogFactory::consoleOutput_ = true;
Logger::LEVEL LogFactory::logLevel_ = Logger::A2_DEBUG; Logger::LEVEL LogFactory::logLevel_ = Logger::A2_DEBUG;
void LogFactory::openLogger(Logger* logger) void LogFactory::openLogger(const SharedHandle<Logger>& logger)
{ {
if(filename_ != DEV_NULL) { if(filename_ != DEV_NULL) {
// don't open file DEV_NULL for performance sake. // don't open file DEV_NULL for performance sake.
@ -67,21 +67,17 @@ void LogFactory::reconfigure()
} }
} }
Logger* LogFactory::getInstance() { const SharedHandle<Logger>& LogFactory::getInstance()
{
if(!logger_) { if(!logger_) {
Logger* slogger = new Logger(); SharedHandle<Logger> slogger(new Logger());
try { openLogger(slogger);
openLogger(slogger);
} catch(RecoverableException& e) {
delete slogger;
throw;
}
if(consoleOutput_) { if(consoleOutput_) {
slogger->setStdoutLogLevel(Logger::A2_NOTICE, true); slogger->setStdoutLogLevel(Logger::A2_NOTICE, true);
slogger->setStdoutLogLevel(Logger::A2_WARN, true); slogger->setStdoutLogLevel(Logger::A2_WARN, true);
slogger->setStdoutLogLevel(Logger::A2_ERROR, true); slogger->setStdoutLogLevel(Logger::A2_ERROR, true);
} }
logger_ = slogger; logger_.swap(slogger);
} }
return logger_; return logger_;
} }
@ -118,8 +114,7 @@ void LogFactory::setLogLevel(const std::string& level)
} }
void LogFactory::release() { void LogFactory::release() {
delete logger_; logger_.reset();
logger_ = 0;
} }
} // namespace aria2 } // namespace aria2

View File

@ -40,24 +40,26 @@
#include <string> #include <string>
#include "Logger.h" #include "Logger.h"
#include "SharedHandle.h"
namespace aria2 { namespace aria2 {
class LogFactory { class LogFactory {
private: private:
static std::string filename_; static std::string filename_;
// TODO consider SharedHandle static SharedHandle<Logger> logger_;
static Logger* logger_;
static bool consoleOutput_; static bool consoleOutput_;
static Logger::LEVEL logLevel_; static Logger::LEVEL logLevel_;
static void openLogger(Logger* logger); static void openLogger(const SharedHandle<Logger>& logger);
LogFactory();
public: public:
/** /**
* Get logger instance. Returned logger is singleton. * Get logger instance. Returned logger is singleton.
* This function is not thread-safe. * This function is not thread-safe.
*/ */
static Logger* getInstance(); static const SharedHandle<Logger>& getInstance();
/** /**
* Set a filename to write log. If name is "-", log is written to * Set a filename to write log. If name is "-", log is written to
@ -69,7 +71,8 @@ public:
* Set flag whether the log is printed in console. * Set flag whether the log is printed in console.
* If f is false, log is not printed in console. * If f is false, log is not printed in console.
*/ */
static void setConsoleOutput(bool f) { static void setConsoleOutput(bool f)
{
consoleOutput_ = f; consoleOutput_ = f;
} }
@ -92,6 +95,39 @@ public:
static void reconfigure(); static void reconfigure();
}; };
#define A2_LOG_DEBUG_ENABLED \
aria2::LogFactory::getInstance()->levelEnabled(Logger::A2_DEBUG)
#define A2_LOG(level, msg) \
{ \
const aria2::SharedHandle<aria2::Logger>& logger = \
aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(level)) \
logger->log(level, __FILE__, __LINE__, msg); \
}
#define A2_LOG_EX(level, msg, ex) \
{ \
const aria2::SharedHandle<aria2::Logger>& logger = \
aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(level)) \
logger->log(level, __FILE__, __LINE__, msg, ex); \
}
#define A2_LOG_DEBUG(msg) A2_LOG(Logger::A2_DEBUG, msg)
#define A2_LOG_DEBUG_EX(msg, ex) A2_LOG_EX(Logger::A2_DEBUG, msg, ex)
#define A2_LOG_INFO(msg) A2_LOG(Logger::A2_INFO, msg)
#define A2_LOG_INFO_EX(msg, ex) A2_LOG_EX(Logger::A2_INFO, msg, ex)
#define A2_LOG_NOTICE(msg) A2_LOG(Logger::A2_NOTICE, msg)
#define A2_LOG_NOTICE_EX(msg, ex) A2_LOG_EX(Logger::A2_NOTICE, msg, ex)
#define A2_LOG_WARN(msg) A2_LOG(Logger::A2_WARN, msg)
#define A2_LOG_WARN_EX(msg, ex) A2_LOG_EX(Logger::A2_WARN, msg, ex)
#define A2_LOG_ERROR(msg) A2_LOG(Logger::A2_ERROR, msg)
#define A2_LOG_ERROR_EX(msg, ex) A2_LOG_EX(Logger::A2_ERROR, msg, ex)
} // namespace aria2 } // namespace aria2
#endif // D_LOG_FACTORY_H #endif // D_LOG_FACTORY_H

View File

@ -62,10 +62,7 @@ Logger::Logger()
stdoutField_(0) stdoutField_(0)
{} {}
Logger::~Logger() Logger::~Logger() {}
{
closeFile();
}
void Logger::openFile(const std::string& filename) void Logger::openFile(const std::string& filename)
{ {
@ -77,8 +74,6 @@ void Logger::openFile(const std::string& filename)
void Logger::closeFile() void Logger::closeFile()
{ {
std::cerr << "Closing log file" << std::endl;
// TODO Do we need file_.is_open()?
if(file_.is_open()) { if(file_.is_open()) {
file_.close(); file_.close();
} }

View File

@ -56,7 +56,10 @@ public:
private: private:
LEVEL logLevel_; LEVEL logLevel_;
std::ofstream file_; std::ofstream file_;
int stdoutField_; int stdoutField_;
// Don't allow copying
Logger(const Logger&);
Logger& operator=(const Logger&);
public: public:
Logger(); Logger();
@ -104,70 +107,6 @@ public:
bool levelEnabled(LEVEL level); bool levelEnabled(LEVEL level);
}; };
#define A2_LOG_DEBUG_ENABLED \
aria2::LogFactory::getInstance()->levelEnabled(Logger::A2_DEBUG)
#define A2_LOG_DEBUG(msg) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_DEBUG)) \
logger->log(Logger::A2_DEBUG, __FILE__, __LINE__, msg); \
}
#define A2_LOG_DEBUG_EX(msg, ex) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_DEBUG)) \
logger->log(Logger::A2_DEBUG, __FILE__, __LINE__, msg, ex); \
}
#define A2_LOG_INFO(msg) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_INFO)) \
logger->log(Logger::A2_INFO, __FILE__, __LINE__, msg); \
}
#define A2_LOG_INFO_EX(msg, ex) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_INFO)) \
logger->log(Logger::A2_INFO, __FILE__, __LINE__, msg, ex); \
}
#define A2_LOG_NOTICE(msg) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_NOTICE)) \
logger->log(Logger::A2_NOTICE, __FILE__, __LINE__, msg); \
}
#define A2_LOG_NOTICE_EX(msg, ex) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_NOTICE)) \
logger->log(Logger::A2_NOTICE, __FILE__, __LINE__, msg, ex); \
}
#define A2_LOG_WARN(msg) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_WARN)) \
logger->log(Logger::A2_WARN, __FILE__, __LINE__, msg); \
}
#define A2_LOG_WARN_EX(msg, ex) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_WARN)) \
logger->log(Logger::A2_WARN, __FILE__, __LINE__, msg, ex); \
}
#define A2_LOG_ERROR(msg) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_ERROR)) \
logger->log(Logger::A2_ERROR, __FILE__, __LINE__, msg); \
}
#define A2_LOG_ERROR_EX(msg, ex) \
{ \
aria2::Logger* logger = aria2::LogFactory::getInstance(); \
if(logger->levelEnabled(Logger::A2_ERROR)) \
logger->log(Logger::A2_ERROR, __FILE__, __LINE__, msg, ex); \
}
} // namespace aria2 } // namespace aria2
#endif // D_LOGGER_H #endif // D_LOGGER_H