vxlan: vxlan/vxlan.api API cleanup
[vpp.git] / extras / vom / vom / logger.cpp
1 /*
2  * Copyright (c) 2017 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #include <chrono>
17 #include <ctime>
18 #include <vector>
19
20 #include <boost/algorithm/string.hpp>
21
22 #include "vom/logger.hpp"
23
24 namespace VOM {
25 const log_level_t log_level_t::CRITICAL(4, "critical");
26 const log_level_t log_level_t::ERROR(3, "error");
27 const log_level_t log_level_t::WARNING(2, "warning");
28 const log_level_t log_level_t::INFO(1, "info");
29 const log_level_t log_level_t::DEBUG(0, "debug");
30
31 log_level_t::log_level_t(int v, const std::string& s)
32   : enum_base<log_level_t>(v, s)
33 {
34 }
35
36 static log_t slog;
37
38 log_t&
39 logger()
40 {
41   return slog;
42 }
43
44 log_t::log_t()
45   : m_level(log_level_t::ERROR)
46   , m_handler(new cout_handler())
47 {
48 }
49
50 void
51 log_t::set(const log_level_t& level)
52 {
53   m_level = level;
54 }
55
56 void
57 log_t::set(handler* h)
58 {
59   m_handler = h;
60 }
61
62 void
63 log_t::write(const std::string& file,
64              const int line,
65              const std::string& function,
66              const log_level_t& level,
67              const std::string& message)
68 {
69   m_handler->handle_message(file, line, function, level, message);
70 }
71
72 /**
73  * The configured level
74  */
75 const log_level_t&
76 log_t::level() const
77 {
78   return (m_level);
79 }
80
81 static std::string
82 get_filename(const std::string& file)
83 {
84   std::vector<std::string> dirs;
85   boost::split(dirs, file, boost::is_any_of("/"));
86
87   return dirs.back();
88 }
89
90 log_t::entry::entry(const char* file,
91                     const char* function,
92                     int line,
93                     const log_level_t& level)
94   : m_file(get_filename(file))
95   , m_function(function)
96   , m_level(level)
97   , m_line(line)
98 {
99 }
100
101 log_t::entry::~entry()
102 {
103   logger().write(m_file, m_line, m_function, m_level, m_stream.str());
104 }
105
106 std::stringstream&
107 log_t::entry::stream()
108 {
109   return (m_stream);
110 }
111
112 static std::string
113 get_timestamp()
114 {
115   auto end = std::chrono::system_clock::now();
116   auto end_time = std::chrono::system_clock::to_time_t(end);
117
118   /*
119    * put-time is not support in gcc in 4.8
120    * so we play this dance with ctime
121    */
122   std::string display = std::ctime(&end_time);
123   display.pop_back();
124
125   return (display);
126 }
127
128 file_handler::file_handler(const std::string& ofile)
129 {
130   m_file_stream.open(ofile);
131 }
132
133 file_handler::~file_handler()
134 {
135   m_file_stream.close();
136 }
137
138 void
139 file_handler::handle_message(const std::string& file,
140                              const int line,
141                              const std::string& function,
142                              const log_level_t& level,
143                              const std::string& message)
144 {
145   m_file_stream << get_timestamp();
146   m_file_stream << " [" << level.to_string() << "]" << file << ":" << line
147                 << " " << function << "() " << message << std::endl;
148 }
149
150 void
151 cout_handler::handle_message(const std::string& file,
152                              const int line,
153                              const std::string& function,
154                              const log_level_t& level,
155                              const std::string& message)
156 {
157   std::cout << get_timestamp();
158   std::cout << " [" << level.to_string() << "]" << file << ":" << line << " "
159             << function << "() " << message << std::endl;
160 }
161
162 }; // namespace VOM
163
164 /*
165  * fd.io coding-style-patch-verification: ON
166  *
167  * Local Variables:
168  * eval: (c-set-style "mozilla")
169  * End:
170  */