// Module: Log4CPLUS // File: loggerimpl.cxx // Created: 6/2001 // Author: Tad E. Smith // // // Copyright 2001-2013 Tad E. Smith // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include #include #include #include #include #include #include #include namespace log4cplus { namespace spi { ////////////////////////////////////////////////////////////////////////////// // Logger Constructors and Destructor ////////////////////////////////////////////////////////////////////////////// LoggerImpl::LoggerImpl(const log4cplus::tstring& name_, Hierarchy& h) : name(name_), ll(NOT_SET_LOG_LEVEL), parent(NULL), additive(true), hierarchy(h) { } LoggerImpl::~LoggerImpl() { } ////////////////////////////////////////////////////////////////////////////// // Logger Methods ////////////////////////////////////////////////////////////////////////////// void LoggerImpl::callAppenders(const InternalLoggingEvent& event) { int writes = 0; for(const LoggerImpl* c = this; c != NULL; c=c->parent.get()) { writes += c->appendLoopOnAppenders(event); if(!c->additive) { break; } } // No appenders in hierarchy, warn user only once. if(!hierarchy.emittedNoAppenderWarning && writes == 0) { helpers::getLogLog().error( LOG4CPLUS_TEXT("No appenders could be found for logger (") + getName() + LOG4CPLUS_TEXT(").")); helpers::getLogLog().error( LOG4CPLUS_TEXT("Please initialize the log4cplus system properly.")); hierarchy.emittedNoAppenderWarning = true; } } void LoggerImpl::closeNestedAppenders() { SharedAppenderPtrList appenders = getAllAppenders(); for(SharedAppenderPtrList::iterator it=appenders.begin(); it!=appenders.end(); ++it) { Appender & appender = **it; if (! appender.isClosed()) appender.close(); } } bool LoggerImpl::isEnabledFor(LogLevel loglevel) const { if(hierarchy.disableValue >= loglevel) { return false; } return loglevel >= getChainedLogLevel(); } void LoggerImpl::log(LogLevel loglevel, const log4cplus::tstring& message, const char* file, int line) { if(isEnabledFor(loglevel)) { forcedLog(loglevel, message, file, line); } } void LoggerImpl::log(spi::InternalLoggingEvent const & ev) { if (isEnabledFor(ev.getLogLevel ())) forcedLog(ev); } LogLevel LoggerImpl::getChainedLogLevel() const { for(const LoggerImpl *c=this; c != NULL; c=c->parent.get()) { if(c->ll != NOT_SET_LOG_LEVEL) { return c->ll; } } helpers::getLogLog().error( LOG4CPLUS_TEXT("LoggerImpl::getChainedLogLevel()- No valid LogLevel found"), true); return NOT_SET_LOG_LEVEL; } Hierarchy& LoggerImpl::getHierarchy() const { return hierarchy; } bool LoggerImpl::getAdditivity() const { return additive; } void LoggerImpl::setAdditivity(bool additive_) { additive = additive_; } void LoggerImpl::forcedLog(LogLevel loglevel, const log4cplus::tstring& message, const char* file, int line) { spi::InternalLoggingEvent & ev = internal::get_ptd ()->forced_log_ev; ev.setLoggingEvent (this->getName(), loglevel, message, file, line); callAppenders(ev); } void LoggerImpl::forcedLog(spi::InternalLoggingEvent const & ev) { callAppenders(ev); } } } // namespace log4cplus { namespace spi {