rad 6.2.0
Loading...
Searching...
No Matches
Log.h
Go to the documentation of this file.
1
11#ifndef SCXML4CPP_LOG_H
12#define SCXML4CPP_LOG_H
13
14#include <log4cplus/logger.h>
15#include <log4cplus/loggingmacros.h>
16#include <log4cplus/configurator.h>
17#include <log4cplus/initializer.h>
18#include <string>
19
20#ifdef NDEBUG
21#define SCXML4CPP_LOG_TRACE()
22#else
23#define SCXML4CPP_LOG_TRACE() LOG4CPLUS_TRACE(scxml4cpp::GetLogger(), __FILE__ << " " << __FUNCTION__ << " " << __LINE__)
24#endif
25
26#define SCXML4CPP_LOG_INFO(msg) LOG4CPLUS_INFO(scxml4cpp::GetLogger(), msg)
27#define SCXML4CPP_LOG_DEBUG(msg) LOG4CPLUS_DEBUG(scxml4cpp::GetLogger(), msg)
28#define SCXML4CPP_LOG_WARNING(msg) LOG4CPLUS_WARN(scxml4cpp::GetLogger(), msg)
29#define SCXML4CPP_LOG_ERROR(msg) LOG4CPLUS_ERROR(scxml4cpp::GetLogger(), msg)
30#define SCXML4CPP_LOG_FATAL(msg) LOG4CPLUS_FATAL(scxml4cpp::GetLogger(), msg)
31
32
33namespace scxml4cpp {
34
35const std::string LOGGER_NAME = "scxml4cpp";
36
43void LogSetLevel(const std::string& levelName);
44
48log4cplus::Logger& GetLogger();
49
61public:
66 inline LogInitializer() {
67 log4cplus::BasicConfigurator().configure();
68 GetLogger().setLogLevel(log4cplus::INFO_LOG_LEVEL);
69 }
70
75 inline ~LogInitializer() = default;
76
79
80private:
81 log4cplus::Initializer mInitializer;
82};
83
84} // namespace scxml4cpp
85
86
87/*
88 * Obsolete logging.
89 */
90#if 0
91#include <sstream>
92#include <string>
93#include <stdio.h>
94#include <sys/time.h>
95
96namespace scxml4cpp {
97/*
98 * Supported Log Levels.
99 */
100const int LOG_LEVEL_ERROR = 0;
101const int LOG_LEVEL_WARNING = 1;
102const int LOG_LEVEL_INFO = 2;
103const int LOG_LEVEL_DEBUG = 3;
104const int LOG_LEVEL_DEBUG1 = 4;
105const int LOG_LEVEL_DEBUG2 = 5;
106const int LOG_LEVEL_DEBUG3 = 6;
107const int LOG_LEVEL_DEBUG4 = 7;
108const int LOG_LEVEL_TRACE = 8;
109const int LOG_MAX_LEVEL = LOG_LEVEL_TRACE;
110
111inline std::string LogNowTime();
112
113/*
114 * Log class.
115 * typename T is the output policy: stderr, stdout, Output2File, etc.
116 */
117template <typename T> class Log
118{
119 public:
120 Log() {}
121
125 virtual ~Log() {
126 os << std::endl;
127 T::Output(os.str());
128 }
129
134 inline std::ostringstream& Get(const int level = LOG_LEVEL_INFO) {
135 os << LogNowTime();
136 os << " " << ToString(level) << " ";
137 return os;
138 }
139
143 inline static int& ReportingLevel() {
144 static int reportingLevel = LOG_LEVEL_INFO;
145 return reportingLevel;
146 }
147
151 inline static std::string ToString(const int level) {
152 static const char* const buffer[] = {
153 "ERROR",
154 "WARNING",
155 "INFO",
156 "DEBUG",
157 "DEBUG1",
158 "DEBUG2",
159 "DEBUG3",
160 "DEBUG4",
161 "TRACE"
162 };
163 return (level >= LOG_LEVEL_ERROR && level <= LOG_MAX_LEVEL) ? buffer[level] : "INFO";
164 }
165
169 inline static int FromString(const std::string& level) {
170 if (level == "TRACE")
171 return LOG_LEVEL_TRACE;
172 if (level == "DEBUG4")
173 return LOG_LEVEL_DEBUG4;
174 if (level == "DEBUG3")
175 return LOG_LEVEL_DEBUG3;
176 if (level == "DEBUG2")
177 return LOG_LEVEL_DEBUG2;
178 if (level == "DEBUG1")
179 return LOG_LEVEL_DEBUG1;
180 if (level == "DEBUG")
181 return LOG_LEVEL_DEBUG;
182 if (level == "INFO")
183 return LOG_LEVEL_INFO;
184 if (level == "WARNING")
185 return LOG_LEVEL_WARNING;
186 if (level == "ERROR")
187 return LOG_LEVEL_ERROR;
188 Log<T>().Get(LOG_LEVEL_WARNING) << "Unknown logging level '" << level << "'. Using INFO level as default.";
189 return LOG_LEVEL_INFO;
190 }
191
192 protected:
193 std::ostringstream os;
194
195 private:
196 Log(const Log&);
197 Log& operator =(const Log&);
198};
199
203class Output2FILE
204{
205 public:
206 inline static FILE*& Stream() {
207 static FILE* pStream = stderr;
208 return pStream;
209 }
210
211 static void Output(const std::string& msg) {
212 FILE* pStream = Stream();
213 if (!pStream) return;
214
215 fprintf(pStream, "%s", msg.c_str());
216 fflush(pStream);
217 }
218};
219
223inline void LogSetLevel(const std::string& levelName) {
224 Log<scxml4cpp::Output2FILE>::ReportingLevel() = Log<scxml4cpp::Output2FILE>::FromString(levelName);
225}
226
232inline std::string LogNowTime()
233{
234 char buffer[64];
235 time_t t;
236 time(&t);
237 tm r = {0};
238 strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localtime_r(&t, &r));
239 struct timeval tv;
240 gettimeofday(&tv, 0);
241 char result[100] = {0};
242 sprintf(result, "%s.%06ld", buffer, (long)tv.tv_usec / 1000);
243 return result;
244}
245
246} // namespace scxml4cpp
247
251#define SCXML4CPP_LOG(level) \
252 if (level > scxml4cpp::LOG_MAX_LEVEL) ; \
253 else if (level > scxml4cpp::Log<scxml4cpp::Output2FILE>::ReportingLevel() || !scxml4cpp::Output2FILE::Stream()) ; \
254 else scxml4cpp::Log<scxml4cpp::Output2FILE>().Get(level) << "scxml4cpp " << __FILE__ << " " << __FUNCTION__ << " " << __LINE__ << " "
255
256#define SCXML4CPP_LOG_TRACE() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_TRACE)
257#define SCXML4CPP_LOG_DEBUG() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_DEBUG)
258#define SCXML4CPP_LOG_DEBUG1() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_DEBUG1)
259#define SCXML4CPP_LOG_DEBUG2() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_DEBUG2)
260#define SCXML4CPP_LOG_DEBUG3() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_DEBUG3)
261#define SCXML4CPP_LOG_DEBUG4() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_DEBUG4)
262#define SCXML4CPP_LOG_INFO() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_INFO)
263#define SCXML4CPP_LOG_WARNING() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_WARNING)
264#define SCXML4CPP_LOG_ERROR() SCXML4CPP_LOG(scxml4cpp::LOG_LEVEL_ERROR)
265#endif
266
267#endif //SCXML4CPP_LOG_H
Definition Log.h:60
LogInitializer()
Definition Log.h:66
LogInitializer & operator=(const LogInitializer &)=delete
LogInitializer(const LogInitializer &)=delete
@ LOG_LEVEL_DEBUG
Definition logger.hpp:199
@ LOG_LEVEL_DEBUG3
Definition logger.hpp:202
@ LOG_LEVEL_INFO
Definition logger.hpp:198
@ LOG_LEVEL_DEBUG2
Definition logger.hpp:201
@ LOG_LEVEL_TRACE
Definition logger.hpp:204
@ LOG_LEVEL_WARNING
Definition logger.hpp:193
@ LOG_LEVEL_DEBUG4
Definition logger.hpp:203
@ LOG_LEVEL_DEBUG1
Definition logger.hpp:200
@ LOG_LEVEL_ERROR
Definition logger.hpp:192
Definition Action.cpp:36
log4cplus::Logger & GetLogger()
Definition Log.cpp:46
void LogSetLevel(const std::string &levelName)
logger used by scxml4cpp library
Definition Log.cpp:38
const std::string LOGGER_NAME
Definition Log.h:35