@@ -21,6 +21,7 @@ along with OpenOCPP. If not, see <http://www.gnu.org/licenses/>.
2121
2222#include " FilenameMacro.h"
2323
24+ #include < functional>
2425#include < map>
2526#include < memory>
2627#include < sstream>
@@ -61,6 +62,23 @@ class LogDatabase;
6162#define LOG_LEVEL 2
6263#endif // LOG_LEVEL
6364
65+ #ifdef EXTERNAL_LOGGER
66+ /* * @brief Log level is set to 0 to generate all the logs
67+ * The leve filtering will be done by the external logger
68+ */
69+ #undef LOG_LEVEL
70+ #define LOG_LEVEL 0
71+
72+ // Use the external logger
73+ #define OPENOCPP_LOGGER ocpp::log::ExtLogger
74+
75+ #else
76+
77+ // Use the standard logger
78+ #define OPENOCPP_LOGGER ocpp::log::Logger
79+
80+ #endif // EXTERNAL_LOGGER
81+
6482/* * @brief Default log name */
6583#define DEFAULT_LOG_NAME " Logs"
6684
@@ -71,36 +89,36 @@ class LogDatabase;
7189
7290// Log macros
7391#if (LOG_LEVEL == 0)
74- #define LOG_DEBUG ocpp::log::Logger (" \x1b [32m[ DEBUG ]\x1b [0m" , 0 , __FILENAME__, LINE_TOSTRING(__LINE__))
75- #define LOG_DEBUG2 (logger_name ) ocpp::log::Logger (logger_name, " \x1b [32m[ DEBUG ]\x1b [0m" , 0 , __FILENAME__, LINE_TOSTRING(__LINE__))
92+ #define LOG_DEBUG OPENOCPP_LOGGER (" \x1b [32m[ DEBUG ]\x1b [0m" , 0 , __FILENAME__, LINE_TOSTRING(__LINE__))
93+ #define LOG_DEBUG2 (logger_name ) OPENOCPP_LOGGER (logger_name, " \x1b [32m[ DEBUG ]\x1b [0m" , 0 , __FILENAME__, LINE_TOSTRING(__LINE__))
7694#else
7795#define LOG_DEBUG ocpp::log::NullLogger ()
7896#define LOG_DEBUG2 (logger_name ) ocpp::log::NullLogger()
7997#endif
8098#if (LOG_LEVEL <= 1)
81- #define LOG_COM ocpp::log::Logger (" \x1b [34m[ COM ]\x1b [0m" , 1 , __FILENAME__, LINE_TOSTRING(__LINE__))
82- #define LOG_COM2 (logger_name ) ocpp::log::Logger (logger_name, " \x1b [34m[ COM ]\x1b [0m" , 1 , __FILENAME__, LINE_TOSTRING(__LINE__))
99+ #define LOG_COM OPENOCPP_LOGGER (" \x1b [34m[ COM ]\x1b [0m" , 1 , __FILENAME__, LINE_TOSTRING(__LINE__))
100+ #define LOG_COM2 (logger_name ) OPENOCPP_LOGGER (logger_name, " \x1b [34m[ COM ]\x1b [0m" , 1 , __FILENAME__, LINE_TOSTRING(__LINE__))
83101#else
84102#define LOG_COM ocpp::log::NullLogger ()
85103#define LOG_COM2 (logger_name ) ocpp::log::NullLogger()
86104#endif
87105#if (LOG_LEVEL <= 2)
88- #define LOG_INFO ocpp::log::Logger (" \x1b [30m[ INFO ]\x1b [0m" , 2 , __FILENAME__, LINE_TOSTRING(__LINE__))
89- #define LOG_INFO2 (logger_name ) ocpp::log::Logger (logger_name, " \x1b [30m[ INFO ]\x1b [0m" , 2 , __FILENAME__, LINE_TOSTRING(__LINE__))
106+ #define LOG_INFO OPENOCPP_LOGGER (" \x1b [30m[ INFO ]\x1b [0m" , 2 , __FILENAME__, LINE_TOSTRING(__LINE__))
107+ #define LOG_INFO2 (logger_name ) OPENOCPP_LOGGER (logger_name, " \x1b [30m[ INFO ]\x1b [0m" , 2 , __FILENAME__, LINE_TOSTRING(__LINE__))
90108#else
91109#define LOG_INFO ocpp::log::NullLogger ()
92110#define LOG_INFO2 (logger_name ) ocpp::log::NullLogger()
93111#endif
94112#if (LOG_LEVEL <= 3)
95- #define LOG_WARNING ocpp::log::Logger (" \x1b [33m[WARNING]\x1b [0m" , 3 , __FILENAME__, LINE_TOSTRING(__LINE__))
96- #define LOG_WARNING2 (logger_name ) ocpp::log::Logger (logger_name, " \x1b [33m[WARNING]\x1b [0m" , 3 , __FILENAME__, LINE_TOSTRING(__LINE__))
113+ #define LOG_WARNING OPENOCPP_LOGGER (" \x1b [33m[WARNING]\x1b [0m" , 3 , __FILENAME__, LINE_TOSTRING(__LINE__))
114+ #define LOG_WARNING2 (logger_name ) OPENOCPP_LOGGER (logger_name, " \x1b [33m[WARNING]\x1b [0m" , 3 , __FILENAME__, LINE_TOSTRING(__LINE__))
97115#else
98116#define LOG_WARNING ocpp::log::NullLogger ()
99117#define LOG_WARNING2 (logger_name ) ocpp::log::NullLogger()
100118#endif
101119#if (LOG_LEVEL <= 4)
102- #define LOG_ERROR ocpp::log::Logger (" \x1b [31m[ ERROR ]\x1b [0m" , 4 , __FILENAME__, LINE_TOSTRING(__LINE__))
103- #define LOG_ERROR2 (logger_name ) ocpp::log::Logger (logger_name, " \x1b [31m[ ERROR ]\x1b [0m" , 4 , __FILENAME__, LINE_TOSTRING(__LINE__))
120+ #define LOG_ERROR OPENOCPP_LOGGER (" \x1b [31m[ ERROR ]\x1b [0m" , 4 , __FILENAME__, LINE_TOSTRING(__LINE__))
121+ #define LOG_ERROR2 (logger_name ) OPENOCPP_LOGGER (logger_name, " \x1b [31m[ ERROR ]\x1b [0m" , 4 , __FILENAME__, LINE_TOSTRING(__LINE__))
104122#else
105123#define LOG_ERROR ocpp::log::NullLogger ()
106124#define LOG_ERROR2 (logger_name ) ocpp::log::NullLogger()
@@ -187,6 +205,55 @@ class NullLogger
187205 }
188206};
189207
208+ /* * @brief External logger */
209+ class ExtLogger
210+ {
211+ public:
212+ /* * @brief Constructor */
213+ ExtLogger (const char * level_str, unsigned int level, const char * filename, const char * line);
214+ /* * @brief Constructor */
215+ ExtLogger (const char * name, const char * level_str, unsigned int level, const char * filename, const char * line);
216+
217+ /* * @brief Destructor */
218+ virtual ~ExtLogger ();
219+
220+ /* *
221+ * @brief Generic log operator
222+ * @param input Data to log
223+ * @return Logger's instance
224+ */
225+ template <typename T>
226+ ExtLogger& operator <<(const T& input)
227+ {
228+ m_log_output << input;
229+ return (*this );
230+ }
231+
232+ /* *
233+ * @brief Log operator for boolean values
234+ * @param input Data to log
235+ * @return Logger's instance
236+ */
237+ ExtLogger& operator <<(bool input)
238+ {
239+ static const char * BOOL_STRING[] = {" false" , " true" };
240+ m_log_output << BOOL_STRING[static_cast <int >(input)];
241+ return (*this );
242+ }
243+
244+ /* * @brief Register an external logging function */
245+ static void registerLogFunction (std::function<void (unsigned int , const std::string&)> log_function);
246+
247+ private:
248+ /* * @brief Log output */
249+ std::stringstream m_log_output;
250+ /* * @brief Log level */
251+ unsigned int m_level;
252+
253+ /* * @brief External logging function */
254+ static std::function<void (unsigned int , const std::string&)> m_log_function;
255+ };
256+
190257} // namespace log
191258} // namespace ocpp
192259
0 commit comments