RTI Routing Service  Version 6.0.0
 All Data Structures Files Functions Typedefs Enumerations Enumerator Groups Pages
service/log/LogConfig.hpp
1 /*
2  (c) Copyright, Real-Time Innovations, 2017-
3  All rights reserved.
4 
5  No duplications, whole or partial, manual or electronic, may be made without
6  express written permission. Any such copies, or revisions thereof, must
7  display this notice unaltered.
8 
9  This code contains trade secrets of Real-Time Innovations, Inc.
10 */
11 
12 #ifndef HPP_SERVICE_LOG_CONFIG_HPP_
13 #define HPP_SERVICE_LOG_CONFIG_HPP_
14 
15 #include <cstdio>
16 #include <cstdarg>
17 
18 #include "log/log_common.h"
19 
20 #include <rti/config/Logger.hpp>
21 #include <rti/service/ServiceException.hpp>
22 
23 #define RTI_SUBMODULE_MASK_ALL (0xFFFF)
24 
25 namespace rti { namespace service { namespace log {
26 
27 class LogConfig {
28 public:
29 
30  static LogConfig& instance()
31  {
32  static LogConfig singleton;
33  return singleton;
34  }
35 
36  RTILogBitmap instrumentation_mask() const
37  {
38  return instrumentation_mask_;
39  }
40 
41  LogConfig& instrumentation_mask(RTILogBitmap logmask)
42  {
43  instrumentation_mask_ = logmask;
44  return *this;
45  }
46 
47  rti::config::Verbosity verbosity()
48  {
49  return static_cast<rti::config::Verbosity::type>(instrumentation_mask_);
50  }
51 
52  void verbosity(rti::config::Verbosity verbosity)
53  {
54  instrumentation_mask(
55  static_cast<RTILogBitmap>(verbosity.underlying()));
56  }
57 
58  ~LogConfig()
59  {
60  }
61 
62  static RTILogBitmap mask_all()
63  {
64  return RTI_SUBMODULE_MASK_ALL;
65  }
66 
67  static RTILogBitmap mask_none()
68  {
69  return 0;
70  }
71 
72 protected:
73 
74  // Constructor is private: this class is a singleton
75  LogConfig()
76  : instrumentation_mask_(RTI_LOG_BIT_EXCEPTION)
77  {
78  RTILog_printMask |= RTI_LOG_PRINT_BIT_AT_METHOD;
79  }
80 
81  RTILogBitmap instrumentation_mask_;
82 };
83 
84 inline
85 rti::config::Verbosity dds_verbosity_from_level(int32_t level)
86 {
87  switch (level) {
88  case 6:
89  return rti::config::Verbosity::STATUS_REMOTE;
90  case 5:
91  /* no break */
92  case 4:
93  return rti::config::Verbosity::WARNING;
94  case 3:
95  /* no break */
96  case 2:
97  /* no break */
98  case 1:
99  return rti::config::Verbosity::EXCEPTION;
100  case 0:
101  return rti::config::Verbosity::SILENT;
102  default:
103  return rti::config::Verbosity::EXCEPTION;
104  }
105 }
106 
107 inline
108 rti::config::Verbosity service_verbosity_from_level(int32_t level)
109 {
110  RTILogBitmap native_verbosity = RTI_LOG_BIT_SILENCE;
111 
112  switch (level) {
113  /* no break */
114  case 6:
115  native_verbosity |= RTI_LOG_BIT_CONTENT;
116  /* no break */
117  case 5:
118  native_verbosity |= RTI_LOG_BIT_PERIODIC;
119  /* no break */
120  case 4:
121  /* no break */
122  native_verbosity |= RTI_LOG_BIT_REMOTE;
123  case 3:
124  native_verbosity |= RTI_LOG_BIT_LOCAL;
125  /* no break */
126  case 2:
127  native_verbosity |= RTI_LOG_BIT_WARN;
128  /* no break */
129  case 1:
130  native_verbosity |= RTI_LOG_BIT_EXCEPTION;
131  break;
132  case 0:
133  break;
134  default:
135  native_verbosity = RTI_LOG_BIT_EXCEPTION;
136  break;
137  }
138 
139  return static_cast<rti::config::Verbosity::type>(native_verbosity);
140 
141 }
142 
143 /*
144  * Example:
145  * MyCatcherMethod: caught exception from:
146  * MyThrowerMethod:!init failure
147  */
148 inline void log_service_exception(
149  rti::service::log::LogConfig& log_config,
150  const rti::service::ServiceException& exception,
151  const char *catch_context)
152 {
153  RTILogMessage log_message;
154 
155  log_message.format = "caught exception from:\n %s";
156  log_message.logNumber = exception.error_code();
157 
158  RTILog_logWithContext(
159  DEFINE_MODULE_NUMBER(MODULE_NS),
160  log_config.instrumentation_mask(),
161  RTI_SUBMODULE_MASK_ALL,
162  RTI_LOG_BIT_EXCEPTION,
163  RTI_SUBMODULE_MASK_ALL,
164  catch_context,
165  &log_message,
166  exception.what());
167 }
168 
169 
170 } } } /* namespace rti::service::log */
171 
172 
173 
174 /*
175  * --- C-like logger macros ---------------------------------------------------
176  */
177 #define SERVICELog_fromException(SERVICE_EXCEPTION) \
178  rti::service::log::log_service_exception(\
179  (MODULE_LOG_CONFIG), \
180  SERVICE_EXCEPTION, \
181  RTI_FUNCTION_NAME)
182 
183 #define SERVICELog_freeForm(INSTRUMENT_BIT, ...) \
184  RTILog_logFreeForm(\
185  (MODULE_LOG_CONFIG).instrumentation_mask(), \
186  RTI_SUBMODULE_MASK_ALL, \
187  (INSTRUMENT_BIT), \
188  RTI_SUBMODULE_MASK_ALL, \
189  __VA_ARGS__)
190 
191 #define SERVICELog_logMessage(INSTRUMENT_BIT, ...) \
192  if ((RTILog_setLogLevel != NULL) \
193  && ((MODULE_LOG_CONFIG).instrumentation_mask() & (INSTRUMENT_BIT)) \
194  && RTI_SUBMODULE_MASK_ALL) { \
195  RTILog_setLogLevel((INSTRUMENT_BIT)); \
196  } \
197  if (((MODULE_LOG_CONFIG).instrumentation_mask() & ((INSTRUMENT_BIT))) \
198  && RTI_SUBMODULE_MASK_ALL) \
199  RTILog_printContextAndMsg(NULL, __VA_ARGS__)
200 
201 #define SERVICELog_logWithMethodName(INSTRUMENT_BIT, ...) \
202  RTILog_logWithContext(\
203  DEFINE_MODULE_NUMBER(MODULE_NS), \
204  (MODULE_LOG_CONFIG).instrumentation_mask(), \
205  RTI_SUBMODULE_MASK_ALL, \
206  (INSTRUMENT_BIT), \
207  RTI_SUBMODULE_MASK_ALL, \
208  __VA_ARGS__)
209 
210 #define SERVICELog_exception( ...) \
211  RTILog_log(\
212  DEFINE_MODULE_NUMBER(MODULE_NS), \
213  (MODULE_LOG_CONFIG).instrumentation_mask(), \
214  RTI_SUBMODULE_MASK_ALL, \
215  RTI_LOG_BIT_EXCEPTION, \
216  RTI_SUBMODULE_MASK_ALL, \
217  __VA_ARGS__)
218 
219 #define SERVICELog_warn( ...) \
220  RTILog_log(\
221  DEFINE_MODULE_NUMBER(MODULE_NS), \
222  (MODULE_LOG_CONFIG).instrumentation_mask(), \
223  RTI_SUBMODULE_MASK_ALL, \
224  RTI_LOG_BIT_WARN, \
225  RTI_SUBMODULE_MASK_ALL, \
226  __VA_ARGS__)
227 
228 #define SERVICELog_local( ...) \
229  RTILog_log(\
230  DEFINE_MODULE_NUMBER(MODULE_NS), \
231  (MODULE_LOG_CONFIG).instrumentation_mask(), \
232  RTI_SUBMODULE_MASK_ALL, \
233  RTI_LOG_BIT_LOCAL, \
234  RTI_SUBMODULE_MASK_ALL, \
235  __VA_ARGS__)
236 
237 #define SERVICELog_content( ...) \
238  RTILog_log(\
239  DEFINE_MODULE_NUMBER(MODULE_NS), \
240  (MODULE_LOG_CONFIG).instrumentation_mask(), \
241  RTI_SUBMODULE_MASK_ALL, \
242  RTI_LOG_BIT_CONTENT, \
243  RTI_SUBMODULE_MASK_ALL, \
244  __VA_ARGS__)
245 
246 #define SERVICELog_remote( ...) \
247  RTILog_log(\
248  DEFINE_MODULE_NUMBER(MODULE_NS), \
249  (MODULE_LOG_CONFIG).instrumentation_mask(), \
250  RTI_SUBMODULE_MASK_ALL, \
251  RTI_LOG_BIT_REMOTE, \
252  RTI_SUBMODULE_MASK_ALL, \
253  __VA_ARGS__)
254 
255 
256 #define SERVICELog_any(INSTRUMENT_BIT, ...) \
257  if ((RTILog_setLogLevel != NULL) \
258  && (((MODULE_LOG_CONFIG).instrumentation_mask()) & (INSTRUMENT_BIT)) \
259  && ((RTI_SUBMODULE_MASK_ALL) & (RTI_SUBMODULE_MASK_ALL))) { \
260  RTILog_setLogLevel((INSTRUMENT_BIT)); \
261  } \
262  if ((((MODULE_LOG_CONFIG).instrumentation_mask()) & (INSTRUMENT_BIT)) \
263  && ((RTI_SUBMODULE_MASK_ALL) & (RTI_SUBMODULE_MASK_ALL)))
264 
265 #define SERVICELog_flushActivityContextWithAction(INSTRUMENT_BIT, ACTION) \
266  if ((RTILog_setLogLevel != NULL) \
267  && ((MODULE_LOG_CONFIG).instrumentation_mask() & (INSTRUMENT_BIT)) \
268  && RTI_SUBMODULE_MASK_ALL) { \
269  RTILog_setLogLevel((INSTRUMENT_BIT)); \
270  } \
271  if (((MODULE_LOG_CONFIG).instrumentation_mask() & ((INSTRUMENT_BIT))) \
272  && RTI_SUBMODULE_MASK_ALL) \
273  RTILog_printContextAndMsg("", &RTI_LOG_ANY_s, (ACTION));
274 
275 #define SERVICELog_flushActivityContext(INSTRUMENT_BIT) \
276  SERVICELog_logMessage((INSTRUMENT_BIT), &RTI_LOG_ANY_s, "");
277 
278 #endif /* HPP_SERVICE_LOG_CONFIG_HPP_ */

RTI Routing Service Version 6.0.0 Copyright © Sun Mar 3 2019 Real-Time Innovations, Inc