0
|
1 /* |
|
2 * logger.h -- irccd logging |
|
3 * |
|
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> |
|
5 * |
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
|
7 * purpose with or without fee is hereby granted, provided that the above |
|
8 * copyright notice and this permission notice appear in all copies. |
|
9 * |
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
17 */ |
|
18 |
|
19 #ifndef _IRCCD_LOGGER_H_ |
|
20 #define _IRCCD_LOGGER_H_ |
|
21 |
|
22 #include <irccd-config.h> |
|
23 |
|
24 #include <memory> |
|
25 #include <sstream> |
|
26 #include <utility> |
|
27 |
|
28 namespace irccd { |
|
29 |
|
30 namespace log { |
|
31 |
|
32 /** |
|
33 * @enum Level |
|
34 * @brief Which level of warning |
|
35 */ |
|
36 enum class Level { |
|
37 Info, //!< Standard information (disabled if verbose is false) |
|
38 Warning, //!< Warning (always shown) |
|
39 Debug //!< Debug message (only if compiled in debug mode) |
|
40 }; |
|
41 |
|
42 /* -------------------------------------------------------- |
|
43 * Interface -- abstract logging interface |
|
44 * -------------------------------------------------------- */ |
|
45 |
|
46 /** |
|
47 * @class Interface |
|
48 * @brief Interface to implement new logger mechanisms |
|
49 * |
|
50 * Derive from this class and use Logger::setInterface() to change logging |
|
51 * system. |
|
52 * |
|
53 * @see File |
|
54 * @see Console |
|
55 * @see Syslog |
|
56 * @see Silent |
|
57 */ |
|
58 class Interface { |
|
59 public: |
|
60 /** |
|
61 * Write the line to the logs. The line to write will never contains |
|
62 * trailing new line character. |
|
63 * |
|
64 * @param level the level |
|
65 * @param line the line without trailing \n |
|
66 */ |
|
67 virtual void write(Level level, const std::string &line) noexcept = 0; |
|
68 }; |
|
69 |
|
70 /* -------------------------------------------------------- |
|
71 * Console -- logs to console |
|
72 * -------------------------------------------------------- */ |
|
73 |
|
74 /** |
|
75 * @class Console |
|
76 * @brief Logger implementation for console output |
|
77 */ |
|
78 class Console : public Interface { |
|
79 public: |
|
80 /** |
|
81 * @copydoc Interface::write |
|
82 */ |
|
83 void write(Level level, const std::string &line) noexcept override; |
|
84 }; |
|
85 |
|
86 /* -------------------------------------------------------- |
|
87 * File -- logs to a file |
|
88 * -------------------------------------------------------- */ |
|
89 |
|
90 /** |
|
91 * @class File |
|
92 * @brief Output to a file |
|
93 */ |
|
94 class File : public Interface { |
|
95 private: |
|
96 std::string m_outputNormal; |
|
97 std::string m_outputError; |
|
98 |
|
99 public: |
|
100 /** |
|
101 * Outputs to files. Info and Debug are written in normal and Warnings |
|
102 * in errors. |
|
103 * |
|
104 * The same path can be used for all levels. |
|
105 * |
|
106 * @param normal the path to the normal logs |
|
107 * @param errors the path to the errors logs |
|
108 */ |
|
109 File(std::string normal, std::string errors); |
|
110 |
|
111 /** |
|
112 * @copydoc Interface::write |
|
113 */ |
|
114 void write(Level level, const std::string &line) noexcept override; |
|
115 }; |
|
116 |
|
117 /* -------------------------------------------------------- |
|
118 * Silent -- disable all logs |
|
119 * -------------------------------------------------------- */ |
|
120 |
|
121 /** |
|
122 * @class Silent |
|
123 * @brief Use to disable logs |
|
124 * |
|
125 * Useful for unit tests when some classes may emits log. |
|
126 */ |
|
127 class Silent : public Interface { |
|
128 public: |
|
129 /** |
|
130 * @copydoc Interface::write |
|
131 */ |
|
132 void write(Level level, const std::string &line) noexcept override; |
|
133 }; |
|
134 |
|
135 /* -------------------------------------------------------- |
|
136 * Syslog -- system logger |
|
137 * -------------------------------------------------------- */ |
|
138 |
|
139 #if defined(HAVE_SYSLOG) |
|
140 |
|
141 /** |
|
142 * @class Syslog |
|
143 * @brief Implements logger into syslog |
|
144 */ |
|
145 class Syslog : public Interface { |
|
146 public: |
|
147 /** |
|
148 * Open the syslog. |
|
149 */ |
|
150 Syslog(); |
|
151 |
|
152 /** |
|
153 * Close the syslog. |
|
154 */ |
|
155 ~Syslog(); |
|
156 |
|
157 /** |
|
158 * @copydoc Interface::write |
|
159 */ |
|
160 void write(Level level, const std::string &line) noexcept override; |
|
161 }; |
|
162 |
|
163 #endif // !HAVE_SYSLOG |
|
164 |
|
165 /* -------------------------------------------------------- |
|
166 * Functions |
|
167 * -------------------------------------------------------- */ |
|
168 |
|
169 /** |
|
170 * Update the logger interface. |
|
171 * |
|
172 * @param iface the new interface |
|
173 */ |
|
174 void setInterface(std::unique_ptr<Interface> iface) noexcept; |
|
175 |
|
176 /** |
|
177 * Get the stream for informational messages. |
|
178 * |
|
179 * @return the stream |
|
180 * @note Has no effect if verbose is set to false. |
|
181 */ |
|
182 std::ostream &info() noexcept; |
|
183 |
|
184 /** |
|
185 * Get the stream for warnings. |
|
186 * |
|
187 * @return the stream |
|
188 */ |
|
189 std::ostream &warning() noexcept; |
|
190 |
|
191 /** |
|
192 * Get the stream for debug messages. |
|
193 * |
|
194 * @return the stream |
|
195 * @note Has no effect if compiled in release mode. |
|
196 */ |
|
197 std::ostream &debug() noexcept; |
|
198 |
|
199 /** |
|
200 * Tells if verbose is enabled. |
|
201 * |
|
202 * @return true if enabled |
|
203 */ |
|
204 bool isVerbose() noexcept; |
|
205 |
|
206 /** |
|
207 * Set the verbosity mode. |
|
208 * |
|
209 * @param mode the new mode |
|
210 */ |
|
211 void setVerbose(bool mode) noexcept; |
|
212 |
|
213 } // !log |
|
214 |
|
215 } // !irccd |
|
216 |
|
217 #endif // !_IRCCD_LOGGER_H_ |