blob: 07e27499b59d46a54ff8f95a978b6e790224735b [file] [log] [blame]
Neale Ranns812ed392017-10-16 04:20:13 -07001/*
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>
Damjan Marion6e3b5a22017-11-01 11:20:50 +010018#include <vector>
Neale Ranns812ed392017-10-16 04:20:13 -070019
20#include <boost/algorithm/string.hpp>
21
22#include "vom/logger.hpp"
23
24namespace VOM {
Neale Rannsc3a2a2f2017-11-08 09:00:44 -080025const log_level_t log_level_t::CRITICAL(4, "critical");
26const log_level_t log_level_t::ERROR(3, "error");
27const log_level_t log_level_t::WARNING(2, "warning");
28const log_level_t log_level_t::INFO(1, "info");
Neale Ranns812ed392017-10-16 04:20:13 -070029const log_level_t log_level_t::DEBUG(0, "debug");
30
31log_level_t::log_level_t(int v, const std::string& s)
32 : enum_base<log_level_t>(v, s)
33{
34}
35
36static log_t slog;
37
38log_t&
39logger()
40{
41 return slog;
42}
43
44log_t::log_t()
45 : m_level(log_level_t::ERROR)
46 , m_o_stream(&std::cout)
47{
48}
49
50void
51log_t::set(const log_level_t& level)
52{
53 m_level = level;
54}
55
56void
57log_t::set(const std::string& ofile)
58{
59 m_file_stream.open(ofile);
60 m_o_stream = &m_file_stream;
61}
62
63std::ostream&
Neale Ranns8ac4ce82017-11-17 05:08:55 -080064log_t::stream(const char* file, int line, const log_level_t& level)
Neale Ranns812ed392017-10-16 04:20:13 -070065{
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
Neale Ranns8ac4ce82017-11-17 05:08:55 -080080 << display << " [" << level.to_string() << "]"
Neale Ranns812ed392017-10-16 04:20:13 -070081 << " " << dirs.back() << ":" << line << ": ";
82
83 return (*m_o_stream);
84}
85
86/**
87 * The configured level
88 */
89const log_level_t&
90log_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 */