logger.cpp

Go to the documentation of this file.
00001 
00008 /**************************************************************************
00009 
00010    begin                : Thu Sep 13 2007
00011    copyright            : (C) 2007 by Ewald Arnold
00012    email                : log4sendpp at ewald-arnold dot de
00013 
00014    This program is free software; you can redistribute it and/or modify
00015    it under the terms of the GNU Lesser General Public License as
00016    published by the Free Software Foundation; either version 2 of the License,
00017    or (at your option) any later version.
00018 
00019    This program is distributed in the hope that it will be useful,
00020    but WITHOUT ANY WARRANTY; without even the implied warranty of
00021    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00022    GNU General Public License for more details.
00023 
00024    You should have received a copy of the GNU Lesser General Public License
00025    along with this program; if not, write to the Free Software
00026    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00027 
00028  **/
00029 
00031 #define LOG4SENDPP_NEED_EXPORTS
00032 #include <log4sendpp/log4sendpp.h> // always first
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 

Generated on Sat Nov 24 14:41:22 2007 for log4sendpp by  doxygen 1.5.3