$search
00001 /* 00002 * Category.hh 00003 * 00004 * Copyright 2000, LifeLine Networks BV (www.lifeline.nl). All rights reserved. 00005 * Copyright 2000, Bastiaan Bakker. All rights reserved. 00006 * 00007 * See the COPYING file for the terms of usage and distribution. 00008 */ 00009 00010 #ifndef _LOG4CPP_CATEGORY_HH 00011 #define _LOG4CPP_CATEGORY_HH 00012 00013 #include <log4cpp/Portability.hh> 00014 #include <log4cpp/Appender.hh> 00015 #include <log4cpp/LoggingEvent.hh> 00016 #include <log4cpp/Priority.hh> 00017 #include <log4cpp/CategoryStream.hh> 00018 #include <log4cpp/threading/Threading.hh> 00019 #include <log4cpp/convenience.h> 00020 00021 #include <map> 00022 #include <vector> 00023 #include <cstdarg> 00024 #include <stdexcept> 00025 00026 namespace log4cpp { 00027 00033 class LOG4CPP_EXPORT Category { 00034 friend class HierarchyMaintainer; 00035 00036 public: 00048 static Category& getRoot(); 00049 00054 static void setRootPriority(Priority::Value priority); 00055 00060 static Priority::Value getRootPriority() throw(); 00061 00069 static Category& getInstance(const std::string& name); 00070 00076 static Category* exists(const std::string& name); 00077 00090 static std::vector<Category*>* getCurrentCategories(); 00091 00095 static void shutdown(); 00096 00100 virtual ~Category(); 00101 00106 virtual const std::string& getName() const throw(); 00107 00115 virtual void setPriority(Priority::Value priority) 00116 throw(std::invalid_argument); 00117 00122 virtual Priority::Value getPriority() const throw(); 00123 00132 virtual Priority::Value getChainedPriority() const throw(); 00133 00140 virtual bool isPriorityEnabled(Priority::Value priority) const throw(); 00141 00149 virtual void addAppender(Appender* appender) 00150 throw(std::invalid_argument); 00151 00158 virtual void addAppender(Appender& appender); 00159 00168 inline void setAppender(Appender* appender) { 00169 if (appender) { 00170 addAppender(appender); 00171 } else { 00172 removeAllAppenders(); 00173 } 00174 }; 00175 00182 inline void setAppender(Appender& appender) { 00183 addAppender(appender); 00184 }; 00185 00192 virtual Appender* getAppender() const; 00193 00200 virtual Appender* getAppender(const std::string& name) const; 00201 00207 virtual AppenderSet getAllAppenders() const; 00208 00212 virtual void removeAllAppenders(); 00213 00218 virtual void removeAppender(Appender* appender); 00219 00226 virtual bool ownsAppender() const throw() { 00227 return ownsAppender(getAppender()); 00228 }; 00229 00235 virtual bool ownsAppender(Appender* appender) const throw(); 00236 00248 virtual void callAppenders(const LoggingEvent& event) throw(); 00249 00253 virtual void setAdditivity(bool additivity); 00254 00258 virtual bool getAdditivity() const throw(); 00259 00265 virtual Category* getParent() throw(); 00266 00272 virtual const Category* getParent() const throw(); 00273 00281 virtual void log(Priority::Value priority, const char* stringFormat, 00282 ...) throw(); 00283 00289 virtual void log(Priority::Value priority, 00290 const std::string& message) throw(); 00291 00300 virtual void logva(Priority::Value priority, 00301 const char* stringFormat, 00302 va_list va) throw(); 00303 00310 void debug(const char* stringFormat, ...) throw(); 00311 00316 void debug(const std::string& message) throw(); 00317 00322 inline bool isDebugEnabled() const throw() { 00323 return isPriorityEnabled(Priority::DEBUG); 00324 }; 00325 00330 inline CategoryStream debugStream() { 00331 return getStream(Priority::DEBUG); 00332 } 00333 00340 void info(const char* stringFormat, ...) throw(); 00341 00346 void info(const std::string& message) throw(); 00347 00352 inline bool isInfoEnabled() const throw() { 00353 return isPriorityEnabled(Priority::INFO); 00354 }; 00355 00360 inline CategoryStream infoStream() { 00361 return getStream(Priority::INFO); 00362 } 00363 00370 void notice(const char* stringFormat, ...) throw(); 00371 00376 void notice(const std::string& message) throw(); 00377 00382 inline bool isNoticeEnabled() const throw() { 00383 return isPriorityEnabled(Priority::NOTICE); 00384 }; 00385 00390 inline CategoryStream noticeStream() { 00391 return getStream(Priority::NOTICE); 00392 } 00393 00400 void warn(const char* stringFormat, ...) throw(); 00401 00406 void warn(const std::string& message) throw(); 00407 00412 inline bool isWarnEnabled() const throw() { 00413 return isPriorityEnabled(Priority::WARN); 00414 }; 00415 00420 inline CategoryStream warnStream() { 00421 return getStream(Priority::WARN); 00422 }; 00423 00430 void error(const char* stringFormat, ...) throw(); 00431 00436 void error(const std::string& message) throw(); 00437 00442 inline bool isErrorEnabled() const throw() { 00443 return isPriorityEnabled(Priority::ERROR); 00444 }; 00445 00450 inline CategoryStream errorStream() { 00451 return getStream(Priority::ERROR); 00452 }; 00453 00460 void crit(const char* stringFormat, ...) throw(); 00461 00466 void crit(const std::string& message) throw(); 00467 00472 inline bool isCritEnabled() const throw() { 00473 return isPriorityEnabled(Priority::CRIT); 00474 }; 00475 00480 inline CategoryStream critStream() { 00481 return getStream(Priority::CRIT); 00482 }; 00483 00490 void alert(const char* stringFormat, ...) throw(); 00491 00496 void alert(const std::string& message) throw(); 00497 00502 inline bool isAlertEnabled() const throw() { 00503 return isPriorityEnabled(Priority::ALERT); 00504 }; 00505 00510 inline CategoryStream alertStream() throw() { 00511 return getStream(Priority::ALERT); 00512 }; 00513 00520 void emerg(const char* stringFormat, ...) throw(); 00521 00526 void emerg(const std::string& message) throw(); 00527 00532 inline bool isEmergEnabled() const throw() { 00533 return isPriorityEnabled(Priority::EMERG); 00534 }; 00535 00540 inline CategoryStream emergStream() { 00541 return getStream(Priority::EMERG); 00542 }; 00543 00552 void fatal(const char* stringFormat, ...) throw(); 00553 00560 void fatal(const std::string& message) throw(); 00561 00568 inline bool isFatalEnabled() const throw() { 00569 return isPriorityEnabled(Priority::FATAL); 00570 }; 00571 00578 inline CategoryStream fatalStream() { 00579 return getStream(Priority::FATAL); 00580 }; 00581 00587 virtual CategoryStream getStream(Priority::Value priority); 00588 00594 virtual CategoryStream operator<<(Priority::Value priority); 00595 00596 protected: 00597 00606 Category(const std::string& name, Category* parent, 00607 Priority::Value priority = Priority::NOTSET); 00608 00609 virtual void _logUnconditionally(Priority::Value priority, 00610 const char* format, 00611 va_list arguments) throw(); 00612 00618 virtual void _logUnconditionally2(Priority::Value priority, 00619 const std::string& message) throw(); 00620 00621 private: 00622 00623 /* prevent copying and assignment */ 00624 Category(const Category& other); 00625 Category& operator=(const Category& other); 00626 00628 const std::string _name; 00629 00634 Category* _parent; 00635 00639 volatile Priority::Value _priority; 00640 00641 typedef std::map<Appender *, bool> OwnsAppenderMap; 00642 00649 virtual bool ownsAppender(Appender* appender, 00650 OwnsAppenderMap::iterator& i2) throw(); 00651 00652 AppenderSet _appender; 00653 mutable threading::Mutex _appenderSetMutex; 00654 00660 OwnsAppenderMap _ownsAppender; 00661 00666 volatile bool _isAdditive; 00667 00668 }; 00669 00670 } 00671 #endif // _LOG4CPP_CATEGORY_HH