00001
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00031 #define LOG4SENDPP_NEED_EXPORTS
00032 #include <log4sendpp/log4sendpp.h>
00033
00034 #include <log4sendpp/formatter.h>
00035 #include <log4sendpp/logger.h>
00036 #include <log4sendpp/tcpip_appender.h>
00037 #include <log4sendpp/file_appender.h>
00038 #include <log4sendpp/xmlformatter.h>
00039 #include <log4sendpp/simpleformatter.h>
00040
00041 #include <ctime>
00042
00043 #include <time.h>
00044 #ifdef __unix__
00045 #include <sys/time.h>
00046 #endif
00047
00048 #if defined(HAVE_FTIME) || defined(HAVE_STD_FTIME)
00049 #include <sys/timeb.h>
00050 #endif
00051
00052
00053 LOG4SENDPP_NS_START
00054
00055
00056 LOG4SENDPP_API_IMPL0 Logger::Logger()
00057 : diaginfo(&logmdc, &logndc, &logproperty)
00058 {
00059 primary_appender = 0;
00060 secondary_appender = 0;
00061 setLevel(Info);
00062 setLocationInfoEnabled(true);
00063 }
00064
00065
00066 LOG4SENDPP_API_IMPL0 Logger::~Logger()
00067 {
00068 delete primary_appender;
00069 delete secondary_appender;
00070
00071 primary_appender = 0;
00072 secondary_appender = 0;
00073 }
00074
00075
00076 Logger Logger::default_logger;
00077 bool Logger::init_logger = true;
00078
00079
00080 LOG4SENDPP_API_IMPL(void) Logger::initLogging(const LOG4SENDPP_STD_NS::string &appname,
00081 const LOG4SENDPP_STD_NS::string &hostname)
00082 {
00083 initLogging(new TcpIpAppender (new XmlFormatter(appname), hostname),
00084 new FileAppender (new SimpleFormatter(appname), appname + "-log.txt"));
00085 }
00086
00087
00088 LOG4SENDPP_API_IMPL(void) Logger::initLogging(Appender *prim_app,
00089 Appender *sec_app)
00090 {
00091 default_logger.setPrimaryAppender(prim_app);
00092 default_logger.setSecondaryAppender(sec_app);
00093 init_logger = false;
00094 }
00095
00096
00097 LOG4SENDPP_API_IMPL(Logger &) Logger::logger()
00098 {
00099 if (init_logger)
00100 {
00101 initLogging(new TcpIpAppender (new XmlFormatter("log4sendpp-app", "localhost"), "localhost"),
00102 new FileAppender (new SimpleFormatter("log4sendpp-app"), "log4sendpp-app.txt"));
00103 }
00104
00105 return default_logger;
00106 }
00107
00108
00109 LOG4SENDPP_API_IMPL(void) Logger::setPrimaryAppender(Appender *app)
00110 {
00111 delete primary_appender;
00112 primary_appender = app;
00113 }
00114
00115
00116
00117 LOG4SENDPP_API_IMPL(Appender *) Logger::getPrimaryAppender() const
00118 {
00119 return primary_appender;
00120 }
00121
00122
00123 LOG4SENDPP_API_IMPL(void) Logger::setSecondaryAppender(Appender *app)
00124 {
00125 delete secondary_appender;
00126 secondary_appender = app;
00127 }
00128
00129
00130 LOG4SENDPP_API_IMPL(Appender *) Logger::getSecondaryAppender() const
00131 {
00132 return secondary_appender;
00133 }
00134
00135
00136 LOG4SENDPP_API_IMPL(void) Logger::setLevel (Level in_level)
00137 {
00138 current_level = in_level;
00139 }
00140
00141
00142 LOG4SENDPP_API_IMPL(Logger::Level) Logger::getLevel () const
00143 {
00144 return current_level;
00145 }
00146
00147
00148 LOG4SENDPP_API_IMPL(bool) Logger::isLogged (Level level) const
00149 {
00150 return level >= current_level;
00151 }
00152
00153
00154 LOG4SENDPP_API_IMPL(bool) Logger::isLocationInfoEnabled() const
00155 {
00156 return loc_info;
00157 }
00158
00159
00160 LOG4SENDPP_API_IMPL(void) Logger::setLocationInfoEnabled(bool enable)
00161 {
00162 loc_info = enable;
00163 }
00164
00165
00166 LOG4SENDPP_API_IMPL(void)
00167 Logger::trace (LOG4SENDPP_STD_NS::string msg,
00168 LOG4SENDPP_STD_NS::string category,
00169 const LocationInformation *info)
00170 {
00171 log(Trace, msg, category, info);
00172 }
00173
00174
00175 LOG4SENDPP_API_IMPL(void)
00176 Logger::debug (LOG4SENDPP_STD_NS::string msg,
00177 LOG4SENDPP_STD_NS::string category,
00178 const LocationInformation *info)
00179 {
00180 log(Debug, msg, category, info);
00181 }
00182
00183
00184 LOG4SENDPP_API_IMPL(void)
00185 Logger::info (LOG4SENDPP_STD_NS::string msg,
00186 LOG4SENDPP_STD_NS::string category,
00187 const LocationInformation *info)
00188 {
00189 log(Info, msg, category, info);
00190 }
00191
00192
00193 LOG4SENDPP_API_IMPL(void)
00194 Logger::warn (LOG4SENDPP_STD_NS::string msg,
00195 LOG4SENDPP_STD_NS::string category,
00196 const LocationInformation *info)
00197 {
00198 log(Warning, msg, category, info);
00199 }
00200
00201
00202 LOG4SENDPP_API_IMPL(void)
00203 Logger::error (LOG4SENDPP_STD_NS::string msg,
00204 LOG4SENDPP_STD_NS::string category,
00205 const LocationInformation *info)
00206 {
00207 log(Error, msg, category, info);
00208 }
00209
00210
00211 LOG4SENDPP_API_IMPL(void)
00212 Logger::fatal (LOG4SENDPP_STD_NS::string msg,
00213 LOG4SENDPP_STD_NS::string category,
00214 const LocationInformation *info)
00215 {
00216 log(Fatal, msg, category, info);
00217 }
00218
00219
00220 LOG4SENDPP_API_IMPL(NDC&) Logger::ndc()
00221 {
00222 return logndc;
00223 }
00224
00225
00226 LOG4SENDPP_API_IMPL(MDC&) Logger::mdc()
00227 {
00228 return logmdc;
00229 }
00230
00231
00232 LOG4SENDPP_API_IMPL(Property&) Logger::property()
00233 {
00234 return logproperty;
00235 }
00236
00237
00238 LOG4SENDPP_API_IMPL(void) Logger::log (Level level,
00239 LOG4SENDPP_STD_NS::string msg,
00240 LOG4SENDPP_STD_NS::string category,
00241 const LocationInformation *info)
00242 {
00243 if (level >= current_level)
00244 {
00245 LOG4SENDPP_INT64 stamp = currentTimeMillis();
00246
00247 if (primary_appender != 0 && primary_appender->isWorking())
00248 primary_appender->append(level, msg, category, stamp, info, &diaginfo);
00249
00250 else if (secondary_appender != 0 && secondary_appender->isWorking())
00251 secondary_appender->append(level, msg, category, stamp, info, &diaginfo);
00252 }
00253 }
00254
00255
00256 LOG4SENDPP_INT64 LOG4SENDPP_API_IMPL0 Logger::currentTimeMillis()
00257 {
00258 #if defined(HAVE_GETTIMEOFDAY)
00259
00260 timeval tp;
00261 ::gettimeofday(&tp, 0);
00262
00263 return ((LOG4SENDPP_INT64)tp.tv_sec * 1000) + (LOG4SENDPP_INT64)(tp.tv_usec / 1000);
00264
00265 #elif defined(HAVE_FTIME) || defined(HAVE_STD_FTIME)
00266
00267 struct timeb tp;
00268 ::ftime(&tp);
00269
00270 return ((LOG4SENDPP_INT64)tp.time * 1000) + (LOG4SENDPP_INT64)tp.millitm;
00271
00272 #else
00273
00274 return (LOG4SENDPP_INT64)LOG4SENDPP_STD_NS::time(0) * 1000;
00275
00276 #endif
00277 }
00278
00279
00280 LOG4SENDPP_NS_END
00281