rogue
Loading...
Searching...
No Matches
Logging.cpp
Go to the documentation of this file.
1
17#include "rogue/Directives.h"
18
19#include "rogue/Logging.h"
20
21#include <inttypes.h>
22#include <stdarg.h>
23#include <sys/time.h>
24#include <unistd.h>
25
26#include <cstdio>
27#include <cstring>
28#include <memory>
29#include <string>
30#include <vector>
31
32#if defined(__linux__)
33 #include <sys/syscall.h>
34#elif defined(__APPLE__) && defined(__MACH__)
35 #include <pthread.h>
36#endif
37
38#ifndef NO_PYTHON
39 #include <boost/python.hpp>
40namespace bp = boost::python;
41#endif
42
43const uint32_t rogue::Logging::Critical;
44const uint32_t rogue::Logging::Error;
45const uint32_t rogue::Logging::Thread;
46const uint32_t rogue::Logging::Warning;
47const uint32_t rogue::Logging::Info;
48const uint32_t rogue::Logging::Debug;
49
50// Default Logging level Is Error
51uint32_t rogue::Logging::gblLevel_ = rogue::Logging::Error;
52
53// Logging level lock
54std::mutex rogue::Logging::levelMtx_;
55
56// Filter list
57std::vector<rogue::LogFilter*> rogue::Logging::filters_;
58
59// Crate logger
60rogue::LoggingPtr rogue::Logging::create(const std::string& name, bool quiet) {
61 rogue::LoggingPtr log = std::make_shared<rogue::Logging>(name, quiet);
62 return log;
63}
64
65rogue::Logging::Logging(const std::string& name, bool quiet) {
66 std::vector<rogue::LogFilter*>::iterator it;
67
68 name_ = "pyrogue." + name;
69
70 levelMtx_.lock();
71
72 level_ = gblLevel_;
73
74 for (it = filters_.begin(); it < filters_.end(); it++) {
75 if (name_.find((*it)->name_) == 0) {
76 if ((*it)->level_ < level_) level_ = (*it)->level_;
77 }
78 }
79 levelMtx_.unlock();
80
81 if (!quiet) warning("Starting logger with level = %" PRIu32, level_);
82}
83
85
86void rogue::Logging::setLevel(uint32_t level) {
87 levelMtx_.lock();
88 gblLevel_ = level;
89 levelMtx_.unlock();
90}
91
92void rogue::Logging::setFilter(const std::string& name, uint32_t level) {
93 levelMtx_.lock();
94
95 rogue::LogFilter* flt = new rogue::LogFilter(name, level);
96
97 filters_.push_back(flt);
98
99 levelMtx_.unlock();
100}
101
102void rogue::Logging::intLog(uint32_t level, const char* fmt, va_list args) {
103 if (level < level_) return;
104
105 struct timeval tme;
106 char buffer[1000];
107 vsnprintf(buffer, sizeof(buffer), fmt, args);
108 gettimeofday(&tme, NULL);
109 printf("%" PRIi64 ".%06" PRIi64 ":%s: %s\n",
110 static_cast<int64_t>(tme.tv_sec),
111 static_cast<int64_t>(tme.tv_usec),
112 name_.c_str(),
113 buffer);
114}
115
116void rogue::Logging::log(uint32_t level, const char* fmt, ...) {
117 va_list arg;
118 va_start(arg, fmt);
119 intLog(level, fmt, arg);
120 va_end(arg);
121}
122
123void rogue::Logging::critical(const char* fmt, ...) {
124 va_list arg;
125 va_start(arg, fmt);
126 intLog(rogue::Logging::Critical, fmt, arg);
127 va_end(arg);
128}
129
130void rogue::Logging::error(const char* fmt, ...) {
131 va_list arg;
132 va_start(arg, fmt);
133 intLog(rogue::Logging::Error, fmt, arg);
134 va_end(arg);
135}
136
137void rogue::Logging::warning(const char* fmt, ...) {
138 va_list arg;
139 va_start(arg, fmt);
140 intLog(rogue::Logging::Warning, fmt, arg);
141 va_end(arg);
142}
143
144void rogue::Logging::info(const char* fmt, ...) {
145 va_list arg;
146 va_start(arg, fmt);
147 intLog(rogue::Logging::Info, fmt, arg);
148 va_end(arg);
149}
150
151void rogue::Logging::debug(const char* fmt, ...) {
152 va_list arg;
153 va_start(arg, fmt);
154 intLog(rogue::Logging::Debug, fmt, arg);
155 va_end(arg);
156}
157
159 uint32_t tid;
160
161#if defined(__linux__)
162 tid = syscall(SYS_gettid);
163#elif defined(__APPLE__) && defined(__MACH__)
164 uint64_t tid64;
165 pthread_threadid_np(NULL, &tid64);
166 tid = static_cast<uint32_t>(tid64);
167#else
168 tid = 0;
169#endif
170
171 this->log(Thread, "PID=%" PRIu32 ", TID=%" PRIu32, getpid(), tid);
172}
173
175#ifndef NO_PYTHON
176 bp::class_<rogue::Logging, rogue::LoggingPtr, boost::noncopyable>("Logging", bp::no_init)
177 .def("setLevel", &rogue::Logging::setLevel)
178 .staticmethod("setLevel")
179 .def("setFilter", &rogue::Logging::setFilter)
180 .staticmethod("setFilter")
181 .def_readonly("Critical", &rogue::Logging::Critical)
182 .def_readonly("Error", &rogue::Logging::Error)
183 .def_readonly("Thread", &rogue::Logging::Thread)
184 .def_readonly("Warning", &rogue::Logging::Warning)
185 .def_readonly("Info", &rogue::Logging::Info)
186 .def_readonly("Debug", &rogue::Logging::Debug);
187#endif
188}
Per-logger level override filter entry.
Definition Logging.h:33
~Logging()
Destroys the logger instance.
Definition Logging.cpp:84
void info(const char *fmt,...)
Emits a formatted message at Info level.
Definition Logging.cpp:144
static const uint32_t Thread
Thread-trace severity level constant.
Definition Logging.h:82
void logThreadId()
Emits the current thread id through this logger.
Definition Logging.cpp:158
static void setup_python()
Registers Python bindings for Logging.
Definition Logging.cpp:174
Logging(const std::string &name, bool quiet=false)
Constructs a logger.
Definition Logging.cpp:65
static std::shared_ptr< rogue::Logging > create(const std::string &name, bool quiet=false)
Creates a logger instance.
Definition Logging.cpp:60
static void setFilter(const std::string &filter, uint32_t level)
Sets name-based filter level override.
Definition Logging.cpp:92
void warning(const char *fmt,...)
Emits a formatted message at Warning level.
Definition Logging.cpp:137
static const uint32_t Debug
Debug severity level constant.
Definition Logging.h:88
void log(uint32_t level, const char *fmt,...)
Emits a formatted log message at a specified level.
Definition Logging.cpp:116
static const uint32_t Error
Error severity level constant.
Definition Logging.h:80
static const uint32_t Info
Informational severity level constant.
Definition Logging.h:86
static const uint32_t Warning
Warning severity level constant.
Definition Logging.h:84
static void setLevel(uint32_t level)
Sets the global default logging level.
Definition Logging.cpp:86
void critical(const char *fmt,...)
Emits a formatted message at Critical level.
Definition Logging.cpp:123
void debug(const char *fmt,...)
Emits a formatted message at Debug level.
Definition Logging.cpp:151
static const uint32_t Critical
Critical severity level constant.
Definition Logging.h:78
void error(const char *fmt,...)
Emits a formatted message at Error level.
Definition Logging.cpp:130
std::shared_ptr< rogue::Logging > LoggingPtr
Shared pointer alias for Logging.
Definition Logging.h:159