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)
50 #if defined(PION_USE_LOG4CXX) 51 void LogServiceAppender::append(
const log4cxx::spi::LoggingEventPtr& event)
54 std::string formatted_string(boost::lexical_cast<std::string>(event->getTimeStamp()));
55 formatted_string +=
' ';
56 formatted_string +=
event->getLevel()->toString();
57 formatted_string +=
' ';
58 formatted_string +=
event->getLoggerName();
59 formatted_string +=
" - ";
60 formatted_string +=
event->getRenderedMessage();
61 formatted_string +=
'\n';
62 addLogString(formatted_string);
64 #elif defined(PION_USE_LOG4CPLUS) 65 void LogServiceAppender::append(
const log4cplus::spi::InternalLoggingEvent& event)
68 std::string formatted_string(boost::lexical_cast<std::string>(event.getTimestamp().sec()));
69 formatted_string +=
' ';
70 formatted_string += m_log_level_manager.toString(event.getLogLevel());
71 formatted_string +=
' ';
72 formatted_string +=
event.getLoggerName();
73 formatted_string +=
" - ";
74 formatted_string +=
event.getMessage();
75 formatted_string +=
'\n';
76 addLogString(formatted_string);
78 #elif defined(PION_USE_LOG4CPP) 79 void LogServiceAppender::_append(
const log4cpp::LoggingEvent& event)
81 std::string formatted_string(m_layout_ptr->format(event));
82 addLogString(formatted_string);
88 boost::mutex::scoped_lock log_lock(m_log_mutex);
89 m_log_events.push_back(log_string);
91 while (m_num_events > m_max_events) {
92 m_log_events.erase(m_log_events.begin());
99 #if defined(PION_USE_LOG4CXX) || defined(PION_USE_LOG4CPLUS) || defined(PION_USE_LOG4CPP) 100 boost::mutex::scoped_lock log_lock(m_log_mutex);
101 for (std::list<std::string>::const_iterator i = m_log_events.begin();
102 i != m_log_events.end(); ++i)
106 #elif defined(PION_DISABLE_LOGGING) 107 writer <<
"Logging is disabled." << http::types::STRING_CRLF;
109 writer <<
"Using ostream logging." << http::types::STRING_CRLF;
116 LogService::LogService(
void)
119 #if defined(PION_USE_LOG4CXX) 120 m_log_appender_ptr->setName(
"LogServiceAppender");
121 log4cxx::Logger::getRootLogger()->addAppender(m_log_appender_ptr);
122 #elif defined(PION_USE_LOG4CPLUS) 123 m_log_appender_ptr->setName(
"LogServiceAppender");
124 log4cplus::Logger::getRoot().addAppender(m_log_appender_ptr);
125 #elif defined(PION_USE_LOG4CPP) 126 log4cpp::Category::getRoot().addAppender(m_log_appender_ptr);
130 LogService::~LogService()
132 #if defined(PION_USE_LOG4CXX) 134 log4cxx::Logger::getRootLogger()->removeAppender(m_log_appender_ptr);
135 #elif defined(PION_USE_LOG4CPLUS) 137 log4cplus::Logger::getRoot().removeAppender(
"LogServiceAppender");
138 #elif defined(PION_USE_LOG4CPP) 140 log4cpp::Category::getRoot().removeAppender(m_log_appender_ptr);
142 delete m_log_appender_ptr;
152 writer->get_response().set_content_type(http::types::CONTENT_TYPE_TEXT);
153 getLogAppender().writeLogEvents(writer);
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
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