New logging system.
First step: implementing the architecture. To get back the scope logging messages, add this line somewhere: 'lg::set_log_domain_severity("general", 2);'.
This commit is contained in:
parent
b6a00d7488
commit
235a34cd24
2 changed files with 123 additions and 43 deletions
91
src/log.cpp
91
src/log.cpp
|
@ -11,8 +11,97 @@
|
|||
See the COPYING file for more details.
|
||||
*/
|
||||
|
||||
#include "SDL.h"
|
||||
|
||||
#include "log.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
int scope_logger::indent = 0;
|
||||
namespace {
|
||||
|
||||
struct logd {
|
||||
char const *name_;
|
||||
int severity_;
|
||||
};
|
||||
|
||||
class null_streambuf : public std::streambuf
|
||||
{
|
||||
virtual int overflow(int c) { return std::char_traits< char >::not_eof(c); }
|
||||
public:
|
||||
null_streambuf() {}
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
static std::vector< logd > log_domains;
|
||||
static std::ostream null_ostream(new null_streambuf);
|
||||
static int indent = 0;
|
||||
|
||||
namespace lg {
|
||||
|
||||
logger err("error", 0), warn("warning", 1), info("info", 2);
|
||||
log_domain general("general");
|
||||
|
||||
log_domain::log_domain(char const *name) : domain_(log_domains.size())
|
||||
{
|
||||
logd d = { name, 0 };
|
||||
log_domains.push_back(d);
|
||||
}
|
||||
|
||||
bool set_log_domain_severity(std::string const &name, int severity)
|
||||
{
|
||||
std::vector< logd >::iterator
|
||||
it = log_domains.begin(),
|
||||
it_end = log_domains.end();
|
||||
if (name == "all") {
|
||||
for(; it != it_end; ++it)
|
||||
it->severity_ = severity;
|
||||
} else {
|
||||
for(; it != it_end; ++it)
|
||||
if (name == it->name_) break;
|
||||
if (it == it_end)
|
||||
return false;
|
||||
it->severity_ = severity;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::ostream &logger::operator()(log_domain const &domain, bool show_names)
|
||||
{
|
||||
logd const &d = log_domains[domain.domain_];
|
||||
if (severity_ > d.severity_)
|
||||
return null_ostream;
|
||||
else {
|
||||
if (show_names)
|
||||
std::cerr << name_ << " " << d.name_ << ": ";
|
||||
return std::cerr;
|
||||
}
|
||||
};
|
||||
|
||||
scope_logger::scope_logger(log_domain const &domain, const std::string& str)
|
||||
: ticks_(SDL_GetTicks()), str_(str), output_(info(domain, false))
|
||||
{
|
||||
do_indent();
|
||||
output_ << "BEGIN: " << str_ << "\n";
|
||||
++indent;
|
||||
}
|
||||
|
||||
scope_logger::~scope_logger()
|
||||
{
|
||||
const int ticks = SDL_GetTicks() - ticks_;
|
||||
--indent;
|
||||
do_indent();
|
||||
output_ << "END: " << str_ << " (took " << ticks << "ms)\n";
|
||||
}
|
||||
|
||||
void scope_logger::do_indent()
|
||||
{
|
||||
for(int i = 0; i != indent; ++i)
|
||||
output_ << " ";
|
||||
}
|
||||
|
||||
} // namespace lg
|
||||
|
|
75
src/log.hpp
75
src/log.hpp
|
@ -13,56 +13,47 @@
|
|||
#ifndef LOG_HPP_INCLUDED
|
||||
#define LOG_HPP_INCLUDED
|
||||
|
||||
#define LOG_DATA
|
||||
|
||||
#ifdef LOG_DATA
|
||||
|
||||
#include <iostream>
|
||||
#include <iosfwd>
|
||||
#include <string>
|
||||
|
||||
#include "SDL.h"
|
||||
namespace lg {
|
||||
|
||||
struct scope_logger
|
||||
{
|
||||
scope_logger(const std::string& str) : ticks_(SDL_GetTicks()), str_(str) {
|
||||
do_indent();
|
||||
std::cerr << "BEGIN: " << str_ << "\n";
|
||||
do_indent();
|
||||
++indent;
|
||||
}
|
||||
class logger;
|
||||
|
||||
~scope_logger() {
|
||||
const int ticks = SDL_GetTicks() - ticks_;
|
||||
--indent;
|
||||
do_indent();
|
||||
do_indent();
|
||||
std::cerr << "END: " << str_ << " (took " << ticks << "ms)\n";
|
||||
}
|
||||
|
||||
void do_indent()
|
||||
{
|
||||
for(int i = 0; i != indent; ++i)
|
||||
std::cerr << " ";
|
||||
}
|
||||
|
||||
private:
|
||||
int ticks_;
|
||||
std::string str_;
|
||||
static int indent;
|
||||
class log_domain {
|
||||
int domain_;
|
||||
public:
|
||||
log_domain(char const *name);
|
||||
friend class logger;
|
||||
};
|
||||
|
||||
#define log_data0(a) std::cerr << a << "\n";
|
||||
#define log_data1(a,b) std::cerr << a << " info: " << b << "\n";
|
||||
#define log_data2(a,b,c) std::cerr << a << " info: " << b << ", " << c << "\n";
|
||||
bool set_log_domain_severity(std::string const &name, int severity);
|
||||
|
||||
#define log_scope(a) scope_logger scope_logging_object__(a);
|
||||
class logger {
|
||||
char const *name_;
|
||||
int severity_;
|
||||
public:
|
||||
logger(char const *name, int severity): name_(name), severity_(severity) {}
|
||||
std::ostream &operator()(log_domain const &domain, bool show_names = true);
|
||||
};
|
||||
|
||||
#else
|
||||
#define log_data0(a)
|
||||
#define log_data1(a,b)
|
||||
#define log_data2(a,b,c)
|
||||
extern logger err, warn, info;
|
||||
extern log_domain general;
|
||||
|
||||
#define log_scope(a)
|
||||
#endif
|
||||
class scope_logger
|
||||
{
|
||||
int ticks_;
|
||||
std::string str_;
|
||||
std::ostream &output_;
|
||||
public:
|
||||
scope_logger(log_domain const &domain, std::string const &str);
|
||||
~scope_logger();
|
||||
void do_indent();
|
||||
};
|
||||
|
||||
} // namespace lg
|
||||
|
||||
#define log_scope(a) lg::scope_logger scope_logging_object__(lg::general, a);
|
||||
#define log_scope2(a,b) lg::scope_logger scope_logging_object__(lg::a, b);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue