diff --git a/src/main/CommandHandler.cpp b/src/main/CommandHandler.cpp index 4c372b6655..5a26e64d5a 100644 --- a/src/main/CommandHandler.cpp +++ b/src/main/CommandHandler.cpp @@ -463,6 +463,7 @@ void CommandHandler::logRotate(std::string const& params, std::string& retStr) { retStr = "Log rotate..."; + Logging::rotateLogFile(); } void diff --git a/src/util/Logging.cpp b/src/util/Logging.cpp index 9a56462d21..f433bed0f0 100644 --- a/src/util/Logging.cpp +++ b/src/util/Logging.cpp @@ -19,6 +19,7 @@ namespace stellar { el::Configurations Logging::gDefaultConf; +int32_t Logging::logFileIndex; void Logging::setFmt(std::string const& peerID, bool timestamps) @@ -60,7 +61,10 @@ Logging::init() gDefaultConf.setToDefault(); gDefaultConf.setGlobally(el::ConfigurationType::ToStandardOutput, "true"); gDefaultConf.setGlobally(el::ConfigurationType::ToFile, "false"); + gDefaultConf.setGlobally(el::ConfigurationType::MaxLogFileSize, "1"); setFmt(""); + logFileIndex = 0; + el::Helpers::installPreRollOutCallback(rolloutHandler); } void @@ -71,6 +75,22 @@ Logging::setLoggingToFile(std::string const& filename) el::Loggers::reconfigureAllLoggers(gDefaultConf); } +void +Logging::rolloutHandler(const char* filename, std::size_t size) { + // size is there to match easylogging++ library template + std::stringstream ss_new_filename; + ss_new_filename << filename << "." << ++logFileIndex; + std::rename(filename, ss_new_filename.str().c_str()); + el::Loggers::removeFlag(el::LoggingFlag::StrictLogFileSizeCheck); +} + + +void +Logging::rotateLogFile() +{ + el::Loggers::addFlag(el::LoggingFlag::StrictLogFileSizeCheck); +} + el::Level Logging::getLogLevel(std::string const& partition) { diff --git a/src/util/Logging.h b/src/util/Logging.h index 4e8b34ae16..f11198f158 100644 --- a/src/util/Logging.h +++ b/src/util/Logging.h @@ -17,11 +17,14 @@ namespace stellar class Logging { static el::Configurations gDefaultConf; + static int32_t logFileIndex; public: static void init(); static void setFmt(std::string const& peerID, bool timestamps = true); static void setLoggingToFile(std::string const& filename); + static void rotateLogFile(); + static void rolloutHandler(const char* filename, std::size_t size); static void setLogLevel(el::Level level, const char* partition); static el::Level getLLfromString(std::string const& levelName); static el::Level getLogLevel(std::string const& partition);