LAMA
/home/brandes/workspace/LAMA/src/lama/solver/logger/Logger.hpp
Go to the documentation of this file.
00001 
00033 #ifndef LAMA_SOLVER_LOGGER_HPP_
00034 #define LAMA_SOLVER_LOGGER_HPP_
00035 
00036 // for dll_import
00037 #include <lama/config.hpp>
00038 
00039 // base classes
00040 #include <lama/NonCopyable.hpp>
00041 
00042 // others
00043 #include <lama/solver/logger/LogLevel.hpp>
00044 #include <lama/solver/logger/LoggerWriteBehaviour.hpp>
00045 #include <lama/solver/logger/Timer.hpp>
00046 
00047 #include <lama/norm/Norm.hpp>
00048 
00049 #include <string>
00050 #include <sstream>
00051 #include <memory>
00052 
00053 namespace lama
00054 {
00055 
00056 class Solver;
00057 class Logger;
00058 
00059 typedef boost::shared_ptr<Logger> LoggerPtr;
00060 
00068 class LAMA_DLL_IMPORTEXPORT Logger : private NonCopyable
00069 {
00070 public:
00071 
00077     const std::string& id() const;
00078 
00095     Logger(const std::string& id,
00096            LogLevel::LogLevel level,
00097            LoggerWriteBehaviour::LoggerWriteBehaviour writeBehaviour,
00098            bool ignoreRank = false);
00099 
00118     Logger(const std::string& id,
00119            LogLevel::LogLevel level,
00120            LoggerWriteBehaviour::LoggerWriteBehaviour writeBehaviour,
00121            std::auto_ptr<Timer> timer,
00122            bool ignoreRank = false);
00123 
00150     Logger(const std::string& id,
00151            LogLevel::LogLevel level,
00152            LoggerWriteBehaviour::LoggerWriteBehaviour writeBehaviour,
00153            const std::string& logFileName,
00154            std::auto_ptr<Timer> timer,
00155            bool ignoreRank = false);
00156 
00160     virtual ~Logger();
00161 
00167     LogLevel::LogLevel getLogLevel() const;
00168 
00174     void setLogLevel(LogLevel::LogLevel level);
00175 
00184     void logMessage(LogLevel::LogLevel level, const std::string& message);
00185 
00191     void logNewLine(LogLevel::LogLevel level);
00192 
00201     void logResidual(LogLevel::LogLevel level, const Solver& solver, const Norm& norm, const std::string iterationPrefix = "");
00202 
00214     void logTime(const std::string& timerId,
00215                  LogLevel::LogLevel level,
00216                  const std::string& message);
00217 
00225     void startTimer(const std::string& timerId);
00226 
00237     void stopTimer(const std::string& timerId);
00238 
00246     void stopAndResetTimer(const std::string& timerId);
00247 
00259     template<typename T>
00260     void logType( LogLevel::LogLevel level, const std::string& message, T arg );
00261 
00262 protected:
00263 
00270     virtual void logString(
00271         LogLevel::LogLevel level,
00272         const std::string& message);
00273 
00279     virtual void logString(const std::string& message);
00280 
00287     virtual std::string createPrefix() = 0;
00288 
00292     std::auto_ptr<Timer> mTimer;
00293 
00294     std::string mId;
00295 
00296     LAMA_LOG_DECL_STATIC_LOGGER(logger);
00297 
00298 private:
00299     LogLevel::LogLevel mLogLevel;
00300     LoggerWriteBehaviour::LoggerWriteBehaviour mWriteBehaviour;
00301     bool mIgnoreRank;
00302 };
00303 
00304 template<typename T>
00305 void Logger::logType(LogLevel::LogLevel level,
00306                      const std::string& message,
00307                      T arg)
00308 {
00309     if (level <= mLogLevel)
00310     {
00311         std::stringstream intStream;
00312         intStream << message;
00313         intStream << arg;
00314         intStream << "\n";
00315 
00316         logString(level, intStream.str());
00317     }
00318 }
00319 
00320 }  // namespace lama
00321 
00322 #endif // LAMA_SOLVER_LOGGER_HPP_