1 #include "LogHandler.hpp"
2 
3 INITIALIZE_EASYLOGGINGPP
4 
5 namespace et {
setupLogHandler(int * argc,char *** argv)6 el::Configurations LogHandler::setupLogHandler(int *argc, char ***argv) {
7   // easylogging parse verbose arguments, see [Application Arguments]
8   // in https://github.com/muflihun/easyloggingpp/blob/master/README.md
9   START_EASYLOGGINGPP(*argc, *argv);
10   // GFLAGS parse command line arguments
11   gflags::ParseCommandLineFlags(argc, argv, true);
12 
13   // Easylogging configurations
14   el::Configurations defaultConf;
15   defaultConf.setToDefault();
16   // doc says %thread_name, but %thread is the right one
17   defaultConf.setGlobally(el::ConfigurationType::Format,
18                           "[%level %datetime %thread %fbase:%line] %msg");
19   defaultConf.setGlobally(el::ConfigurationType::Enabled, "true");
20   defaultConf.setGlobally(el::ConfigurationType::SubsecondPrecision, "3");
21   defaultConf.setGlobally(el::ConfigurationType::PerformanceTracking, "false");
22   defaultConf.setGlobally(el::ConfigurationType::LogFlushThreshold, "1");
23   defaultConf.set(el::Level::Verbose, el::ConfigurationType::Format,
24                   "[%levshort%vlevel %datetime %thread %fbase:%line] %msg");
25   return defaultConf;
26 }
27 
setupLogFile(el::Configurations * defaultConf,string filename,string maxlogsize)28 void LogHandler::setupLogFile(el::Configurations *defaultConf, string filename,
29                               string maxlogsize) {
30   // Enable strict log file size check
31   el::Loggers::addFlag(el::LoggingFlag::StrictLogFileSizeCheck);
32   defaultConf->setGlobally(el::ConfigurationType::Filename, filename);
33   defaultConf->setGlobally(el::ConfigurationType::ToFile, "true");
34   defaultConf->setGlobally(el::ConfigurationType::MaxLogFileSize, maxlogsize);
35 }
36 
rolloutHandler(const char * filename,std::size_t size)37 void LogHandler::rolloutHandler(const char *filename, std::size_t size) {
38   // SHOULD NOT LOG ANYTHING HERE BECAUSE LOG FILE IS CLOSED!
39   std::stringstream ss;
40   // REMOVE OLD LOG
41   ss << "rm " << filename;
42   system(ss.str().c_str());
43 }
44 
stderrToFile(const string & pathPrefix)45 string LogHandler::stderrToFile(const string &pathPrefix) {
46   time_t rawtime;
47   struct tm *timeinfo;
48   char buffer[80];
49   time(&rawtime);
50   timeinfo = localtime(&rawtime);
51   strftime(buffer, sizeof(buffer), "%Y-%m-%d_%I-%M", timeinfo);
52   string current_time(buffer);
53   string stderrFilename = pathPrefix + "_stderr_" + current_time;
54   FILE *stderr_stream = freopen(stderrFilename.c_str(), "w", stderr);
55   setvbuf(stderr_stream, NULL, _IOLBF, BUFSIZ);  // set to line buffering
56   return stderrFilename;
57 }
58 }  // namespace et
59