logger.hpp
1.67 KB
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
81
82
83
/**
* Simple stream-based logger for C++11.
*
* Adapted from
* http://vilipetek.com/2014/04/17/thread-safe-simple-logger-in-c11/
*/
#pragma once
#include <string>
#include <sstream>
#include <mutex>
#include <memory>
#include <fstream>
namespace redox {
namespace log {
// Log message levels
enum Level {
Trace, Debug, Info, Warning, Error, Fatal, Off
};
// Forward declaration
class Logger;
// --------------------
// Logstream
// --------------------
class Logstream : public std::ostringstream {
public:
Logstream(Logger &logger, Level l);
Logstream(const Logstream &ls);
~Logstream();
private:
Logger &m_logger;
Level m_loglevel;
};
// --------------------
// Logger
// --------------------
class Logger {
public:
Logger(std::string filename, Level loglevel = Level::Info);
Logger(std::ostream &outfile, Level loglevel = Level::Info);
virtual ~Logger();
void level(Level l) { m_loglevel = l; }
Level level() { return m_loglevel; }
void log(Level l, std::string oMessage);
Logstream operator()(Level l = Level::Info) { return Logstream(*this, l); }
// Helpers
Logstream trace() { return (*this)(Level::Trace); }
Logstream debug() { return (*this)(Level::Debug); }
Logstream info() { return (*this)(Level::Info); }
Logstream warning() { return (*this)(Level::Warning); }
Logstream error() { return (*this)(Level::Error); }
Logstream fatal() { return (*this)(Level::Fatal); }
private:
const tm *getLocalTime();
private:
std::mutex m_lock;
std::ofstream m_file;
std::ostream &m_stream;
tm m_time;
Level m_loglevel;
};
} // End namespace
} // End namespace