OPeNDAP Hyrax Back End Server (BES) Updated for version 3.8.3

BESLog.cc

Go to the documentation of this file.
00001 // BESLog.cc
00002 
00003 // This file is part of bes, A C++ back-end server implementation framework
00004 // for the OPeNDAP Data Access Protocol.
00005 
00006 // Copyright (c) 2004-2009 University Corporation for Atmospheric Research
00007 // Author: Patrick West <pwest@ucar.edu> and Jose Garcia <jgarcia@ucar.edu>
00008 //
00009 // This library is free software; you can redistribute it and/or
00010 // modify it under the terms of the GNU Lesser General Public
00011 // License as published by the Free Software Foundation; either
00012 // version 2.1 of the License, or (at your option) any later version.
00013 // 
00014 // This library is distributed in the hope that it will be useful,
00015 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017 // Lesser General Public License for more details.
00018 // 
00019 // You should have received a copy of the GNU Lesser General Public
00020 // License along with this library; if not, write to the Free Software
00021 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 //
00023 // You can contact University Corporation for Atmospheric Research at
00024 // 3080 Center Green Drive, Boulder, CO 80301
00025  
00026 // (c) COPYRIGHT University Corporation for Atmospheric Research 2004-2005
00027 // Please read the full copyright statement in the file COPYRIGHT_UCAR.
00028 //
00029 // Authors:
00030 //      pwest       Patrick West <pwest@ucar.edu>
00031 //      jgarcia     Jose Garcia <jgarcia@ucar.edu>
00032 
00033 #include "config.h"
00034 
00035 #include <iostream>
00036 #include <time.h>
00037 #include <string>
00038 
00039 #include "BESLog.h"
00040 #include "TheBESKeys.h"
00041 #include "BESInternalFatalError.h"
00042 
00043 #if HAVE_UNISTD_H
00044 #include <unistd.h>
00045 #endif
00046 
00047 using std::cerr ;
00048 using std::endl ;
00049 using std::flush ;
00050 
00051 BESLog *BESLog::_instance = 0 ;
00052 
00068 BESLog::BESLog()
00069     : _flushed( 1 ),
00070       _file_buffer( 0 ),
00071       _suspended( 0 ),
00072       _verbose( false )
00073 {
00074     _suspended = 0 ;
00075     bool found = false ;
00076     try
00077     {
00078         TheBESKeys::TheKeys()->get_value( "BES.LogName", _file_name, found ) ;
00079     }
00080     catch( ... )
00081     {
00082         string err = (string)"BES Fatal: unable to determine log file name."
00083                      + " The key BES.LogName has multiple values" ;
00084         cerr << err << endl ;
00085         throw BESInternalFatalError( err, __FILE__, __LINE__ ) ;
00086     }
00087     if( _file_name == "" )
00088     {
00089         string err = (string)"BES Fatal: unable to determine log file name."
00090                      + " Please set BES.LogName in your initialization file" ;
00091         cerr << err << endl ;
00092         throw BESInternalFatalError( err, __FILE__, __LINE__ ) ;
00093     }
00094     _file_buffer = new ofstream( _file_name.c_str(), ios::out | ios::app ) ;
00095     if( !(*_file_buffer) )
00096     {
00097         string err = (string)"BES Fatal; cannot open log file "
00098                      + _file_name + "." ;
00099         cerr << err << endl ;
00100         throw BESInternalFatalError( err, __FILE__, __LINE__ ) ;
00101     } 
00102     found = false ;
00103     string verbose ;
00104     TheBESKeys::TheKeys()->get_value( "BES.LogVerbose", verbose, found ) ;
00105     if( verbose == "YES" || verbose == "Yes" || verbose == "yes" )
00106     {
00107         _verbose = true ;
00108     }
00109 }
00110 
00115 BESLog:: ~BESLog()
00116 {
00117     _file_buffer->close();
00118     delete _file_buffer;
00119     _file_buffer = 0 ;
00120 }
00121 
00128 void
00129 BESLog::dump_time()
00130 {
00131     const time_t sctime=time(NULL);
00132     const struct tm *sttime=localtime(&sctime); 
00133     char zone_name[10];
00134     strftime(zone_name, sizeof(zone_name), "%Z", sttime);
00135     char *b=asctime(sttime);
00136     (*_file_buffer)<<"["<<zone_name<<" ";
00137     for (register int j=0; b[j]!='\n'; j++)
00138         (*_file_buffer)<<b[j];
00139     pid_t thepid = getpid() ;
00140     (*_file_buffer)<<" id: "<<thepid<<"] ";
00141     _flushed = 0 ;
00142 }
00143 
00148 BESLog& BESLog::operator<<(string &s) 
00149 {
00150     if (!_suspended)
00151     {
00152         if (_flushed)
00153             dump_time();
00154         (*_file_buffer) << s;
00155     }
00156     return *this;
00157 }
00158 
00163 BESLog& BESLog::operator<<(const string &s) 
00164 {
00165     if (!_suspended)
00166     {
00167         if (_flushed)
00168             dump_time();
00169         (*_file_buffer) << s;
00170     }
00171     return *this;
00172 }
00173 
00178 BESLog& BESLog::operator<<(char *val) 
00179 {
00180     if (!_suspended)
00181     {
00182         if (_flushed)
00183             dump_time();
00184         if( val )
00185             (*_file_buffer) << val;
00186         else
00187             (*_file_buffer) << "NULL" ;
00188     }
00189     return *this;
00190 }
00191 
00196 BESLog& BESLog::operator<<(const char *val) 
00197 {
00198     if (!_suspended)
00199     {
00200         if (_flushed)
00201         {
00202             dump_time();
00203         }
00204         if( val )
00205             (*_file_buffer) << val;
00206         else
00207             (*_file_buffer) << "NULL" ;
00208     }
00209     return *this;
00210 }
00211 
00216 BESLog& BESLog::operator<<(int val) 
00217 {
00218     if (!_suspended)
00219     {
00220         if (_flushed)
00221             dump_time();
00222         (*_file_buffer) << val;
00223     }
00224     return *this;
00225 }
00226 
00231 BESLog& BESLog::operator<<(char val) 
00232 { 
00233     if (!_suspended)
00234     {
00235         if (_flushed)
00236             dump_time();
00237         (*_file_buffer) << val;
00238     }
00239     return *this;
00240 }
00241 
00246 BESLog& BESLog::operator<<(long val) 
00247 {
00248     if (!_suspended)
00249     {
00250         if (_flushed)
00251             dump_time();
00252         (*_file_buffer) << val;
00253     }
00254     return *this;
00255 }
00256 
00261 BESLog& BESLog::operator<<(unsigned long val) 
00262 {
00263     if (!_suspended)
00264     {
00265         if (_flushed)
00266             dump_time();
00267         (*_file_buffer) << val;
00268     }
00269     return *this;
00270 }
00271 
00276 BESLog& BESLog::operator<<(double val) 
00277 {
00278     if (!_suspended)
00279     {
00280         if (_flushed)
00281             dump_time();
00282         (*_file_buffer) << val;
00283     }
00284     return *this;
00285 }
00286 
00294 BESLog& BESLog::operator<<(p_ostream_manipulator val) 
00295 {
00296     if (!_suspended)
00297     {
00298         (*_file_buffer) << val ;
00299         if ((val==(p_ostream_manipulator)endl) || (val==(p_ostream_manipulator)flush))
00300             _flushed=1;
00301     }
00302     return *this;
00303 }
00304 
00311 BESLog& BESLog::operator<<(p_ios_manipulator val) 
00312 { 
00313     if (!_suspended)
00314         (*_file_buffer)<<val;
00315     return *this;
00316 }
00317 
00325 void
00326 BESLog::dump( ostream &strm ) const
00327 {
00328     strm << BESIndent::LMarg << "BESLog::dump - ("
00329                              << (void *)this << ")" << endl ;
00330     BESIndent::Indent() ;
00331     strm << BESIndent::LMarg << "log file: " << _file_name << endl ;
00332     if( _file_buffer && *_file_buffer )
00333     {
00334         strm << BESIndent::LMarg << "log is valid" << endl ;
00335     }
00336     else
00337     {
00338         strm << BESIndent::LMarg << "log is NOT valid" << endl ;
00339     }
00340     strm << BESIndent::LMarg << "is verbose: " << _verbose << endl ;
00341     strm << BESIndent::LMarg << "is flushed: " << _flushed << endl ;
00342     strm << BESIndent::LMarg << "is suspended: " << _suspended << endl ;
00343     BESIndent::UnIndent() ;
00344 }
00345 
00346 BESLog *
00347 BESLog::TheLog()
00348 {
00349     if( _instance == 0 )
00350     {
00351         _instance = new BESLog ;
00352     }
00353     return _instance ;
00354 }
00355