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
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 }