blob: 9960f7c5ca4c6f6f65b12f1bdd1e15507364c614 [file] [log] [blame]
/***************************************************************************
socketnode.cpp - class SocketNode
-------------------
begin : ven mai 9 2003
copyright : (C) 2003 by Michael CATANZARITI
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. *
***************************************************************************/
#include <log4cxx/logger.h>
#include <log4cxx/net/socketnode.h>
#include <log4cxx/spi/loggingevent.h>
#include <log4cxx/spi/loggerrepository.h>
#include <log4cxx/helpers/socket.h>
#include <log4cxx/helpers/socketinputstream.h>
#include <log4cxx/level.h>
#include <log4cxx/helpers/loglog.h>
using namespace log4cxx;
using namespace log4cxx::net;
using namespace log4cxx::helpers;
using namespace log4cxx::spi;
SocketNode::SocketNode(helpers::SocketPtr socket, spi::LoggerRepositoryPtr hierarchy)
: hierarchy(hierarchy)
{
is = socket->getInputStream();
}
void SocketNode::run()
{
LoggingEvent event;
LoggerPtr remoteLogger;
try
{
while(true)
{
// read an event from the wire
event.read(is);
// get a logger from the hierarchy.
// The name of the logger is taken to be the
// name contained in the event.
if (event.getLoggerName() == _T("root"))
{
remoteLogger = hierarchy->getRootLogger();
}
else
{
remoteLogger =
hierarchy->getLogger(event.getLoggerName());
}
// apply the logger-level filter
if(event.getLevel().isGreaterOrEqual(
remoteLogger->getEffectiveLevel()))
{
// finally log the event as if was generated locally
remoteLogger->callAppenders(event);
}
}
}
catch(EOFException& e)
{
LogLog::debug(_T("Caught EOFException. Closing connection."));
}
catch(SocketException& e)
{
LogLog::debug(_T("Caught SocketException. Closing connection"));
}
catch(IOException& e)
{
LogLog::debug(_T("Caught IOException."), e);
LogLog::debug(_T("Closing connection."));
}
catch(Exception& e)
{
LogLog::error(_T("Unexpected exception. Closing connection."), e);
}
try
{
is->close();
}
catch(SocketException& e)
{
LogLog::debug(_T("Could not close SocketNode connection: "), e);
}
}