1 |
// -*- mode: C++; tab-width: 4; indent-tabs-mode: t; -*- vim:ts=4:sw=4 |
// -*- mode: C++; tab-width: 4; indent-tabs-mode: t; -*- vim:ts=4:sw=4 |
2 |
// |
// |
3 |
// Copyright (C) 2004 Chong Kai Xiong (descender) |
// Copyright (C) 2004 Chong Kai Xiong (descender) |
4 |
|
// David Lau (skunix) |
5 |
// |
// |
6 |
// This file is part of The Plains of Usata. |
// This file is part of The Plains of Usata. |
7 |
// |
// |
11 |
// http://www.fsf.org/licenses/gpl.html. |
// http://www.fsf.org/licenses/gpl.html. |
12 |
// |
// |
13 |
// $Id$ |
// $Id$ |
|
// $Log$ |
|
|
// Revision 1.7 2004/12/26 09:35:23 skunix |
|
|
// use logging functionality |
|
|
// |
|
|
// Revision 1.6 2004/12/26 08:33:37 skunix |
|
|
// added targets_mutex locking to Server |
|
|
// |
|
|
// Revision 1.5 2004/12/26 08:03:34 skunix |
|
|
// changed lambda::bind's to boost::binds |
|
|
// |
|
|
// Revision 1.4 2004/12/26 07:50:33 skunix |
|
|
// fixed Stream error, added a buffered Stream2 class, and added Level prefixing |
|
|
// |
|
|
// Revision 1.3 2004/12/26 06:52:36 skunix |
|
|
// changed level > impl->level check to <, it acts right now |
|
|
// |
|
|
// Revision 1.2 2004/12/26 02:59:35 Descender |
|
|
// |
|
|
// log::Target: change access of destructor to protected |
|
|
// log::Stream: change type of parameter 'server' for constructor to pointer, remove unused constructor |
|
|
// |
|
|
// Revision 1.1 2004/12/26 02:26:18 Descender |
|
|
// |
|
|
// New logging functionality. |
|
|
// |
|
14 |
|
|
15 |
#include "log.hpp" |
#include "log.hpp" |
16 |
|
|
28 |
namespace log |
namespace log |
29 |
{ |
{ |
30 |
Server server; |
Server server; |
31 |
Stream stream(&server); |
Stream stream; |
32 |
|
|
33 |
CommitT Commit; |
BufferedStreamCommit commit; |
34 |
|
|
35 |
class TargetStdout |
class TargetStdout |
36 |
: public Target |
: public Target |
78 |
public: |
public: |
79 |
typedef std::list<Target *> TargetList; |
typedef std::list<Target *> TargetList; |
80 |
typedef std::map<int,std::string> PrefixMap; |
typedef std::map<int,std::string> PrefixMap; |
81 |
PrefixMap prefixes; |
|
82 |
boost::mutex targets_mutex; |
PrefixMap prefixes; |
83 |
TargetList targets; |
TargetList targets; |
84 |
int level; |
int level; |
85 |
|
|
86 |
|
boost::mutex mutex; |
87 |
}; |
}; |
88 |
|
|
89 |
Server::Server() |
Server::Server() |
105 |
{ |
{ |
106 |
impl->level = level; |
impl->level = level; |
107 |
} |
} |
108 |
|
|
109 |
void |
void |
110 |
Server::set_prefix(int level, const std::string& prefix) |
Server::set_prefix(int level, const std::string& prefix) |
111 |
{ |
{ |
112 |
impl->prefixes.insert( make_pair(level,prefix)); |
impl->prefixes.insert(std::make_pair(level, prefix)); |
113 |
} |
} |
114 |
|
|
115 |
void |
void |
116 |
Server::log(int level, const std::string& message) |
Server::log(int level, const std::string& message) |
117 |
{ |
{ |
118 |
typedef ServerImpl::PrefixMap::iterator PrefixMapIterator; |
using boost::bind; |
119 |
|
|
120 |
// FIXME: add timestamping - descender |
// FIXME: add timestamping - descender |
121 |
|
|
122 |
if (level < impl->level) |
if (level < impl->level) |
123 |
return; |
return; |
|
PrefixMapIterator pit = impl->prefixes.find(level); |
|
124 |
|
|
125 |
boost::mutex::scoped_lock(impl->targets_mutex); |
boost::mutex::scoped_lock(impl->mutex); |
|
if (pit != impl->prefixes.end()) |
|
|
{ |
|
|
using boost::bind; |
|
|
std::string nmessage = (boost::format("%1% - %2%") % pit->second % message).str(); |
|
|
std::for_each(impl->targets.begin(), impl->targets.end(), |
|
|
bind(&Target::write, _1, nmessage)); |
|
|
} |
|
|
else |
|
|
{ |
|
|
using boost::bind; |
|
|
std::for_each(impl->targets.begin(), impl->targets.end(), |
|
|
bind(&Target::write, _1, message)); |
|
126 |
|
|
127 |
} |
std::string nmessage = (boost::format("%1% - %2%") % impl->prefixes[level] % message).str(); |
128 |
|
|
129 |
|
std::for_each(impl->targets.begin(), impl->targets.end(), |
130 |
|
bind(&Target::write, _1, nmessage)); |
131 |
} |
} |
132 |
|
|
133 |
// FIXME: should we throw an error? - descender |
// FIXME: should we throw an error? - descender |
134 |
void |
void |
135 |
Server::add_target(Target *target) |
Server::add_target(Target *target) |
136 |
{ |
{ |
137 |
boost::mutex::scoped_lock(impl->targets_mutex); |
boost::mutex::scoped_lock(impl->mutex); |
138 |
if (find(impl->targets.begin(), impl->targets.end(), target) != |
if (find(impl->targets.begin(), impl->targets.end(), target) != |
139 |
impl->targets.end()) |
impl->targets.end()) |
140 |
return; |
return; |
147 |
Server::commit() |
Server::commit() |
148 |
{ |
{ |
149 |
using boost::bind; |
using boost::bind; |
150 |
boost::mutex::scoped_lock(impl->targets_mutex); |
boost::mutex::scoped_lock(impl->mutex); |
151 |
std::for_each(impl->targets.begin(), impl->targets.end(), |
std::for_each(impl->targets.begin(), impl->targets.end(), |
152 |
bind(&Target::commit, _1)); |
bind(&Target::commit, _1)); |
153 |
} |
} |
154 |
|
|
155 |
void |
void |
156 |
Stream2::commit() |
BufferedStream::commit() |
157 |
{ |
{ |
158 |
buf << std::endl; |
m_buffer << std::endl; |
159 |
m_server->log(m_level, buf.str()); |
m_server->log(m_level, m_buffer.str()); |
160 |
buf.str(""); |
m_buffer.str(""); |
161 |
} |
} |
162 |
|
|
163 |
// Stream manipulators |
// Stream manipulators |