-
Notifications
You must be signed in to change notification settings - Fork 22
/
dolog.hh
80 lines (68 loc) · 1.84 KB
/
dolog.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#pragma once
#include <iostream>
#include <sstream>
#include <syslog.h>
/* This file is intended not to be metronome specific, and is simple example of C++2011
variadic templates in action.
The goal is rapid easy to use logging to console & syslog.
Usage:
string address="localhost";
infolog("Bound to %s port %d", address, port);
warnlog("Query took %d milliseconds", 1232.4); // yes, %d
errlog("Unable to bind to %s: %s", ca.toStringWithPort(), strerr(errno));
If bool g_console is true, will log to stdout. Will syslog in any case with LOG_INFO,
LOG_WARNING, LOG_ERR respectively. If g_verbose=false, infolog is a noop.
More generically, dolog(someiostream, "Hello %s", stream) will log to someiostream
This will happily print a string to %d! Doesn't do further format processing.
*/
inline void dolog(std::ostream& os, const char*s)
{
os<<s;
}
template<typename T, typename... Args>
void dolog(std::ostream& os, const char* s, T value, Args... args)
{
while (*s) {
if (*s == '%') {
if (*(s + 1) == '%') {
++s;
}
else {
os << value;
s += 2;
dolog(os, s, args...);
return;
}
}
os << *s++;
}
}
extern bool g_console;
extern bool g_disableSyslog;
extern bool g_verbose;
template<typename... Args>
void genlog(int level, const char* s, Args... args)
{
std::ostringstream str;
dolog(str, s, args...);
if (!g_disableSyslog)
syslog(level, "%s", str.str().c_str());
if(g_console)
std::cout<<str.str()<<std::endl;
}
template<typename... Args>
void infolog(const char* s, Args... args)
{
if(g_verbose)
genlog(LOG_INFO, s, args...);
}
template<typename... Args>
void warnlog(const char* s, Args... args)
{
genlog(LOG_WARNING, s, args...);
}
template<typename... Args>
void errlog(const char* s, Args... args)
{
genlog(LOG_ERR, s, args...);
}