00001
00002
00003
00004
00005
00006
00007
00008 #include "ibrcommon/Logger.h"
00009 #include "ibrcommon/SyslogStream.h"
00010 #include <algorithm>
00011 #include <sys/time.h>
00012
00013 namespace ibrcommon
00014 {
00015 std::list<Logger::LoggerOutput> Logger::_logger;
00016 int Logger::_verbosity = 0;
00017 bool Logger::_syslog = 0;
00018 unsigned char Logger::_syslog_mask = 0;
00019 Logger::endl_flag Logger::endl;
00020
00021 Logger::Logger(LogLevel level, int debug_verbosity)
00022 : _level(level), _debug_verbosity(debug_verbosity)
00023 {
00024 }
00025
00026 Logger::Logger(const Logger &obj)
00027 : std::stringstream(obj.str()), _level(obj._level), _debug_verbosity(obj._debug_verbosity)
00028 {
00029 }
00030
00031 Logger::~Logger()
00032 {
00033 }
00034
00035 Logger Logger::emergency()
00036 {
00037 return Logger(LOGGER_EMERG);
00038 }
00039
00040 Logger Logger::alert()
00041 {
00042 return Logger(LOGGER_ALERT);
00043 }
00044
00045 Logger Logger::critical()
00046 {
00047 return Logger(LOGGER_CRIT);
00048 }
00049
00050 Logger Logger::error()
00051 {
00052 return Logger(LOGGER_ERR);
00053 }
00054
00055 Logger Logger::warning()
00056 {
00057 return Logger(LOGGER_WARNING);
00058 }
00059
00060 Logger Logger::notice()
00061 {
00062 return Logger(LOGGER_NOTICE);
00063 }
00064
00065 Logger Logger::info()
00066 {
00067 return Logger(LOGGER_INFO);
00068 }
00069
00070 Logger Logger::debug(int verbosity)
00071 {
00072 return Logger(LOGGER_DEBUG, verbosity);
00073 }
00074
00075 void Logger::setVerbosity(const int verbosity)
00076 {
00077 Logger::_verbosity = verbosity;
00078 }
00079
00080 int Logger::getVerbosity()
00081 {
00082 return Logger::_verbosity;
00083 }
00084
00085 void Logger::addStream(std::ostream &stream, const unsigned char logmask, const unsigned char options)
00086 {
00087 _logger.push_back( LoggerOutput(stream, logmask, options) );
00088 }
00089
00090 void Logger::enableSyslog(const char *name, int option, int facility, const unsigned char logmask)
00091 {
00092
00093 ::openlog(name, option, facility);
00094 Logger::_syslog = true;
00095 Logger::_syslog_mask = logmask;
00096 }
00097
00098 void Logger::flush()
00099 {
00100 if (Logger::_verbosity >= _debug_verbosity)
00101 {
00102 for (std::list<LoggerOutput>::iterator iter = _logger.begin(); iter != _logger.end(); iter++)
00103 {
00104 LoggerOutput &output = (*iter);
00105 output.log(*this);
00106 }
00107
00108
00109 if (Logger::_syslog)
00110 {
00111 if (_level & Logger::_syslog_mask)
00112 {
00113 switch (_level)
00114 {
00115 case LOGGER_EMERG:
00116 ::syslog( LOG_EMERG, "%s", str().c_str() );
00117 break;
00118
00119 case LOGGER_ALERT:
00120 ::syslog( LOG_ALERT, "%s", str().c_str() );
00121 break;
00122
00123 case LOGGER_CRIT:
00124 ::syslog( LOG_CRIT, "%s", str().c_str() );
00125 break;
00126
00127 case LOGGER_ERR:
00128 ::syslog( LOG_ERR, "%s", str().c_str() );
00129 break;
00130
00131 case LOGGER_WARNING:
00132 ::syslog( LOG_WARNING, "%s", str().c_str() );
00133 break;
00134
00135 case LOGGER_NOTICE:
00136 ::syslog( LOG_NOTICE, "%s", str().c_str() );
00137 break;
00138
00139 case LOGGER_INFO:
00140 ::syslog( LOG_INFO, "%s", str().c_str() );
00141 break;
00142
00143 case LOGGER_DEBUG:
00144 ::syslog( LOG_DEBUG, "%s", str().c_str() );
00145 break;
00146
00147 default:
00148 ::syslog( LOG_NOTICE, "%s", str().c_str() );
00149 break;
00150 }
00151 }
00152 }
00153 }
00154 }
00155
00156 void Logger::LoggerOutput::log(const Logger &log)
00157 {
00158 if (_level & log._level)
00159 {
00160 std::list<std::string> prefixes;
00161
00162
00163 if (_options & LOG_TIMESTAMP)
00164 {
00165
00166 time_t ltime;
00167 ltime=time(NULL);
00168 std::string timestamp(asctime( localtime(<ime) ));
00169 timestamp.erase(std::remove(timestamp.begin(), timestamp.end(), '\n'), timestamp.end());
00170 prefixes.push_back(timestamp);
00171 }
00172
00173 if (_options & LOG_LEVEL)
00174 {
00175
00176 switch (log._level)
00177 {
00178 case LOGGER_EMERG:
00179 prefixes.push_back("EMERGENCY");
00180 break;
00181
00182 case LOGGER_ALERT:
00183 prefixes.push_back("ALERT");
00184 break;
00185
00186 case LOGGER_CRIT:
00187 prefixes.push_back("CRTITICAL");
00188 break;
00189
00190 case LOGGER_ERR:
00191 prefixes.push_back("ERROR");
00192 break;
00193
00194 case LOGGER_WARNING:
00195 prefixes.push_back("WARNING");
00196 break;
00197
00198 case LOGGER_NOTICE:
00199 prefixes.push_back("NOTICE");
00200 break;
00201
00202 case LOGGER_INFO:
00203 prefixes.push_back("INFO");
00204 break;
00205
00206 case LOGGER_DEBUG:
00207 {
00208 std::stringstream ss;
00209 ss << "DEBUG." << log._debug_verbosity;
00210 prefixes.push_back(ss.str());
00211 break;
00212 }
00213
00214 default:
00215 break;
00216 }
00217 }
00218
00219 if (_options & LOG_HOSTNAME)
00220 {
00221 char *hostname_array = new char[64];
00222 if ( gethostname(hostname_array, 64) == 0 )
00223 {
00224 std::string hostname(hostname_array);
00225 prefixes.push_back(hostname);
00226 }
00227
00228 delete[] hostname_array;
00229 }
00230
00231
00232 for (std::list<std::string>::const_iterator iter = prefixes.begin(); iter != prefixes.end(); iter++)
00233 {
00234 if (iter == prefixes.begin())
00235 {
00236 _stream << (*iter);
00237 }
00238 else
00239 {
00240 _stream << " " << (*iter);
00241 }
00242 }
00243
00244 if (!prefixes.empty())
00245 {
00246 _stream << ": ";
00247 }
00248
00249 _stream << log.rdbuf() << std::endl;
00250 }
00251 }
00252
00253 Logger::LoggerOutput::LoggerOutput(std::ostream &stream, const unsigned char logmask, const unsigned char options)
00254 : _stream(stream), _level(logmask), _options(options)
00255 {
00256 }
00257
00258 Logger::LoggerOutput::~LoggerOutput()
00259 {
00260 }
00261 }