![]() |
Main Page
Class Hierarchy
Alphabetical List
Compound List
File List
Compound Members
![]() |
00001 /********************************************************************************* 00002 * * 00003 * Log file object * 00004 * * 00005 ********************************************************************************* 00006 * Copyright (C) 2003 by Mathew Robertson. All Rights Reserved. * 00007 ********************************************************************************* 00008 * This library is free software; you can redistribute it and/or * 00009 * modify it under the terms of the GNU Lesser General Public * 00010 * License as published by the Free Software Foundation; either * 00011 * version 2.1 of the License, or (at your option) any later version. * 00012 * * 00013 * This library is distributed in the hope that it will be useful, * 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00016 * Lesser General Public License for more details. * 00017 * * 00018 * You should have received a copy of the GNU Lesser General Public * 00019 * License along with this library; if not, write to the Free Software * 00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * 00021 *********************************************************************************/ 00022 #ifndef FXLOGGER_H 00023 #define FXLOGGER_H 00024 00025 #ifndef FXFILESTREAM_H 00026 #include <fox/FXStream.h> 00027 using namespace FX; 00028 #endif 00029 namespace FXEX { 00030 00031 /** 00032 * Simple defines, used to simplify the logging syntax 00033 * Takes FXString's, FXchar*'s or FXException's 00034 */ 00035 #ifndef NDEBUG 00036 # define DBG(argument) FXLogger::instance().debug (argument) 00037 # define LOG(argument) FXLogger::instance().log (argument) 00038 # define WRN(argument) FXLogger::instance().warning(argument) 00039 # define ERR(argument) FXLogger::instance().error (argument) 00040 # define STATUS(arg1,arg2) FXLogger::instance().status (arg1,arg2) 00041 #else 00042 # define DBG(argument) 00043 # define LOG(argument) 00044 # define WRN(argument) 00045 # define ERR(argument) 00046 # define STATUS(arg1,arg2) 00047 #endif 00048 00049 /** 00050 * A log file manager to allow applications to log entries to a file. 00051 * 00052 * The good stuff: 00053 * - 'stream'ing works (mostly), but it is not automatically new-line terminated (use endl) 00054 * - Use the #define's (LOG,DBG,WRN,ERR,STATUS) to make application logging simple 00055 * - Logging of exceptions are supported 00056 * - No need to add a newline to the end of the string, though you can if you wish. 00057 * 00058 * The bad stuff: 00059 * - The base class for this is currently FXFileStream, it should really be FXFileIO 00060 * - FXFileStream has no append mode, so each time the app is run it opens a new file 00061 * destroying the old one, rather than appending to it - this is rather annoying... 00062 * - stream operator<< doesn't like FXStrings - will fix one day (not soon) 00063 */ 00064 class FXAPI FXLogger : public FXFileStream { 00065 private: 00066 static FXLogger* thisLog; // singleton handle 00067 FXString filename; // the log file 00068 FXlong filesize; // max size of log file 00069 FXuint filemode; // the permisions of the file 00070 FXbool enabled; // indication of whether the logger is enabled 00071 FXbool stamp; // should we add a date stamp to the log entry 00072 FXbool nextStamp; // indication of whether the next stream operation will cause a timestamp to be written 00073 00074 protected: 00075 /// opens the log file 00076 FXbool open(); 00077 00078 /// closes the log file 00079 FXbool close(); 00080 00081 /** 00082 * Ensures that the log file is no bigger than size 00083 * Returns state whether the log file is open 00084 */ 00085 FXbool trim(); 00086 00087 /// Add timestamp when using the stream operator '<<' 00088 void checkStreamStamp(const FXchar& v); 00089 00090 public: 00091 /// Give me a log file 00092 FXLogger(const FXString& file,const FXlong size=100000,const FXuint mode=0,const FXbool timestamp=TRUE); 00093 00094 /// Use the current instance 00095 static FXLogger& instance(); 00096 00097 /// Set the size of the log file - check on next log entry 00098 void size(const FXlong size) { filesize=size; } 00099 00100 /// Get the size of the log file 00101 FXlong size() { return filesize; } 00102 00103 /// Change the location of the log file - change is immediate 00104 FXbool name(const FXString& file); 00105 00106 /// get the current filename 00107 FXString name() { return filename; } 00108 00109 /// indicates whether the log file can/will be written to 00110 FXbool isEnabled() { return enabled; } 00111 00112 /// This is for logging output to a file 00113 /// It is automatically new-line terminated 00114 void log(const FXchar* msg, ...); 00115 void log(const FXString& msg); 00116 void status(const FXString& code, const FXString& msg); 00117 void warning(const FXString& msg); 00118 void error(const FXString& msg); 00119 void debug(const FXString& msg); 00120 void log(const FXException* e); 00121 void log(const FXExtendedException* e); 00122 00123 /// Save to stream 00124 virtual FXStream& operator<<(const FXchar& v); 00125 00126 /// load from stream 00127 virtual FXStream& operator<<(const FXuchar& v); 00128 00129 /// done 00130 virtual ~FXLogger(); 00131 }; 00132 00133 } // namespace FXEX 00134 #endif // FXLOGGER_H