blob: 3a59a21c2b27e16b71794b99e89218901edb8d4f [file] [log] [blame]
/***************************************************************************
appenderskeleton.cpp - AppenderSkeleton
-------------------
begin : mar avr 15 2003
copyright : (C) 2003 by michael
email : michael@montmartre-2-81-57-89-54.fbx.proxad.net
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <log4cxx/spi/loggingevent.h>
#include <log4cxx/appenderskeleton.h>
#include <log4cxx/helpers/loglog.h>
#include <log4cxx/helpers/onlyonceerrorhandler.h>
#include <log4cxx/level.h>
using namespace log4cxx;
using namespace log4cxx::spi;
using namespace log4cxx::helpers;
AppenderSkeleton::AppenderSkeleton()
: errorHandler(new OnlyOnceErrorHandler()), closed(false),
threshold(Level::ALL)
{
}
void AppenderSkeleton::finalize()
{
// An appender might be closed then garbage collected. There is no
// point in closing twice.
if(closed)
{
return;
}
close();
}
void AppenderSkeleton::addFilter(const spi::FilterPtr& newFilter)
{
if(headFilter == 0)
{
headFilter = tailFilter = newFilter;
}
else
{
tailFilter->next = newFilter;
tailFilter = newFilter;
}
}
void AppenderSkeleton::clearFilters()
{
headFilter = tailFilter = 0;
}
bool AppenderSkeleton::isAsSevereAsThreshold(const LevelPtr& level) const
{
return ((level == 0) || level->isGreaterOrEqual(threshold));
}
void AppenderSkeleton::doAppend(const spi::LoggingEventPtr& event)
{
synchronized sync(this);
if(closed)
{
LogLog::error(_T("Attempted to append to closed appender named [")
+name+_T("]."));
return;
}
if(!isAsSevereAsThreshold(event->getLevel()))
{
return;
}
FilterPtr f = headFilter;
while(f != 0)
{
switch(f->decide(event))
{
case Filter::DENY:
return;
case Filter::ACCEPT:
f = 0;
break;
case Filter::NEUTRAL:
f = f->next;
}
}
append(event);
}
void AppenderSkeleton::setErrorHandler(const spi::ErrorHandlerPtr& errorHandler)
{
synchronized sync(this);
if(errorHandler == 0)
{
// We do not throw exception here since the cause is probably a
// bad config file.
LogLog::warn(_T("You have tried to set a null error-handler."));
}
else
{
this->errorHandler = errorHandler;
}
}
void AppenderSkeleton::setThreshold(const LevelPtr& threshold)
{
this->threshold = threshold;
}