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