blob: b56b2cdd510e0fb9c4ea2e44416c7432c36721bd [file] [log] [blame]
/***************************************************************************
logger.cpp - class Logger
-------------------
begin : mar avr 15 2003
copyright : (C) 2003 by michael
email : mcatan@free.fr
***************************************************************************/
/***************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* *
* This software is published under the terms of the Apache Software *
* License version 1.1, a copy of which has been included with this *
* distribution in the LICENSE.txt file. *
***************************************************************************/
/*! \file logger.cpp Implementation of the class Logger. */
#include <log4cxx/logger.h>
#include <log4cxx/spi/loggingevent.h>
#include <log4cxx/logmanager.h>
#include <log4cxx/spi/loggerfactory.h>
#include <log4cxx/appender.h>
#include <log4cxx/level.h>
#include <log4cxx/helpers/loglog.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
using namespace log4cxx::spi;
Logger::Logger(const tstring& name)
: name(name), level(&Level::OFF), additive(true)
{
}
Logger::~Logger()
{
}
void Logger::addAppender(AppenderPtr newAppender)
{
AppenderAttachableImpl::addAppender(newAppender);
repository->fireAddAppenderEvent(this, newAppender);
}
void Logger::assertLog(bool assertion, const tstring& msg)
{
if(!assertion)
{
this->error(msg);
}
}
void Logger::callAppenders(const spi::LoggingEvent& event)
{
int writes = 0;
for(LoggerPtr logger = this; logger != 0; logger = logger->parent)
{
writes += logger->appendLoopOnAppenders(event);
if(!logger->additive)
{
break;
}
}
if(writes == 0)
{
repository->emitNoAppenderWarning(this);
}
}
void Logger::closeNestedAppenders()
{
synchronized sync(this);
AppenderList appenders = getAllAppenders();
for(AppenderList::iterator it=appenders.begin(); it!=appenders.end(); ++it)
{
(*it)->close();
}
}
void Logger::debug(const tstring& message, const char* file, int line)
{
if(repository->isDisabled(Level::DEBUG_INT))
{
return;
}
if(Level::DEBUG.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Level::DEBUG, message, file, line);
}
}
void Logger::error(const tstring& message, const char* file, int line)
{
if(repository->isDisabled(Level::ERROR_INT))
{
return;
}
if(Level::ERROR.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Level::ERROR, message, file, line);
}
}
void Logger::fatal(const tstring& message, const char* file, int line)
{
if(repository->isDisabled(Level::FATAL_INT))
{
return;
}
if(Level::FATAL.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Level::FATAL, message, file, line);
}
}
void Logger::forcedLog(const Level& level, const tstring& message,
const char* file, int line)
{
callAppenders(LoggingEvent(this, level, message, file, line));
}
bool Logger::getAdditivity()
{
return additive;
}
const Level& Logger::getEffectiveLevel()
{
for(Logger * l = this; l != 0; l=l->parent)
{
if(l->level != &Level::OFF)
{
return *l->level;
}
}
return Level::OFF; // If reached will cause an NullPointerException.
}
LoggerRepositoryPtr Logger::getLoggerRepository()
{
return repository;
}
LoggerPtr Logger::getParent()
{
return parent;
}
const Level& Logger::getLevel()
{
return *level;
}
void Logger::info(const tstring& message, const char* file, int line)
{
if(repository->isDisabled(Level::INFO_INT))
{
return;
}
if(Level::INFO.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Level::INFO, message, file, line);
}
}
bool Logger::isDebugEnabled()
{
if(repository->isDisabled(Level::DEBUG_INT))
{
return false;
}
return Level::DEBUG.isGreaterOrEqual(getEffectiveLevel());
}
bool Logger::isEnabledFor(const Level& level)
{
if(repository->isDisabled(level.level))
{
return false;
}
return level.isGreaterOrEqual(getEffectiveLevel());
}
bool Logger::isInfoEnabled()
{
if(repository->isDisabled(Level::INFO_INT))
{
return false;
}
return Level::INFO.isGreaterOrEqual(getEffectiveLevel());
}
void Logger::log(const Level& level, const tstring& message,
const char* file, int line)
{
if(repository->isDisabled(level.level))
{
return;
}
if(level.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(level, message, file, line);
}
}
void Logger::setAdditivity(bool additive)
{
this->additive = additive;
}
void Logger::setHierarchy(spi::LoggerRepository * repository)
{
this->repository = repository;
}
void Logger::setLevel(const Level& level)
{
this->level = &level;
}
void Logger::warn(const tstring& message, const char* file, int line)
{
if(repository->isDisabled(Level::WARN_INT))
{
return;
}
if(Level::WARN.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Level::WARN, message, file, line);
}
}
LoggerPtr Logger::getLogger(const tstring& name)
{
return LogManager::getLogger(name);
}
LoggerPtr Logger::getRootLogger() {
return LogManager::getRootLogger();
}
LoggerPtr Logger::getLogger(const tstring& name,
spi::LoggerFactoryPtr factory)
{
return LogManager::getLogger(name, factory);
}