00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __PION_LOGSERVICE_HEADER__
00011 #define __PION_LOGSERVICE_HEADER__
00012
00013 #include <boost/thread/mutex.hpp>
00014 #include <boost/scoped_ptr.hpp>
00015 #include <pion/PionLogger.hpp>
00016 #include <pion/net/WebService.hpp>
00017 #include <pion/net/HTTPResponseWriter.hpp>
00018 #include <string>
00019 #include <list>
00020
00021 #if defined(PION_USE_LOG4CXX)
00022 #include <log4cxx/appenderskeleton.h>
00023
00024
00025
00026 #ifndef _LOG4CXX_HELPERS_POOL_H
00027 namespace log4cxx {
00028 namespace helpers {
00029 typedef int Pool;
00030 }
00031 }
00032 #endif
00033 #endif
00034
00035
00036 namespace pion {
00037 namespace plugins {
00038
00039
00043 class LogServiceAppender
00044 : public PionLogAppender
00045 {
00046 public:
00047
00048 LogServiceAppender(void);
00049 virtual ~LogServiceAppender() {}
00050
00052 inline void setMaxEvents(unsigned int n) { m_max_events = n; }
00053
00055 void addLogString(const std::string& log_string);
00056
00058 void writeLogEvents(pion::net::HTTPResponseWriterPtr& writer);
00059
00060 private:
00062 static const unsigned int DEFAULT_MAX_EVENTS;
00063
00065 unsigned int m_max_events;
00066
00068 unsigned int m_num_events;
00069
00071 std::list<std::string> m_log_events;
00072
00074 boost::mutex m_log_mutex;
00075
00076 #if defined(PION_USE_LOG4CXX)
00077 public:
00078
00079 virtual void close() {}
00080 virtual bool requiresLayout() const { return false; }
00081 protected:
00083 virtual void append(const log4cxx::spi::LoggingEventPtr& event);
00084
00085 virtual void append(const log4cxx::spi::LoggingEventPtr& event,
00086 log4cxx::helpers::Pool& pool)
00087 {
00088 append(event);
00089 }
00090 #elif defined(PION_USE_LOG4CPLUS)
00091 public:
00092
00093 virtual void close() {}
00094 protected:
00095 virtual void append(const log4cplus::spi::InternalLoggingEvent& event);
00096 private:
00098 log4cplus::LogLevelManager m_log_level_manager;
00099 #elif defined(PION_USE_LOG4CPP)
00100 public:
00101
00102 virtual void close() {}
00103 virtual bool requiresLayout() const { return true; }
00104 virtual void setLayout(log4cpp::Layout* layout) { m_layout_ptr.reset(layout); }
00105 protected:
00107 virtual void _append(const log4cpp::LoggingEvent& event);
00108 private:
00110 boost::scoped_ptr<log4cpp::Layout> m_layout_ptr;
00111 #endif
00112
00113 };
00114
00115
00119 class LogService :
00120 public pion::net::WebService
00121 {
00122 public:
00123
00124 LogService(void);
00125 virtual ~LogService();
00126
00128 virtual void operator()(pion::net::HTTPRequestPtr& request,
00129 pion::net::TCPConnectionPtr& tcp_conn);
00130
00132 inline LogServiceAppender& getLogAppender(void) {
00133 return dynamic_cast<LogServiceAppender&>(*m_log_appender_ptr);
00134 }
00135
00136 private:
00138 PionLogAppenderPtr m_log_appender_ptr;
00139 };
00140
00141
00142 }
00143 }
00144
00145 #endif