DDS  ver. 3.6
Logger.h
Go to the documentation of this file.
1 // Copyright 2014 GSI, Inc. All rights reserved.
2 //
3 // Log engine core.
4 //
5 #ifndef _DDS_LOGGER_H_
6 #define _DDS_LOGGER_H_
7 
8 // BOOST
9 #ifndef BOOST_LOG_DYN_LINK
10 #define BOOST_LOG_DYN_LINK
11 #endif
12 #include <boost/date_time/posix_time/posix_time_types.hpp>
13 #include <boost/log/attributes/current_process_id.hpp>
14 #include <boost/log/attributes/current_process_name.hpp>
15 #include <boost/log/attributes/current_thread_id.hpp>
16 #include <boost/log/expressions.hpp>
17 #include <boost/log/sources/global_logger_storage.hpp>
18 #include <boost/log/sources/logger.hpp>
19 #include <boost/log/sources/record_ostream.hpp>
20 #include <boost/log/sources/severity_logger.hpp>
21 #include <boost/log/support/date_time.hpp>
22 #include <boost/log/utility/setup/common_attributes.hpp>
23 #include <boost/log/utility/setup/console.hpp>
24 #include <boost/log/utility/setup/file.hpp>
25 // STD
26 #include <fstream>
27 #include <ostream>
28 
29 // DDS
30 #include "SysHelper.h"
31 #include "UserDefaults.h"
32 #include "def.h"
33 
34 #define LOG(severity) BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), severity)
35 
36 // Convenience functions
37 #define P_H BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::proto_high)
38 #define P_M BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::proto_mid)
39 #define P_L BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::proto_low)
40 #define DBG BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::debug)
41 #define INF BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::info)
42 #define WRN BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::warning)
43 #define ERR BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::error)
44 #define FAT BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::fatal)
45 #define STDOUT BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::log_stdout)
46 #define STDOUT_CLEAN BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::log_stdout_clean)
47 #define STDERR BOOST_LOG_SEV(dds::misc::Logger::instance().logger(), dds::misc::log_stderr)
48 
49 namespace dds::misc
50 {
52 
53  class Logger
54  {
55  private:
56  typedef boost::shared_ptr<boost::log::sinks::synchronous_sink<boost::log::sinks::text_file_backend>> fileSink_t;
57 
58  public:
59  typedef boost::log::sources::severity_logger_mt<ELogSeverityLevel> logger_t;
60 
62  static Logger& instance()
63  {
64  static Logger instance;
65  return instance;
66  }
67 
68  logger_t& logger()
69  {
70  return fLogger;
71  }
72 
74  void init()
75  {
76  static bool bStarted = false;
77  if (bStarted)
78  return;
79 
80  bStarted = true;
81 
82  using namespace boost::log;
83 
84  const dds::user_defaults_api::CUserDefaults& userDefaults =
86 
87  unsigned int hasConsoleOutput = userDefaults.getOptions().m_server.m_logHasConsoleOutput;
88 
89  m_fileSink = createFileSink();
90 
91  // Logging to console
92  typedef boost::shared_ptr<sinks::synchronous_sink<sinks::text_ostream_backend>> ostreamSink_t;
93  ostreamSink_t stdoutSink = add_console_log(std::cout, keywords::format = "%Process%: %Message%");
94  ostreamSink_t stdoutCleanSink = add_console_log(std::cout, keywords::format = "%Message%");
95  ostreamSink_t stderrSink = add_console_log(std::cerr, keywords::format = "%Process%: error: %Message%");
96 
97  stdoutSink->set_filter(severity == log_stdout && hasConsoleOutput);
98  stdoutCleanSink->set_filter(severity == log_stdout_clean && hasConsoleOutput);
99  stderrSink->set_filter(severity == log_stderr && hasConsoleOutput);
100 
101  add_common_attributes();
102  core::get()->add_global_attribute("Process", attributes::current_process_name());
103 
104  LOG(info) << "Log engine is initialized with severety \""
105  << userDefaults.getOptions().m_server.m_logSeverityLevel << "\"";
106  }
107 
108  void reinit()
109  {
110  boost::log::core::get()->remove_sink(m_fileSink);
111  m_fileSink.reset();
112  m_fileSink = createFileSink();
113  }
114 
115  private:
116  fileSink_t createFileSink() const
117  {
118  using namespace boost::log;
119 
120  const dds::user_defaults_api::CUserDefaults& userDefaults =
122  unsigned int severityLevel = userDefaults.getOptions().m_server.m_logSeverityLevel;
123  unsigned int rotationSize = userDefaults.getOptions().m_server.m_logRotationSize;
124  std::string sLogFile = userDefaults.getLogFile();
125 
126  // Default format for logger
127  formatter formatter =
128  // TODO: std::setw doesn't work for the first collumn of the log (TimeStamp). Investigate!
129  expressions::stream << std::left
130  << expressions::format_date_time<boost::posix_time::ptime>("TimeStamp",
131  "%Y-%m-%d %H:%M:%S.%f")
132  << " " << std::setw(7) << expressions::attr<ELogSeverityLevel>("Severity")
133  << std::setw(20) << expressions::attr<std::string>("Process") << " <"
134  << expressions::attr<attributes::current_process_id::value_type>("ProcessID") << ":"
135  << expressions::attr<attributes::current_thread_id::value_type>("ThreadID")
136  << "> " << expressions::smessage;
137 
138  fileSink_t fileSink =
139  add_file_log(keywords::file_name = sLogFile,
140  keywords::open_mode = (std::ios::out | std::ios::app),
141  keywords::rotation_size = rotationSize * 1024 * 1024,
142  // rotate at midnight every day
143  keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
144  // log collector,
145  // -- maximum total size of the stored log files is 1GB.
146  // -- minimum free space on the drive is 2GB
147  keywords::max_size = 1000 * 1024 * 1024,
148  keywords::min_free_space = 2000 * 1024 * 1024,
149  keywords::auto_flush = true);
150 
151  fileSink->set_formatter(formatter);
152  fileSink->set_filter(severity >= severityLevel);
153 
154  return fileSink;
155  }
156 
157  private:
158  logger_t fLogger;
159 
160  fileSink_t m_fileSink;
161  };
162 }; // namespace dds::misc
163 #endif //_DDS_LOGGER_H_
std::string getLogFile() const
Definition: UserDefaults.cpp:420
dds::misc::ELogSeverityLevel m_logSeverityLevel
Log rotation size in MB.
Definition: dds-user-defaults/src/Options.h:29
const SDDSUserDefaultsOptions_t getOptions() const
Definition: UserDefaults.cpp:317
#define LOG(severity)
Definition: Logger.h:34
unsigned int m_logRotationSize
True if output log also to console.
Definition: dds-user-defaults/src/Options.h:31
Definition: def.h:151
ELogSeverityLevel
Log Severity levels.
Definition: def.h:141
Definition: def.h:152
bool m_logHasConsoleOutput
Idle time in [s] after which process will be killed by monitoring thread.
Definition: dds-user-defaults/src/Options.h:33
Definition: def.h:147
Definition: UserDefaults.h:21
static CUserDefaults & instance(const boost::uuids::uuid &_sid=CUserDefaults::getInitialSID())
Return singleton instance.
Definition: UserDefaults.cpp:37
Definition: def.h:153
BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", ELogSeverityLevel) class Logger
Definition: Logger.h:51
SDDSServerOptions m_server
Definition: dds-user-defaults/src/Options.h:54
Definition: BoostHelper.h:14