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:
Guillaume Melquiond 2004-09-18 18:29:04 +00:00
parent b6a00d7488
commit 235a34cd24
2 changed files with 123 additions and 43 deletions

View file

@ -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

View file

@ -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