00001 #ifndef FILE_LOGGER_CLASS
00002 #define FILE_LOGGER_CLASS
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00019
00024 #include "console_logger.h"
00025
00026 #include <basis/function.h>
00027 #include <basis/log_base.h>
00028
00029
00030 class byte_filer;
00031
00032 class LOGGERS_CLASS_STYLE file_logger : public log_base
00033 {
00034 public:
00035 file_logger();
00037
00039 file_logger(const istring &filename, int limit = LOG_FILE_SIZE);
00041
00044 virtual ~file_logger();
00045
00046 IMPLEMENT_CLASS_NAME("file_logger");
00047
00048 enum limits {
00050 #ifndef EMBEDDED_BUILD
00051 LOG_FILE_SIZE = 0x10F00D
00052 #else
00053 LOG_FILE_SIZE = 0x10FAB
00054 #endif
00055 };
00056
00057 bool good() const;
00059
00062 bool reopen();
00064
00066 outcome log(const istring &info, int filter = ALWAYS_PRINT);
00068
00072 outcome log_bytes(const byte_array &to_log, int filter = ALWAYS_PRINT);
00074
00076 outcome format_bytes(const byte_array &to_log, int filter = ALWAYS_PRINT);
00078
00079 istring name() const;
00081 void name(const istring &new_name);
00083
00086 int limit() const { return int(_file_limit); }
00088 void limit(int new_limit) { _file_limit = new_limit; }
00090
00091 void flush();
00093
00094 void truncate(size_t new_size);
00096
00098 private:
00099 istring *_filename;
00100 size_t _file_limit;
00101 byte_filer *_outfile;
00102 mutex *_flock;
00103
00104 int size_reduction() const;
00106
00108 bool open_file();
00110
00112 void close_file();
00114
00115
00116 file_logger(const file_logger &);
00117 file_logger &operator =(const file_logger &);
00118 };
00119
00121
00123
00126 istring LOGGERS_FUNCTION_STYLE app_name_for_file_logger();
00127
00129
00131 log_base LOGGERS_FUNCTION_STYLE *set_PW_logger_for_file
00132 (const istring &file_name, int limit = file_logger::LOG_FILE_SIZE);
00133
00135 #ifndef OMIT_PROGRAM_WIDE_LOGGER
00136 #define SET_DEFAULT_FILE_LOGGER { \
00137 log_base *old_log = set_PW_logger_for_file(app_name_for_file_logger()); \
00138 WHACK(old_log); \
00139 }
00140 #else
00141 #define SET_DEFAULT_FILE_LOGGER {}
00142 #endif
00143
00145
00147
00149 class LOGGERS_CLASS_STYLE combo_logger : public file_logger
00150 {
00151 public:
00152 combo_logger(const istring &filename, int limit = LOG_FILE_SIZE,
00153 bool standard_error = false);
00154 virtual ~combo_logger();
00155
00156 virtual outcome log(const istring &info, int filter = ALWAYS_PRINT);
00157
00158
00159 virtual void add_filter(int new_filter);
00160 virtual void remove_filter(int old_filter);
00161 virtual void clear_filters();
00162 virtual void eol(line_ending to_set);
00163
00164
00165
00166 private:
00167 console_logger *_out;
00168 };
00169
00171
00173
00175 log_base LOGGERS_FUNCTION_STYLE *set_PW_logger_for_combo
00176 (const istring &file_name, int limit = file_logger::LOG_FILE_SIZE,
00177 bool standard_error = false);
00178
00180 #ifndef OMIT_PROGRAM_WIDE_LOGGER
00181 #define SET_DEFAULT_COMBO_LOGGER { \
00182 log_base *old_log = set_PW_logger_for_combo(app_name_for_file_logger()); \
00183 WHACK(old_log); \
00184 }
00185 #define SET_DEFAULT_COMBO_ERROR_LOGGER { \
00186 log_base *old_log = set_PW_logger_for_combo(app_name_for_file_logger(), \
00187 file_logger::LOG_FILE_SIZE, true); \
00188 WHACK(old_log); \
00189 }
00190 #else
00191 #define SET_DEFAULT_COMBO_LOGGER {}
00192 #define SET_DEFAULT_COMBO_ERROR_LOGGER {}
00193 #endif
00194
00195 #endif
00196