00001
00002
00003
00004
00005
00006
00007
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
00020 #include <map>
00021 #include <vector>
00022 #include <cstdarg>
00023 #include <stdexcept>
00024
00025 namespace log4cpp {
00026
00032 class LOG4CPP_EXPORT Category {
00033 friend class HierarchyMaintainer;
00034
00035 public:
00047 static Category& getRoot();
00048
00053 static void setRootPriority(Priority::Value priority);
00054
00059 static Priority::Value getRootPriority() throw();
00060
00068 static Category& getInstance(const std::string& name);
00069
00075 static Category* exists(const std::string& name);
00076
00089 static std::vector<Category*>* getCurrentCategories();
00090
00094 static void shutdown();
00095
00099 virtual ~Category();
00100
00105 virtual const std::string& getName() const throw();
00106
00114 virtual void setPriority(Priority::Value priority)
00115 throw(std::invalid_argument);
00116
00121 virtual Priority::Value getPriority() const throw();
00122
00131 virtual Priority::Value getChainedPriority() const throw();
00132
00139 virtual bool isPriorityEnabled(Priority::Value priority) const throw();
00140
00148 virtual void addAppender(Appender* appender)
00149 throw(std::invalid_argument);
00150
00157 virtual void addAppender(Appender& appender);
00158
00167 inline void setAppender(Appender* appender) {
00168 if (appender) {
00169 addAppender(appender);
00170 } else {
00171 removeAllAppenders();
00172 }
00173 };
00174
00181 inline void setAppender(Appender& appender) {
00182 addAppender(appender);
00183 };
00184
00191 virtual Appender* getAppender() const;
00192
00199 virtual Appender* getAppender(const std::string& name) const;
00200
00206 virtual AppenderSet getAllAppenders() const;
00207
00211 virtual void removeAllAppenders();
00212
00217 virtual void removeAppender(Appender* appender);
00218
00225 inline bool ownsAppender() const throw() {
00226 return ownsAppender(getAppender());
00227 };
00228
00234 virtual bool ownsAppender(Appender* appender) const throw();
00235
00247 virtual void callAppenders(const LoggingEvent& event) throw();
00248
00252 virtual void setAdditivity(bool additivity);
00253
00257 virtual bool getAdditivity() const throw();
00258
00264 virtual Category* getParent() throw();
00265
00271 virtual const Category* getParent() const throw();
00272
00280 virtual void log(Priority::Value priority, const char* stringFormat,
00281 ...) throw();
00282
00288 virtual void log(Priority::Value priority,
00289 const std::string& message) throw();
00290
00299 virtual void logva(Priority::Value priority,
00300 const char* stringFormat,
00301 va_list va) throw();
00302
00309 void debug(const char* stringFormat, ...) throw();
00310
00315 void debug(const std::string& message) throw();
00316
00321 inline bool isDebugEnabled() const throw() {
00322 return isPriorityEnabled(Priority::DEBUG);
00323 };
00324
00329 inline CategoryStream debugStream() {
00330 return getStream(Priority::DEBUG);
00331 }
00332
00339 void info(const char* stringFormat, ...) throw();
00340
00345 void info(const std::string& message) throw();
00346
00351 inline bool isInfoEnabled() const throw() {
00352 return isPriorityEnabled(Priority::INFO);
00353 };
00354
00359 inline CategoryStream infoStream() {
00360 return getStream(Priority::INFO);
00361 }
00362
00369 void notice(const char* stringFormat, ...) throw();
00370
00375 void notice(const std::string& message) throw();
00376
00381 inline bool isNoticeEnabled() const throw() {
00382 return isPriorityEnabled(Priority::NOTICE);
00383 };
00384
00389 inline CategoryStream noticeStream() {
00390 return getStream(Priority::NOTICE);
00391 }
00392
00399 void warn(const char* stringFormat, ...) throw();
00400
00405 void warn(const std::string& message) throw();
00406
00411 inline bool isWarnEnabled() const throw() {
00412 return isPriorityEnabled(Priority::WARN);
00413 };
00414
00419 inline CategoryStream warnStream() {
00420 return getStream(Priority::WARN);
00421 };
00422
00429 void error(const char* stringFormat, ...) throw();
00430
00435 void error(const std::string& message) throw();
00436
00441 inline bool isErrorEnabled() const throw() {
00442 return isPriorityEnabled(Priority::ERROR);
00443 };
00444
00449 inline CategoryStream errorStream() {
00450 return getStream(Priority::ERROR);
00451 };
00452
00459 void crit(const char* stringFormat, ...) throw();
00460
00465 void crit(const std::string& message) throw();
00466
00471 inline bool isCritEnabled() const throw() {
00472 return isPriorityEnabled(Priority::CRIT);
00473 };
00474
00479 inline CategoryStream critStream() {
00480 return getStream(Priority::CRIT);
00481 };
00482
00489 void alert(const char* stringFormat, ...) throw();
00490
00495 void alert(const std::string& message) throw();
00496
00501 inline bool isAlertEnabled() const throw() {
00502 return isPriorityEnabled(Priority::ALERT);
00503 };
00504
00509 inline CategoryStream alertStream() throw() {
00510 return getStream(Priority::ALERT);
00511 };
00512
00519 void emerg(const char* stringFormat, ...) throw();
00520
00525 void emerg(const std::string& message) throw();
00526
00531 inline bool isEmergEnabled() const throw() {
00532 return isPriorityEnabled(Priority::EMERG);
00533 };
00534
00539 inline CategoryStream emergStream() {
00540 return getStream(Priority::EMERG);
00541 };
00542
00551 void fatal(const char* stringFormat, ...) throw();
00552
00559 void fatal(const std::string& message) throw();
00560
00567 inline bool isFatalEnabled() const throw() {
00568 return isPriorityEnabled(Priority::FATAL);
00569 };
00570
00577 inline CategoryStream fatalStream() {
00578 return getStream(Priority::FATAL);
00579 };
00580
00586 virtual CategoryStream getStream(Priority::Value priority);
00587
00593 virtual CategoryStream operator<<(Priority::Value priority);
00594
00595 protected:
00596
00605 Category(const std::string& name, Category* parent,
00606 Priority::Value priority = Priority::NOTSET);
00607
00608 virtual void _logUnconditionally(Priority::Value priority,
00609 const char* format,
00610 va_list arguments) throw();
00611
00617 virtual void _logUnconditionally2(Priority::Value priority,
00618 const std::string& message) throw();
00619
00620 private:
00621
00622
00623 Category(const Category& other);
00624 Category& operator=(const Category& other);
00625
00627 const std::string _name;
00628
00633 Category* _parent;
00634
00638 volatile Priority::Value _priority;
00639
00640 typedef std::map<Appender *, bool> OwnsAppenderMap;
00641
00648 virtual bool ownsAppender(Appender* appender,
00649 OwnsAppenderMap::iterator& i2) throw();
00650
00651 AppenderSet _appender;
00652 mutable threading::Mutex _appenderSetMutex;
00653
00659 OwnsAppenderMap _ownsAppender;
00660
00665 volatile bool _isAdditive;
00666
00667 };
00668
00669 }
00670 #endif // _LOG4CPP_CATEGORY_HH