• Main Page
  • Modules
  • Classes
  • Files
  • File List

D:/Projekt/ECF_trunk/ECF/Logger.cpp

00001 #include <iostream>
00002 #include "ECF_base.h"
00003 
00004 
00005 Logger::Logger()
00006 {
00007     currentLevel_ = 3;
00008     bFileDefined_ = false;
00009     logFrequency_ = 1;
00010 }
00011 
00012 
00013 Logger::~Logger()
00014 {
00015     logFile_.close();
00016 }
00017 
00018 
00019 void Logger::registerParameters(StateP state)
00020 {
00021     uint *level = new uint(3);
00022     state->getRegistry()->registerEntry("log.level", (voidP) level, ECF::UINT);
00023     std::string *file = new std::string("");
00024     state->getRegistry()->registerEntry("log.filename", (voidP) file, ECF::STRING);
00025     uint *freq = new uint(1);
00026     state->getRegistry()->registerEntry("log.frequency", (voidP) freq, ECF::UINT);
00027 }
00028 
00029 
00030 bool Logger::initialize(StateP state)
00031 {
00032     if(logFile_.is_open())
00033         logFile_.close();
00034 
00035     //reads parameters from registry
00036     voidP sptr = state->getRegistry()->getEntry("log.level");
00037     currentLevel_ = *((uint*) sptr.get());
00038     sptr = state->getRegistry()->getEntry("log.frequency");
00039     logFrequency_ = *((uint*) sptr.get());
00040 
00041     if(state->getRegistry()->isModified("log.filename")) {
00042         sptr = state->getRegistry()->getEntry("log.filename");
00043         logFileName_ = *((std::string*) sptr.get());
00044 
00045         logFile_.open(logFileName_.c_str());
00046         if(logFile_)
00047             bFileDefined_ = true;
00048         else {
00049             throw std::string("Error: can't open logfile (") + logFileName_ + ")";
00050         }
00051     }
00052     else
00053         bFileDefined_ = false;
00054 
00055     state_ = state;
00056     return true;
00057 }
00058 
00059 
00060 void Logger::log(int logLevel, std::string message)
00061 {
00062     if(currentLevel_ >= logLevel) {
00063         Log tmp;
00064         if(logLevel > 5) logLevel = 5;
00065         if(logLevel < 0) logLevel = 0;
00066 
00067 #ifdef _MPI
00068         message = uint2str(state_->getCommunicator()->getCommGlobalRank()) + ": " + message;
00069 #endif
00070 
00071         logs_.push_back(tmp);
00072         logs_.back().logLevel = logLevel;
00073         logs_.back().message = message;
00074 
00075         if(logLevel == 1 || state_->getGenerationNo() % logFrequency_ == 0)
00076             std::cout << logs_.back().message << std::endl;
00077     }
00078 }
00079 
00080 
00081 void Logger::saveTo(std::string fileName) 
00082 {
00083     std::ofstream logFile(fileName.c_str(),std::ios::app);
00084     for (unsigned int i = 0; i < logs_.size(); ++i){
00085         logFile << logs_[i].message << std::endl;
00086     }
00087 
00088     logFile.close(); 
00089     logs_.clear();
00090 }
00091 
00092 
00093 void Logger::saveTo(bool check) 
00094 {
00095     if(!bFileDefined_) {
00096         logs_.clear();
00097         return;
00098     }
00099 
00100     if(!check && state_->getGenerationNo() > 1 && state_->getGenerationNo() % logFrequency_ != 0) {
00101         logs_.clear();
00102         return;
00103     }
00104 
00105     std::stringstream logOutput;
00106 
00107     for (unsigned int i = 0; i < logs_.size(); ++i) {
00108         logOutput << logs_[i].message << std::endl;
00109     }
00110 
00111 #ifdef _MPI
00112     if(state_->getCommunicator()->getCommGlobalSize() != 1) {
00113 
00114         if(state_->getCommunicator()->getCommGlobalRank() == 0) {
00115             std::string remoteLogs = state_->getCommunicator()->recvLogsGlobal();
00116             logFile_ << logOutput.str() << remoteLogs;
00117         }
00118         else {
00119             state_->getCommunicator()->sendLogsGlobal(logOutput.str());
00120         }
00121     }
00122 
00123     else
00124         logFile_ << logOutput.str();
00125 #else
00126     logFile_ << logOutput.str();
00127 #endif
00128 
00129     logs_.clear();
00130 }
00131 
00132 
00133 void Logger::saveToX(std::string fileName)
00134 {
00135     std::ofstream logFile(fileName.c_str(), std::ios::app);
00136     logFile<<"<log>"<<std::endl;
00137 
00138     for (unsigned int i = 0; i < logs_.size(); ++i){    
00139         logFile <<"<message logLevel=\""<< logs_[i].logLevel << "\">" << logs_[i].message <<"</message>"<< std::endl;
00140     }
00141     logFile<<"</log>";
00142 
00143     logFile.close();
00144     logs_.clear();
00145 }
00146 
00147 
00148 void Logger::saveToX()
00149 {
00150     if(!bFileDefined_)
00151         return;
00152     logFile_ << "<log>" << std::endl;
00153     for (unsigned int i = 0; i < logs_.size(); ++i){    
00154         logFile_ <<"<message logLevel=\""<< logs_[i].logLevel << "\">" << logs_[i].message <<"</message>"<< std::endl;
00155     }
00156     logFile_ << "</log>";
00157 
00158     logs_.clear();
00159 }
00160 
00161 
00162 void Logger::flushLog() 
00163 {
00164     logs_.clear();
00165 }
00166 
00167 
00168 bool Logger::operate(StateP state)
00169 {
00170     saveTo();
00171     return true;
00172 }
00173 
00174 
00175 void Logger::setLogFrequency(uint freq)
00176 {
00177     logFrequency_ = freq;
00178 }

Generated on Fri Jul 5 2013 09:34:23 for ECF by  doxygen 1.7.1