10 #ifndef __PION_PIONLOGGER_HEADER__ 11 #define __PION_PIONLOGGER_HEADER__ 13 #include <pion/PionConfig.hpp> 16 #if defined(PION_USE_LOG4CXX) 22 #include <log4cxx/logger.h> 25 #pragma warning(disable: 4231) // nonstandard extension used : 'extern' before template explicit instantiation 27 #include <log4cxx/basicconfigurator.h> 28 #include <log4cxx/propertyconfigurator.h> 35 #pragma comment(lib, "log4cxxd") 37 #pragma comment(lib, "log4cxx") 39 #pragma comment(lib, "odbc32") 43 typedef log4cxx::LoggerPtr PionLogger;
44 typedef log4cxx::AppenderSkeleton PionLogAppender;
45 typedef PionLogAppender * PionLogAppenderPtr;
48 #define PION_HAS_LOG_APPENDER 1 49 #define PION_LOG_CONFIG_BASIC log4cxx::BasicConfigurator::configure(); 50 #define PION_LOG_CONFIG(FILE) log4cxx::PropertyConfigurator::configure(FILE); 51 #define PION_GET_LOGGER(NAME) log4cxx::Logger::getLogger(NAME) 53 #define PION_LOG_SETLEVEL_DEBUG(LOG) LOG->setLevel(log4cxx::Level::toLevel(log4cxx::Level::DEBUG_INT)); 54 #define PION_LOG_SETLEVEL_INFO(LOG) LOG->setLevel(log4cxx::Level::toLevel(log4cxx::Level::INFO_INT)); 55 #define PION_LOG_SETLEVEL_WARN(LOG) LOG->setLevel(log4cxx::Level::toLevel(log4cxx::Level::WARN_INT)); 56 #define PION_LOG_SETLEVEL_ERROR(LOG) LOG->setLevel(log4cxx::Level::toLevel(log4cxx::Level::ERROR_INT)); 57 #define PION_LOG_SETLEVEL_FATAL(LOG) LOG->setLevel(log4cxx::Level::toLevel(log4cxx::Level::FATAL_INT)); 58 #define PION_LOG_SETLEVEL_UP(LOG) LOG->setLevel(LOG->getLevel()->toInt()+1); 59 #define PION_LOG_SETLEVEL_DOWN(LOG) LOG->setLevel(LOG->getLevel()->toInt()-1); 61 #define PION_LOG_DEBUG LOG4CXX_DEBUG 62 #define PION_LOG_INFO LOG4CXX_INFO 63 #define PION_LOG_WARN LOG4CXX_WARN 64 #define PION_LOG_ERROR LOG4CXX_ERROR 65 #define PION_LOG_FATAL LOG4CXX_FATAL 67 #elif defined(PION_USE_LOG4CPLUS) 71 #include <log4cplus/logger.h> 72 #include <log4cplus/configurator.h> 73 #include <log4cplus/appender.h> 74 #include <log4cplus/spi/loggingevent.h> 75 #include <log4cplus/loglevel.h> 77 #include <boost/circular_buffer.hpp> 78 #include <boost/thread/mutex.hpp> 82 #pragma comment(lib, "log4cplusD") 84 #pragma comment(lib, "log4cplus") 89 typedef log4cplus::Logger PionLogger;
90 typedef log4cplus::Appender PionLogAppender;
91 typedef log4cplus::SharedAppenderPtr PionLogAppenderPtr;
96 class CircularBufferAppender :
public log4cplus::Appender
99 typedef boost::circular_buffer<log4cplus::spi::InternalLoggingEvent> LogEventBuffer;
102 CircularBufferAppender(
void) : m_log_events(1000) {};
103 virtual ~CircularBufferAppender() {}
106 const LogEventBuffer& getLogIterator()
const {
112 virtual void close() {}
114 virtual void append(
const log4cplus::spi::InternalLoggingEvent& event) {
115 boost::mutex::scoped_lock log_lock(m_log_mutex);
116 m_log_events.push_back(*event.clone());
121 LogEventBuffer m_log_events;
124 boost::mutex m_log_mutex;
128 #define PION_HAS_LOG_APPENDER 1 129 #define PION_LOG_CONFIG_BASIC log4cplus::BasicConfigurator::doConfigure(); 130 #define PION_LOG_CONFIG(FILE) log4cplus::PropertyConfigurator::doConfigure(FILE); 131 #define PION_GET_LOGGER(NAME) log4cplus::Logger::getInstance(NAME) 133 #define PION_LOG_SETLEVEL_DEBUG(LOG) LOG.setLogLevel(log4cplus::DEBUG_LOG_LEVEL); 134 #define PION_LOG_SETLEVEL_INFO(LOG) LOG.setLogLevel(log4cplus::INFO_LOG_LEVEL); 135 #define PION_LOG_SETLEVEL_WARN(LOG) LOG.setLogLevel(log4cplus::WARN_LOG_LEVEL); 136 #define PION_LOG_SETLEVEL_ERROR(LOG) LOG.setLogLevel(log4cplus::ERROR_LOG_LEVEL); 137 #define PION_LOG_SETLEVEL_FATAL(LOG) LOG.setLogLevel(log4cplus::FATAL_LOG_LEVEL); 138 #define PION_LOG_SETLEVEL_UP(LOG) LOG.setLogLevel(LOG.getLogLevel()+1); 139 #define PION_LOG_SETLEVEL_DOWN(LOG) LOG.setLogLevel(LOG.getLogLevel()-1); 141 #define PION_LOG_DEBUG LOG4CPLUS_DEBUG 142 #define PION_LOG_INFO LOG4CPLUS_INFO 143 #define PION_LOG_WARN LOG4CPLUS_WARN 144 #define PION_LOG_ERROR LOG4CPLUS_ERROR 145 #define PION_LOG_FATAL LOG4CPLUS_FATAL 148 #elif defined(PION_USE_LOG4CPP) 152 #include <log4cpp/Category.hh> 153 #include <log4cpp/BasicLayout.hh> 154 #include <log4cpp/OstreamAppender.hh> 155 #include <log4cpp/AppenderSkeleton.hh> 156 #include <log4cpp/PropertyConfigurator.hh> 159 typedef log4cpp::Category* PionLogger;
160 typedef log4cpp::AppenderSkeleton PionLogAppender;
161 typedef PionLogAppender * PionLogAppenderPtr;
164 #define PION_HAS_LOG_APPENDER 1 165 #define PION_LOG_CONFIG_BASIC { log4cpp::OstreamAppender *app = new log4cpp::OstreamAppender("cout", &std::cout); app->setLayout(new log4cpp::BasicLayout()); log4cpp::Category::getRoot().setAppender(app); } 166 #define PION_LOG_CONFIG(FILE) { log4cpp::PropertyConfigurator::configure(FILE); } 167 #define PION_GET_LOGGER(NAME) (&log4cpp::Category::getInstance(NAME)) 169 #define PION_LOG_SETLEVEL_DEBUG(LOG) { LOG->setPriority(log4cpp::Priority::DEBUG); } 170 #define PION_LOG_SETLEVEL_INFO(LOG) { LOG->setPriority(log4cpp::Priority::INFO); } 171 #define PION_LOG_SETLEVEL_WARN(LOG) { LOG->setPriority(log4cpp::Priority::WARN); } 172 #define PION_LOG_SETLEVEL_ERROR(LOG) { LOG->setPriority(log4cpp::Priority::ERROR); } 173 #define PION_LOG_SETLEVEL_FATAL(LOG) { LOG->setPriority(log4cpp::Priority::FATAL); } 174 #define PION_LOG_SETLEVEL_UP(LOG) { LOG->setPriority(LOG.getPriority()+1); } 175 #define PION_LOG_SETLEVEL_DOWN(LOG) { LOG->setPriority(LOG.getPriority()-1); } 177 #define PION_LOG_DEBUG(LOG, MSG) if (LOG->getPriority()>=log4cpp::Priority::DEBUG) { LOG->debugStream() << MSG; } 178 #define PION_LOG_INFO(LOG, MSG) if (LOG->getPriority()>=log4cpp::Priority::INFO) { LOG->infoStream() << MSG; } 179 #define PION_LOG_WARN(LOG, MSG) if (LOG->getPriority()>=log4cpp::Priority::WARN) { LOG->warnStream() << MSG; } 180 #define PION_LOG_ERROR(LOG, MSG) if (LOG->getPriority()>=log4cpp::Priority::ERROR) { LOG->errorStream() << MSG; } 181 #define PION_LOG_FATAL(LOG, MSG) if (LOG->getPriority()>=log4cpp::Priority::FATAL) { LOG->fatalStream() << MSG; } 183 #elif defined(PION_DISABLE_LOGGING) 187 typedef int PionLogger;
188 typedef int PionLogAppender;
189 typedef PionLogAppender * PionLogAppenderPtr;
192 #undef PION_HAS_LOG_APPENDER 193 #define PION_LOG_CONFIG_BASIC {} 194 #define PION_LOG_CONFIG(FILE) {} 195 #define PION_GET_LOGGER(NAME) 0 198 #define PION_LOG_SETLEVEL_DEBUG(LOG) { if (false) ++LOG; } 199 #define PION_LOG_SETLEVEL_INFO(LOG) { if (false) ++LOG; } 200 #define PION_LOG_SETLEVEL_WARN(LOG) { if (false) ++LOG; } 201 #define PION_LOG_SETLEVEL_ERROR(LOG) { if (false) ++LOG; } 202 #define PION_LOG_SETLEVEL_FATAL(LOG) { if (false) ++LOG; } 203 #define PION_LOG_SETLEVEL_UP(LOG) { if (false) ++LOG; } 204 #define PION_LOG_SETLEVEL_DOWN(LOG) { if (false) ++LOG; } 207 #define PION_LOG_DEBUG(LOG, MSG) { if (false) ++LOG; } 208 #define PION_LOG_INFO(LOG, MSG) { if (false) ++LOG; } 209 #define PION_LOG_WARN(LOG, MSG) { if (false) ++LOG; } 210 #define PION_LOG_ERROR(LOG, MSG) { if (false) ++LOG; } 211 #define PION_LOG_FATAL(LOG, MSG) { if (false) ++LOG; } 215 #define PION_USE_OSTREAM_LOGGING 223 struct PION_COMMON_API PionLogger {
224 enum PionPriorityType {
225 LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_WARN,
226 LOG_LEVEL_ERROR, LOG_LEVEL_FATAL
229 PionLogger(
void) : m_name(
"pion") {}
230 PionLogger(
const std::string& name) : m_name(name) {}
231 PionLogger(
const PionLogger& p) : m_name(p.m_name) {}
233 static PionPriorityType m_priority;
235 typedef int PionLogAppender;
236 typedef PionLogAppender * PionLogAppenderPtr;
239 #undef PION_HAS_LOG_APPENDER 240 #define PION_LOG_CONFIG_BASIC {} 241 #define PION_LOG_CONFIG(FILE) {} 242 #define PION_GET_LOGGER(NAME) pion::PionLogger(NAME) 244 #define PION_LOG_SETLEVEL_DEBUG(LOG) { LOG.m_priority = pion::PionLogger::LOG_LEVEL_DEBUG; } 245 #define PION_LOG_SETLEVEL_INFO(LOG) { LOG.m_priority = pion::PionLogger::LOG_LEVEL_INFO; } 246 #define PION_LOG_SETLEVEL_WARN(LOG) { LOG.m_priority = pion::PionLogger::LOG_LEVEL_WARN; } 247 #define PION_LOG_SETLEVEL_ERROR(LOG) { LOG.m_priority = pion::PionLogger::LOG_LEVEL_ERROR; } 248 #define PION_LOG_SETLEVEL_FATAL(LOG) { LOG.m_priority = pion::PionLogger::LOG_LEVEL_FATAL; } 249 #define PION_LOG_SETLEVEL_UP(LOG) { ++LOG.m_priority; } 250 #define PION_LOG_SETLEVEL_DOWN(LOG) { --LOG.m_priority; } 252 #define PION_LOG_DEBUG(LOG, MSG) if (LOG.m_priority <= pion::PionLogger::LOG_LEVEL_DEBUG) { std::cout << time(NULL) << " DEBUG " << LOG.m_name << ' ' << MSG << std::endl; } 253 #define PION_LOG_INFO(LOG, MSG) if (LOG.m_priority <= pion::PionLogger::LOG_LEVEL_INFO) { std::cout << time(NULL) << " INFO " << LOG.m_name << ' ' << MSG << std::endl; } 254 #define PION_LOG_WARN(LOG, MSG) if (LOG.m_priority <= pion::PionLogger::LOG_LEVEL_WARN) { std::cerr << time(NULL) << " WARN " << LOG.m_name << ' ' << MSG << std::endl; } 255 #define PION_LOG_ERROR(LOG, MSG) if (LOG.m_priority <= pion::PionLogger::LOG_LEVEL_ERROR) { std::cerr << time(NULL) << " ERROR " << LOG.m_name << ' ' << MSG << std::endl; } 256 #define PION_LOG_FATAL(LOG, MSG) if (LOG.m_priority <= pion::PionLogger::LOG_LEVEL_FATAL) { std::cerr << time(NULL) << " FATAL " << LOG.m_name << ' ' << MSG << std::endl; } the following enables use of the lock-free cache