CppCMS
booster/log.h
Go to the documentation of this file.
00001 //
00002 //  Copyright (C) 2009-2012 Artyom Beilis (Tonkikh)
00003 //
00004 //  Distributed under the Boost Software License, Version 1.0. (See
00005 //  accompanying file LICENSE_1_0.txt or copy at
00006 //  http://www.boost.org/LICENSE_1_0.txt)
00007 //
00008 #ifndef BOOSTER_LOGGER_H
00009 #define BOOSTER_LOGGER_H
00010 
00011 #include <booster/config.h>
00012 #include <iosfwd>
00013 #include <memory>
00014 #include <string>
00015 #include <booster/copy_ptr.h>
00016 #include <booster/hold_ptr.h>
00017 #include <booster/noncopyable.h>
00018 
00022 namespace booster {
00023 
00024 template<typename T>
00025 class shared_ptr;
00026 template<typename T>
00027 class weak_ptr;
00028 
00032 
00033 namespace log {
00034         
00038         typedef enum {
00039                 emergency       = 0,
00040                 alert           = 10,
00041                 critical        = 20,
00042                 error           = 30,
00043                 warning         = 40,
00044                 notice          = 50,
00045                 info            = 60,
00046                 debug           = 70,
00047                 all             = 100
00048         } level_type;
00049 
00050         
00057         class BOOSTER_API message {
00058         public:
00063                 message(level_type l,char const *m,char const *name,int line);
00064         
00068                 message();
00069 
00070                 ~message();
00072                 message(message &);
00074                 message &operator=(message &);
00075 
00079                 level_type level() const;
00083                 char const *module() const;
00087                 char const *file_name() const;
00091                 int file_line() const;
00095                 std::string log_message() const;
00096 
00100                 std::ostream &out();
00101         private:
00102                 level_type level_;
00103                 char const *module_;
00104                 char const *file_name_;
00105                 int file_line_;
00106 
00107                 std::auto_ptr<std::ostringstream> message_;
00108 
00109                 struct data;
00110                 copy_ptr<data> d;
00111         };
00112 
00117         class BOOSTER_API sink : public noncopyable {
00118         public:
00126                 virtual void log(message const &m) = 0;
00127                 virtual ~sink() {}
00128         };
00129 
00137         class BOOSTER_API logger : public noncopyable {
00138         public:
00142                 static logger &instance();
00143                 
00149                 bool should_be_logged(level_type level,char const *module);
00150                 
00158                 void set_log_level(level_type level,char const *module);
00159 
00163                 void reset_log_level(char const *module);
00167                 void set_default_level(level_type level);
00168 
00175                 void add_sink(shared_ptr<sink> const &s);
00176 
00181                 void remove_sink(weak_ptr<sink> const &s);
00182 
00186                 void remove_all_sinks();
00187 
00192                 void log(message const &);
00193 
00197                 static char const *level_to_string(level_type level);
00201                 static level_type string_to_level(std::string const &);
00202 
00203         private:
00204                 
00205                 struct entry {
00206                         char const *module;
00207                         level_type level;
00208                 };
00209 
00210                 static const int max_entries_size_ = 1024;
00211                 level_type default_level_;
00212                 entry entries_[max_entries_size_];
00213                 int entries_size_;
00214                 
00215                 struct data;
00216                 hold_ptr<data> d;
00217 
00218                 logger();
00219                 ~logger();
00220         };
00221 
00227         namespace sinks {
00228                 
00233                 BOOSTER_API std::string format_plain_text_message(message const &msg);
00234 
00241                 BOOSTER_API std::string format_plain_text_message_tz(message const &msg,int timezone_offset = 0);
00242 
00246                 class BOOSTER_API standard_error : public sink {
00247                 public:
00248                         standard_error();
00249                         virtual void log(message const &);
00250                         virtual ~standard_error();
00251                 private:
00252                         struct data;
00253                         hold_ptr<data> d;
00254                 };
00255                 
00259                 class BOOSTER_API file : public sink {
00260                 public:
00264                         file();
00265                         virtual ~file();
00266 
00270                         void open(std::string file_name);
00277                         void max_files(unsigned limit);
00281                         void append();
00282                         
00291                         void set_timezone(std::string const &name);
00292 
00294                         virtual void log(message const &);
00295                 private:
00296 
00297                         void shift(std::string const &base);
00298                         std::string format_file(std::string const &,int);
00299 
00300                         unsigned max_files_;
00301                         size_t max_size_;
00302                         size_t current_size_;
00303                         bool opened_;
00304                         bool append_;
00305                         bool use_local_time_;
00306                         int tz_offset_;
00307                         
00308                         struct data;
00309                         hold_ptr<data> d;
00310                 };
00311 
00312                 #ifdef BOOSTER_POSIX
00313 
00314 
00315 
00316 
00317 
00318                 class BOOSTER_API syslog : public sink {
00319                 public:
00324                         syslog();
00328                         virtual void log(message const &);
00329                         virtual ~syslog();
00330                 private:
00331                         struct data;
00332                         hold_ptr<data> d;
00333                 };
00334                 #endif
00335 
00336         } // sinks
00337 
00338 
00359         #define BOOSTER_LOG(level,module)                                                               \
00360                 ::booster::log::logger::instance().should_be_logged(::booster::log::level,module)       \
00361                 && ::booster::log::message(::booster::log::level,module,__FILE__,__LINE__).out()                        
00362 
00363         
00365         #define BOOSTER_EMERG(m)        BOOSTER_LOG(emergency,m)
00366 
00367         #define BOOSTER_ALERT(m)        BOOSTER_LOG(alert,m)
00368 
00369         #define BOOSTER_CRITICAL(m)     BOOSTER_LOG(critical,m)
00370 
00371         #define BOOSTER_ERROR(m)        BOOSTER_LOG(error,m)
00372 
00373         #define BOOSTER_WARNING(m)      BOOSTER_LOG(warning,m)
00374 
00375         #define BOOSTER_NOTICE(m)       BOOSTER_LOG(notice,m)
00376 
00377         #define BOOSTER_INFO(m) BOOSTER_LOG(info,m)
00378 
00379         #define BOOSTER_DEBUG(m)        BOOSTER_LOG(debug,m)
00380 
00381 } // log
00382 
00383 } // booster
00384 
00385 #endif