vom: fix build with gcc7
[vpp.git] / src / vpp-api / 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(0, "critical");
26 const log_level_t log_level_t::ERROR(0, "error");
27 const log_level_t log_level_t::WARNING(0, "warning");
28 const log_level_t log_level_t::INFO(0, "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_o_stream(&std::cout)
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(const std::string& ofile)
58 {
59   m_file_stream.open(ofile);
60   m_o_stream = &m_file_stream;
61 }
62
63 std::ostream&
64 log_t::stream(const char* file, int line)
65 {
66   auto end = std::chrono::system_clock::now();
67   auto end_time = std::chrono::system_clock::to_time_t(end);
68
69   /*
70  * put-time is not support in gcc in 4.8
71  * so we play this dance with ctime
72  */
73   std::string display = std::ctime(&end_time);
74   display.pop_back();
75
76   std::vector<std::string> dirs;
77   boost::split(dirs, file, boost::is_any_of("/"));
78
79   *m_o_stream << std::endl
80               << display << "]"
81               << " " << dirs.back() << ":" << line << ": ";
82
83   return (*m_o_stream);
84 }
85
86 /**
87  * The configured level
88  */
89 const log_level_t&
90 log_t::level() const
91 {
92   return (m_level);
93 }
94 }
95
96 /*
97  * fd.io coding-style-patch-verification: ON
98  *
99  * Local Variables:
100  * eval: (c-set-style "mozilla")
101  * End:
102  */