![]() |
Main Page
Class Hierarchy
Alphabetical List
Compound List
File List
Compound Members
![]() |
00001 /******************************************************************************** 00002 * * 00003 * Binary 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 FXBINARYLOGGER_H 00023 #define FXBINARYLOGGER_H 00024 00025 namespace FXEX { 00026 00027 // A simple set of defines used to simplify the binary logging syntax 00028 // Note that the idea of using a binary logger precludes the 'disabling' of the logger as 00029 // a compile time option. The reasoning is that, this form of logging is often used where 00030 // you have a long 00031 #define BINDBG(value) FXBinaryLogger::instance().debug (value) 00032 #define BINLOG(value) FXBinaryLogger::instance().log (value) 00033 #define BINWRN(value) FXBinaryLogger::instance().warning(value) 00034 #define BINERR(value) FXBinaryLogger::instance().error (value) 00035 #define BINSTATUS(arg1,arg2) FXBinaryLogger::instance().status (arg1,arg2) 00036 #define BINUNKNOWN() FXBinaryLogger::instance().unknown() 00037 00038 /// Binary logger options 00039 enum { 00040 BINARYLOGGER_SUBSECOND=0x01 /// log entries contain subsecond resolution 00041 }; 00042 00043 /** 00044 * A binary log file allows applications to log entries to a file, faster and more compact 00045 * than a normal log file. 00046 * 00047 * How this differs from a normal log file is that, up to 1000% of the speed of a log file 00048 * is consumed in the printf style parsing of the input string. By using numbers only, 00049 * no parsing is necessary. As an added bonus, you dont log many bytes per log entry so 00050 * the disk I/O time is reduced. 00051 * 00052 * The upshot is that a binary logger can run many times quicker than a text file logger, 00053 * and that the storage of that information is more compact. The downside is that you need 00054 * a custom program to read the file (see FXBinaryLogReader). 00055 * 00056 * File format: 00057 * - file header (2 bytes) 00058 * - 1 byte version code 00059 * - 1 byte options value 00060 * - written per log entry (8-12 bytes) 00061 * - 32bit date stamp 00062 * - 1 second resolution 00063 * - 32bit subsecond date stamp 00064 * - microsecond resolution 00065 * - optional 00066 * - 32bit log entry 00067 * - upper 16bits are used for indicating error severity 00068 * - lower 16bits are used for indicating enumerated value 00069 * 00070 * Notes: 00071 * 1. The log file stores the endian-ness of the CPU architecture so that the log file 00072 * can later be read back on any type of CPU. 00073 * 2. Log entries are automatically written on file open/close (as debug entries) 00074 * 00075 * It is envisaged that you could use this logger in an embedded application. You would 00076 * log the values you need, when you identify a condition that needs to be logged. You 00077 * should create a specific enumerated value, for all possible log cases. 00078 */ 00079 00080 class FXAPI FXBinaryLogger { 00081 private: 00082 static FXBinaryLogger* thisLog; // self reference indicator 00083 FXFileIO *fileio; // file IO object 00084 FXlong filesize; // max size of file 00085 FXuchar options; 00086 00087 protected: 00088 /// opens the log file for writing 00089 FXbool open(); 00090 00091 /// closes the log file 00092 void close(); 00093 00094 /** 00095 * Ensures that the log file is no bigger than size 00096 * Returns state whether the log file is open 00097 */ 00098 FXbool trim(); 00099 00100 public: 00101 enum { 00102 CODE_NORMAL =0x0000, // normal log code 00103 CODE_WARNING=0x0001, // warning log code 00104 CODE_ERROR =0x0002, // error log code 00105 CODE_DEBUG =0x0003 // debug log code 00106 }; 00107 00108 enum { 00109 LOG_STARTED =0x7FFF, // log started 00110 LOG_ENDED =0x7FFE, // log ended 00111 LOG_UNKNOWN =0x7FFD // log entry unknown 00112 }; 00113 00114 public: 00115 /// Give me a log file 00116 FXBinaryLogger(const FXString& file="",FXlong size=100000,FXuint opts=0); 00117 00118 /// Use the current instance 00119 static FXBinaryLogger& instance(); 00120 00121 /// Set the size of the log file - checked on next log entry 00122 void size(const FXlong size); 00123 00124 /// Get the size of the log file 00125 FXlong size() { return filesize; } 00126 00127 /// Change the location of the log file - change is immediate 00128 FXbool name(const FXString& file); 00129 00130 /// get the current filename 00131 FXString name(); 00132 00133 /// indicates whether the log file can/will be written to 00134 FXbool opened(); 00135 00136 /// log a numeric entry 00137 void log(FXshort code,FXshort val); 00138 00139 /// log numeric entries based on generic code 00140 void log(FXshort val); 00141 void warning(FXshort val); 00142 void error(FXshort val); 00143 void debug(FXshort val); 00144 00145 /// log an error, using the 'unknown' value 00146 void unknown(); 00147 00148 /// Save to stream 00149 friend FXAPI FXStream& operator<<(FXStream& store,const FXBinaryLogger& b); 00150 00151 /// load from stream 00152 friend FXAPI FXStream& operator>>(FXStream& store,FXBinaryLogger& b); 00153 00154 /// done 00155 virtual ~FXBinaryLogger(); 00156 }; 00157 00158 } // namespace FXEX 00159 #endif // FXBINARYLOGGER_H