00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef LogStream_H
00027 #define LogStream_H
00028
00029 #include <iostream>
00030 #include <string>
00031 #include <map>
00032
00033 #include <cbits/LogLevel.h>
00034 #include <cbits/LogStreamExceptions.h>
00035 #include <cbits/NullStream.h>
00036
00037
00038 #ifdef WIN32
00039 #include <winnt.h>
00040 #else
00041 #include <pthread.h>
00042 #endif
00043
00044
00063 namespace cbits
00064 {
00065
00184 class LogStream
00185 {
00186
00187 public:
00188
00195 LogStream
00196 (
00197 const std::string& path,
00201 const LogLevel::Level level,
00206 const bool appnd = true
00209 )
00210 throw( LogStreamException );
00211
00212
00220 LogStream
00221 (
00222 std::ostream* os,
00225 const LogLevel::Level level
00229 )
00230 throw( LogStreamException );
00231
00232
00238 LogStream();
00239
00240
00257 inline const char* get_file_path() const
00258 {
00259 if( _path )
00260 {
00261 return _path->c_str();
00262 }
00263 else
00264 {
00265 return 0;
00266 }
00267 }
00268
00269
00279 inline const LogLevel::Level get_max_level() const
00280 {
00281 return _max_level;
00282 }
00283
00284
00292 LogLevel::Level reset_max_level
00293 (
00294 LogLevel::Level new_level
00303 );
00304
00305
00310 void increaseLevel();
00311
00312
00317 void decreaseLevel();
00318
00319
00326 void setTrace
00327 (
00328 const bool on
00329 )
00330 {
00331 _trace = on;
00332 }
00333
00334
00340 const bool isTraceOn() const
00341 {
00342 return _trace;
00343 }
00344
00345
00355 virtual ~LogStream( void );
00356
00357
00368 std::ostream* replace_stream
00369 (
00370 std::ostream*
00371 )
00372 throw( LogStreamException);
00373
00374
00381 std::ostream* get_logstream() const;
00382
00383
00388 inline std::ostream* get_nullstream() const { return &_nullstream; }
00389
00390
00398 inline std::ostream* get_ostream() const { return _ostream; }
00399
00404 void lock() {
00405 #ifdef WIN32
00406 EnterCriticalSection(&_lock);
00407 #else
00408 pthread_mutex_lock(&_lock);
00409 #endif
00410 }
00411
00415 void unlock() {
00416 #ifdef WIN32
00417 LeaveCriticalSection(&_lock);
00418 #else
00419 pthread_mutex_unlock(&_lock);
00420 #endif
00421 }
00422
00423 private:
00424
00425 std::string* _path;
00426 LogLevel::Level _max_level;
00427 mutable std::ostream* _ostream;
00428 bool _own_stream;
00429 mutable NullStream _nullstream;
00430 bool _trace;
00432
00433 LogStream( const LogStream& );
00434 LogStream& operator=( const LogStream& );
00435
00436
00437 #ifdef WIN32
00438 critical_section_t _lock;
00439 #else
00440 pthread_mutex_t _lock;
00441 #endif
00442
00443
00444 };
00445
00446 };
00447
00448
00452 std::ostream& operator<<
00453 (
00454 cbits::LogStream&,
00458 cbits::LogLevel::Level
00462 );
00463
00464 #endif
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502