10 #include "LogService.hpp"
12 #if defined(PION_USE_LOG4CXX)
13 #include <log4cxx/spi/loggingevent.h>
14 #include <boost/lexical_cast.hpp>
15 #elif defined(PION_USE_LOG4CPLUS)
16 #include <log4cplus/spi/loggingevent.h>
17 #include <boost/lexical_cast.hpp>
18 #elif defined(PION_USE_LOG4CPP)
19 #include <log4cpp/BasicLayout.hh>
22 #include <pion/http/response_writer.hpp>
32 const unsigned int LogServiceAppender::DEFAULT_MAX_EVENTS = 25;
37 #if defined(PION_USE_LOG4CPP)
38 LogServiceAppender::LogServiceAppender(
void)
39 : log4cpp::AppenderSkeleton(
"LogServiceAppender"),
40 m_max_events(DEFAULT_MAX_EVENTS), m_num_events(0),
41 m_layout_ptr(new log4cpp::BasicLayout())
44 LogServiceAppender::LogServiceAppender(
void)
45 : m_max_events(DEFAULT_MAX_EVENTS), m_num_events(0)
49 LogServiceAppender::~LogServiceAppender()
51 #if defined(PION_USE_LOG4CPLUS)
57 #if defined(PION_USE_LOG4CXX)
58 void LogServiceAppender::append(
const log4cxx::spi::LoggingEventPtr& event)
61 std::string formatted_string(boost::lexical_cast<std::string>(event->getTimeStamp()));
62 formatted_string +=
' ';
63 formatted_string +=
event->getLevel()->toString();
64 formatted_string +=
' ';
65 formatted_string +=
event->getLoggerName();
66 formatted_string +=
" - ";
67 formatted_string +=
event->getRenderedMessage();
68 formatted_string +=
'\n';
71 #elif defined(PION_USE_LOG4CPLUS)
72 void LogServiceAppender::append(
const log4cplus::spi::InternalLoggingEvent& event)
75 std::string formatted_string(boost::lexical_cast<std::string>(event.getTimestamp().sec()));
76 formatted_string +=
' ';
77 formatted_string += m_log_level_manager.toString(event.getLogLevel());
78 formatted_string +=
' ';
79 formatted_string +=
event.getLoggerName();
80 formatted_string +=
" - ";
81 formatted_string +=
event.getMessage();
82 formatted_string +=
'\n';
85 #elif defined(PION_USE_LOG4CPP)
86 void LogServiceAppender::_append(
const log4cpp::LoggingEvent& event)
88 std::string formatted_string(m_layout_ptr->format(event));
95 boost::mutex::scoped_lock log_lock(m_log_mutex);
96 m_log_events.push_back(log_string);
98 while (m_num_events > m_max_events) {
99 m_log_events.erase(m_log_events.begin());
106 #if defined(PION_USE_LOG4CXX) || defined(PION_USE_LOG4CPLUS) || defined(PION_USE_LOG4CPP)
107 boost::mutex::scoped_lock log_lock(m_log_mutex);
108 for (std::list<std::string>::const_iterator i = m_log_events.begin();
109 i != m_log_events.end(); ++i)
113 #elif defined(PION_DISABLE_LOGGING)
114 writer <<
"Logging is disabled." << http::types::STRING_CRLF;
116 writer <<
"Using ostream logging." << http::types::STRING_CRLF;
123 LogService::LogService(
void)
126 #if defined(PION_USE_LOG4CXX)
127 m_log_appender_ptr->setName(
"LogServiceAppender");
128 log4cxx::Logger::getRootLogger()->addAppender(m_log_appender_ptr);
129 #elif defined(PION_USE_LOG4CPLUS)
130 m_log_appender_ptr->setName(
"LogServiceAppender");
131 log4cplus::Logger::getRoot().addAppender(m_log_appender_ptr);
132 #elif defined(PION_USE_LOG4CPP)
133 log4cpp::Category::getRoot().addAppender(m_log_appender_ptr);
137 LogService::~LogService()
139 #if defined(PION_USE_LOG4CXX)
141 log4cxx::Logger::getRootLogger()->removeAppender(m_log_appender_ptr);
142 #elif defined(PION_USE_LOG4CPLUS)
144 log4cplus::Logger::getRoot().removeAppender(
"LogServiceAppender");
145 #elif defined(PION_USE_LOG4CPP)
147 log4cpp::Category::getRoot().removeAppender(m_log_appender_ptr);
149 delete m_log_appender_ptr;
159 writer->get_response().set_content_type(http::types::CONTENT_TYPE_TEXT);
void writeLogEvents(pion::http::response_writer_ptr &writer)
writes the events cached in memory to a response stream
virtual void operator()(pion::http::request_ptr &http_request_ptr, pion::tcp::connection_ptr &tcp_conn)
handles a new HTTP request
LogServiceAppender & getLogAppender(void)
returns the log appender used by LogService
static boost::shared_ptr< response_writer > create(tcp::connection_ptr &tcp_conn, http::response_ptr &http_response_ptr, finished_handler_t handler=finished_handler_t())
void addLogString(const std::string &log_string)
adds a formatted log message to the memory cache