switched Log to shared_ptrs and added extra flushes
This commit is contained in:
parent
29f2d3c45c
commit
1251daf9fc
@ -5,10 +5,13 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Log.h,v 1.1 2005/01/27 03:35:23 cozman Exp $
|
// $Id: Log.h,v 1.2 2005/02/04 08:11:54 cozman Exp $
|
||||||
//
|
//
|
||||||
// Revisions:
|
// Revisions:
|
||||||
// $Log: Log.h,v $
|
// $Log: Log.h,v $
|
||||||
|
// Revision 1.2 2005/02/04 08:11:54 cozman
|
||||||
|
// switched Log to shared_ptrs and added extra flushes
|
||||||
|
//
|
||||||
// Revision 1.1 2005/01/27 03:35:23 cozman
|
// Revision 1.1 2005/01/27 03:35:23 cozman
|
||||||
// initial import (exceptions,types, and logging,oh my!)
|
// initial import (exceptions,types, and logging,oh my!)
|
||||||
//
|
//
|
||||||
@ -45,7 +48,7 @@ public:
|
|||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// sink - Pointer to <LogSink> to add to Log.
|
// sink - Pointer to <LogSink> to add to Log.
|
||||||
void addSink(LogSink *sink);
|
void addSink(LogSinkPtr sink);
|
||||||
|
|
||||||
// Function: removeSink
|
// Function: removeSink
|
||||||
// Remove a sink from the log by name.
|
// Remove a sink from the log by name.
|
||||||
@ -59,7 +62,7 @@ public:
|
|||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// sink - Pointer to sink to remove.
|
// sink - Pointer to sink to remove.
|
||||||
void removeSink(LogSink *sink);
|
void removeSink(LogSinkPtr sink);
|
||||||
|
|
||||||
// Function: removeSinks
|
// Function: removeSinks
|
||||||
// Remove all sinks from log.
|
// Remove all sinks from log.
|
||||||
@ -116,7 +119,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
std::stringstream buffer_;
|
std::stringstream buffer_;
|
||||||
LogLevel lastLevel_;
|
LogLevel lastLevel_;
|
||||||
std::list<LogSink*> sinks_;
|
std::list<LogSinkPtr> sinks_;
|
||||||
|
|
||||||
//assignment left undefined
|
//assignment left undefined
|
||||||
Log(const Log &rhs);
|
Log(const Log &rhs);
|
||||||
|
@ -5,10 +5,13 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: LogSink.h,v 1.2 2005/01/27 05:24:11 cozman Exp $
|
// $Id: LogSink.h,v 1.3 2005/02/04 08:11:54 cozman Exp $
|
||||||
//
|
//
|
||||||
// Revisions:
|
// Revisions:
|
||||||
// $Log: LogSink.h,v $
|
// $Log: LogSink.h,v $
|
||||||
|
// Revision 1.3 2005/02/04 08:11:54 cozman
|
||||||
|
// switched Log to shared_ptrs and added extra flushes
|
||||||
|
//
|
||||||
// Revision 1.2 2005/01/27 05:24:11 cozman
|
// Revision 1.2 2005/01/27 05:24:11 cozman
|
||||||
// minor documentation update
|
// minor documentation update
|
||||||
//
|
//
|
||||||
@ -23,6 +26,8 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
namespace photon
|
namespace photon
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -69,10 +74,7 @@ public:
|
|||||||
//
|
//
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// name_ - Name of LogSink, every LogSink should have a unique name.
|
// name_ - Name of LogSink, every LogSink should have a unique name.
|
||||||
// dynamic_ - Tells if the sink is dynamically allocated.
|
LogSink(std::string name);
|
||||||
// This flag is false by default, and should be true if Log
|
|
||||||
// should delete the sink when it is done.
|
|
||||||
LogSink(std::string name, bool dynamic=false);
|
|
||||||
|
|
||||||
// Function: ~LogSink
|
// Function: ~LogSink
|
||||||
// Virtual destructor, available to make inheritance safe.
|
// Virtual destructor, available to make inheritance safe.
|
||||||
@ -99,23 +101,21 @@ public:
|
|||||||
// Returns:
|
// Returns:
|
||||||
// Name of the LogSink.
|
// Name of the LogSink.
|
||||||
std::string getName() const;
|
std::string getName() const;
|
||||||
|
|
||||||
// Function: isDynamic
|
virtual std::ostream& getStream()=0;
|
||||||
// Checks if sink is dynamic.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// True if log is dynamically allocated, false if not.
|
|
||||||
bool isDynamic() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
bool dynamic_;
|
|
||||||
|
|
||||||
//assignment left undefined
|
//assignment left undefined
|
||||||
LogSink(const LogSink&);
|
LogSink(const LogSink&);
|
||||||
LogSink& operator=(const LogSink&);
|
LogSink& operator=(const LogSink&);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Type: LogSinkPtr
|
||||||
|
// Pointer to a log sink, used since LogSink is abstract and will always
|
||||||
|
// be accessed via a pointer.
|
||||||
|
typedef shared_ptr<LogSink> LogSinkPtr;
|
||||||
|
|
||||||
// Class: ConsoleSink
|
// Class: ConsoleSink
|
||||||
// <LogSink> to be used with <Log> for simple console output.
|
// <LogSink> to be used with <Log> for simple console output.
|
||||||
@ -128,10 +128,11 @@ private:
|
|||||||
class ConsoleSink : public LogSink
|
class ConsoleSink : public LogSink
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ConsoleSink(std::string name, bool dynamic=false);
|
ConsoleSink(std::string name);
|
||||||
virtual ~ConsoleSink();
|
virtual ~ConsoleSink();
|
||||||
|
|
||||||
virtual void writeMessage(LogLevel level, std::string msg);
|
virtual void writeMessage(LogLevel level, std::string msg);
|
||||||
|
virtual std::ostream& getStream();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Class: TextSink
|
// Class: TextSink
|
||||||
@ -145,10 +146,11 @@ public:
|
|||||||
class TextSink : public LogSink
|
class TextSink : public LogSink
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TextSink(std::string name, bool dynamic=false);
|
TextSink(std::string name);
|
||||||
virtual ~TextSink();
|
virtual ~TextSink();
|
||||||
|
|
||||||
virtual void writeMessage(LogLevel level, std::string msg);
|
virtual void writeMessage(LogLevel level, std::string msg);
|
||||||
|
virtual std::ostream& getStream();
|
||||||
private:
|
private:
|
||||||
std::ofstream out_;
|
std::ofstream out_;
|
||||||
};
|
};
|
||||||
@ -164,10 +166,11 @@ private:
|
|||||||
class HTMLSink : public LogSink
|
class HTMLSink : public LogSink
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
HTMLSink(std::string name, bool dynamic=false);
|
HTMLSink(std::string name);
|
||||||
virtual ~HTMLSink();
|
virtual ~HTMLSink();
|
||||||
|
|
||||||
virtual void writeMessage(LogLevel level, std::string msg);
|
virtual void writeMessage(LogLevel level, std::string msg);
|
||||||
|
virtual std::ostream& getStream();
|
||||||
private:
|
private:
|
||||||
std::ofstream out_;
|
std::ofstream out_;
|
||||||
};
|
};
|
||||||
|
46
src/Log.cpp
46
src/Log.cpp
@ -5,10 +5,13 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: Log.cpp,v 1.1 2005/01/27 03:35:24 cozman Exp $
|
// $Id: Log.cpp,v 1.2 2005/02/04 08:11:54 cozman Exp $
|
||||||
//
|
//
|
||||||
// Revisions:
|
// Revisions:
|
||||||
// $Log: Log.cpp,v $
|
// $Log: Log.cpp,v $
|
||||||
|
// Revision 1.2 2005/02/04 08:11:54 cozman
|
||||||
|
// switched Log to shared_ptrs and added extra flushes
|
||||||
|
//
|
||||||
// Revision 1.1 2005/01/27 03:35:24 cozman
|
// Revision 1.1 2005/01/27 03:35:24 cozman
|
||||||
// initial import (exceptions,types, and logging,oh my!)
|
// initial import (exceptions,types, and logging,oh my!)
|
||||||
//
|
//
|
||||||
@ -32,16 +35,18 @@ Log::~Log()
|
|||||||
removeSinks();
|
removeSinks();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Log::addSink(LogSink *sink)
|
void Log::addSink(LogSinkPtr sink)
|
||||||
{
|
{
|
||||||
for(std::list<LogSink*>::iterator it = sinks_.begin();
|
flush();
|
||||||
|
|
||||||
|
for(std::list<LogSinkPtr>::iterator it = sinks_.begin();
|
||||||
it != sinks_.end();
|
it != sinks_.end();
|
||||||
++it)
|
++it)
|
||||||
{
|
{
|
||||||
if(sink == *it || sink->getName() == (*it)->getName())
|
if(sink == *it || sink->getName() == (*it)->getName())
|
||||||
{
|
{
|
||||||
throw Exception("Log already contains sink: " +
|
throw PreconditionException("Log already contains sink: " +
|
||||||
sink->getName());
|
sink->getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,47 +55,36 @@ void Log::addSink(LogSink *sink)
|
|||||||
|
|
||||||
void Log::removeSink(std::string sinkName)
|
void Log::removeSink(std::string sinkName)
|
||||||
{
|
{
|
||||||
for(std::list<LogSink*>::iterator it = sinks_.begin();
|
flush();
|
||||||
|
|
||||||
|
for(std::list<LogSinkPtr>::iterator it = sinks_.begin();
|
||||||
it != sinks_.end();
|
it != sinks_.end();
|
||||||
++it)
|
++it)
|
||||||
{
|
{
|
||||||
if((*it)->getName() == sinkName)
|
if((*it)->getName() == sinkName)
|
||||||
{
|
{
|
||||||
if((*it)->isDynamic())
|
|
||||||
{
|
|
||||||
delete *it;
|
|
||||||
}
|
|
||||||
sinks_.erase(it);
|
sinks_.erase(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Log::removeSink(LogSink *sink)
|
void Log::removeSink(LogSinkPtr sink)
|
||||||
{
|
{
|
||||||
std::list<LogSink*>::iterator it =
|
flush();
|
||||||
|
|
||||||
|
std::list<LogSinkPtr>::iterator it =
|
||||||
std::find(sinks_.begin(),sinks_.end(),sink);
|
std::find(sinks_.begin(),sinks_.end(),sink);
|
||||||
|
|
||||||
if(it != sinks_.end())
|
if(it != sinks_.end())
|
||||||
{
|
{
|
||||||
if((*it)->isDynamic())
|
|
||||||
{
|
|
||||||
delete *it;
|
|
||||||
}
|
|
||||||
sinks_.erase(it);
|
sinks_.erase(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Log::removeSinks()
|
void Log::removeSinks()
|
||||||
{
|
{
|
||||||
for(std::list<LogSink*>::iterator it = sinks_.begin();
|
flush();
|
||||||
it != sinks_.end();
|
|
||||||
++it)
|
|
||||||
{
|
|
||||||
if((*it)->isDynamic())
|
|
||||||
{
|
|
||||||
delete *it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sinks_.clear();
|
sinks_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +93,7 @@ void Log::flush()
|
|||||||
std::string str = buffer_.str();
|
std::string str = buffer_.str();
|
||||||
if(str.length())
|
if(str.length())
|
||||||
{
|
{
|
||||||
for(std::list<LogSink*>::iterator it = sinks_.begin();
|
for(std::list<LogSinkPtr>::iterator it = sinks_.begin();
|
||||||
it != sinks_.end();
|
it != sinks_.end();
|
||||||
++it)
|
++it)
|
||||||
{
|
{
|
||||||
|
@ -5,10 +5,13 @@
|
|||||||
// James Turk (jpt2433@rit.edu)
|
// James Turk (jpt2433@rit.edu)
|
||||||
//
|
//
|
||||||
// Version:
|
// Version:
|
||||||
// $Id: LogSink.cpp,v 1.2 2005/01/27 05:24:11 cozman Exp $
|
// $Id: LogSink.cpp,v 1.3 2005/02/04 08:11:54 cozman Exp $
|
||||||
//
|
//
|
||||||
// Revisions:
|
// Revisions:
|
||||||
// $Log: LogSink.cpp,v $
|
// $Log: LogSink.cpp,v $
|
||||||
|
// Revision 1.3 2005/02/04 08:11:54 cozman
|
||||||
|
// switched Log to shared_ptrs and added extra flushes
|
||||||
|
//
|
||||||
// Revision 1.2 2005/01/27 05:24:11 cozman
|
// Revision 1.2 2005/01/27 05:24:11 cozman
|
||||||
// minor documentation update
|
// minor documentation update
|
||||||
//
|
//
|
||||||
@ -26,8 +29,8 @@ namespace photon
|
|||||||
|
|
||||||
//LogSink
|
//LogSink
|
||||||
|
|
||||||
LogSink::LogSink(std::string name, bool dynamic) :
|
LogSink::LogSink(std::string name) :
|
||||||
name_(name),dynamic_(dynamic)
|
name_(name)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,15 +43,10 @@ std::string LogSink::getName() const
|
|||||||
return name_;
|
return name_;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LogSink::isDynamic() const
|
|
||||||
{
|
|
||||||
return dynamic_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//ConsoleSink
|
//ConsoleSink
|
||||||
|
|
||||||
ConsoleSink::ConsoleSink(std::string name, bool dynamic) :
|
ConsoleSink::ConsoleSink(std::string name) :
|
||||||
LogSink(name,dynamic)
|
LogSink(name)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,10 +65,15 @@ void ConsoleSink::writeMessage(LogLevel level, std::string msg)
|
|||||||
std::cerr << pre[static_cast<int>(level)] << msg << std::endl;
|
std::cerr << pre[static_cast<int>(level)] << msg << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::ostream& ConsoleSink::getStream()
|
||||||
|
{
|
||||||
|
return std::cerr;
|
||||||
|
}
|
||||||
|
|
||||||
//TextSink
|
//TextSink
|
||||||
|
|
||||||
TextSink::TextSink(std::string name, bool dynamic) :
|
TextSink::TextSink(std::string name) :
|
||||||
LogSink(name,dynamic),
|
LogSink(name),
|
||||||
out_(std::string(name+".txt").c_str())
|
out_(std::string(name+".txt").c_str())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -91,17 +94,22 @@ void TextSink::writeMessage(LogLevel level, std::string msg)
|
|||||||
out_ << pre[static_cast<int>(level)] << msg << std::endl;
|
out_ << pre[static_cast<int>(level)] << msg << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::ostream& TextSink::getStream()
|
||||||
|
{
|
||||||
|
return out_;
|
||||||
|
}
|
||||||
|
|
||||||
//HTMLSink
|
//HTMLSink
|
||||||
|
|
||||||
HTMLSink::HTMLSink(std::string name, bool dynamic) :
|
HTMLSink::HTMLSink(std::string name) :
|
||||||
LogSink(name,dynamic),
|
LogSink(name),
|
||||||
out_(std::string(name+".html").c_str())
|
out_(std::string(name+".html").c_str())
|
||||||
{
|
{
|
||||||
out_ << "<html><head><title>Error Log</title>\n<style type=\"text/css\">"
|
out_ << "<html><head><title>Error Log</title>\n<style type=\"text/css\">"
|
||||||
<< std::endl << "<!--" << std::endl
|
<< std::endl << "<!--" << std::endl
|
||||||
<< "p { margin: 0 }" << std::endl
|
<< "p { margin: 0 }" << std::endl
|
||||||
<< ".note { font-style:italic color:gray }" << std::endl
|
<< ".note { font-style:italic color:gray }" << std::endl
|
||||||
<< ".verbose { font-style:italic; background:yellow; font-size:small }"
|
<< ".verbose { font-style:italic; font-size:small }"
|
||||||
<< std::endl
|
<< std::endl
|
||||||
<< ".warning { font-weight:bold; background:yellow }" << std::endl
|
<< ".warning { font-weight:bold; background:yellow }" << std::endl
|
||||||
<< ".error { font-weight:bold; background:orange }" << std::endl
|
<< ".error { font-weight:bold; background:orange }" << std::endl
|
||||||
@ -130,4 +138,9 @@ void HTMLSink::writeMessage(LogLevel level, std::string msg)
|
|||||||
<< pre[static_cast<int>(level)] << msg << "</p>" << std::endl;
|
<< pre[static_cast<int>(level)] << msg << "</p>" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::ostream& HTMLSink::getStream()
|
||||||
|
{
|
||||||
|
return out_;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user