You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-dev@logging.apache.org by ca...@apache.org on 2007/12/01 04:32:06 UTC
svn commit: r600045 - in /logging/log4cxx/trunk: ./ src/examples/cpp/
src/main/cpp/ src/main/include/log4cxx/helpers/ src/main/include/log4cxx/net/
Author: carnold
Date: Fri Nov 30 19:32:04 2007
New Revision: 600045
URL: http://svn.apache.org/viewvc?rev=600045&view=rev
Log:
LOGCXX-7: SocketAppender binary format not compatible with Chainsaw
Added:
logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp
- copied, changed from r596891, logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp
logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h
- copied, changed from r596891, logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h
Modified:
logging/log4cxx/trunk/build.xml
logging/log4cxx/trunk/src/examples/cpp/delayedloop.cpp
logging/log4cxx/trunk/src/main/cpp/Makefile.am
logging/log4cxx/trunk/src/main/cpp/class.cpp
logging/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp
logging/log4cxx/trunk/src/main/cpp/socketappender.cpp
logging/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp
logging/log4cxx/trunk/src/main/cpp/sockethubappender.cpp
logging/log4cxx/trunk/src/main/cpp/socketimpl.cpp
logging/log4cxx/trunk/src/main/cpp/xmlsocketappender.cpp
logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h
logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h
logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappenderskeleton.h
logging/log4cxx/trunk/src/main/include/log4cxx/net/sockethubappender.h
logging/log4cxx/trunk/src/main/include/log4cxx/net/xmlsocketappender.h
Modified: logging/log4cxx/trunk/build.xml
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/build.xml?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/build.xml (original)
+++ logging/log4cxx/trunk/build.xml Fri Nov 30 19:32:04 2007
@@ -204,14 +204,14 @@
<condition property="mac_osx_wchar_not_supported_yet" value="true">
<equals arg1="${has.wchar_t}" arg2="1"/>
</condition>
- <fail if="mac_osx_wchar_not_supported_yet">
+ <!-- fail if="mac_osx_wchar_not_supported_yet">
wchar_t is not supported in Mac OS/X yet,
cppunit fails to link
LogString may become CFString, see bug LOGCXX-85
specify -Dhas.wchar_t=0 on Ant command line for UTF-8 build as work-around
-</fail>
+</fail-->
</target>
Modified: logging/log4cxx/trunk/src/examples/cpp/delayedloop.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/examples/cpp/delayedloop.cpp?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/examples/cpp/delayedloop.cpp (original)
+++ logging/log4cxx/trunk/src/examples/cpp/delayedloop.cpp Fri Nov 30 19:32:04 2007
@@ -23,7 +23,6 @@
#include <iostream>
#include <log4cxx/stream.h>
#include <exception>
-#include <locale.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
@@ -99,13 +98,6 @@
}
}
};
-
-static class LocaleSetter {
- public:
- LocaleSetter() {
- setlocale(LC_ALL, "");
- }
-} localeSetter;
LoggerPtr DelayedLoop::logger = Logger::getLogger("DelayedLoop");
Modified: logging/log4cxx/trunk/src/main/cpp/Makefile.am
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/Makefile.am?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/Makefile.am (original)
+++ logging/log4cxx/trunk/src/main/cpp/Makefile.am Fri Nov 30 19:32:04 2007
@@ -138,6 +138,7 @@
socketappenderskeleton.cpp \
sockethubappender.cpp \
socketimpl.cpp \
+ socketoutputstream.cpp \
strftimedateformat.cpp \
stringhelper.cpp \
stringmatchfilter.cpp \
Modified: logging/log4cxx/trunk/src/main/cpp/class.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/class.cpp?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/class.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/class.cpp Fri Nov 30 19:32:04 2007
@@ -66,7 +66,7 @@
#include <log4cxx/rollingfileappender.h>
#include <log4cxx/dailyrollingfileappender.h>
-
+#include <apr.h>
using namespace log4cxx;
@@ -163,15 +163,13 @@
// TODO:
// SMTPAppender::registerClass();
#endif
-#if APR_HAS_THREADS
SocketAppender::registerClass();
SocketHubAppender::registerClass();
-#endif
SyslogAppender::registerClass();
#if APR_HAS_THREADS
TelnetAppender::registerClass();
- XMLSocketAppender::registerClass();
#endif
+ XMLSocketAppender::registerClass();
// DateLayout::registerClass();
HTMLLayout::registerClass();
PatternLayout::registerClass();
Modified: logging/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp Fri Nov 30 19:32:04 2007
@@ -27,10 +27,8 @@
IMPLEMENT_LOG4CXX_OBJECT(ObjectOutputStream)
-ObjectOutputStream::ObjectOutputStream(OutputStreamPtr outputStream, Pool& p) : os(outputStream)
-#if !LOG4CXX_LOGCHAR_IS_UTF8
- , utf8Encoder(CharsetEncoder::getUTF8Encoder())
-#endif
+ObjectOutputStream::ObjectOutputStream(OutputStreamPtr outputStream, Pool& p)
+ : os(outputStream) , utf8Encoder(CharsetEncoder::getUTF8Encoder())
{
char start[] = { 0xAC, 0xED, 0x00, 0x05 };
ByteBuffer buf(start, sizeof(start));
@@ -42,6 +40,10 @@
void ObjectOutputStream::close(Pool& p) {
os->close(p);
+}
+
+void ObjectOutputStream::flush(Pool& p) {
+ os->flush(p);
}
void ObjectOutputStream::writeObject(const LogString& val, Pool& p) {
Modified: logging/log4cxx/trunk/src/main/cpp/socketappender.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/socketappender.cpp?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/socketappender.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/socketappender.cpp Fri Nov 30 19:32:04 2007
@@ -25,14 +25,12 @@
#include <apr_time.h>
#include <apr_atomic.h>
#include <apr_thread_proc.h>
-#include <log4cxx/helpers/bytearrayoutputstream.h>
+#include <log4cxx/helpers/socketoutputstream.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
using namespace log4cxx::net;
-#if APR_HAS_THREADS
-
IMPLEMENT_LOG4CXX_OBJECT(SocketAppender)
@@ -50,12 +48,14 @@
SocketAppender::SocketAppender(InetAddressPtr& address1, int port1)
: SocketAppenderSkeleton(address1, port1, DEFAULT_RECONNECTION_DELAY) {
- connect();
+ Pool p;
+ activateOptions(p);
}
SocketAppender::SocketAppender(const LogString& host, int port1)
: SocketAppenderSkeleton(host, port1, DEFAULT_RECONNECTION_DELAY) {
- connect();
+ Pool p;
+ activateOptions(p);
}
SocketAppender::~SocketAppender()
@@ -63,11 +63,41 @@
finalize();
}
-void SocketAppender::renderEvent(const spi::LoggingEventPtr& event,
- const helpers::OutputStreamPtr& os1,
- Pool& p) {
- ObjectOutputStream os(os1, p);
- event->write(os, p);
+int SocketAppender::getDefaultDelay() const {
+ return DEFAULT_RECONNECTION_DELAY;
+}
+
+int SocketAppender::getDefaultPort() const {
+ return DEFAULT_PORT;
+}
+
+void SocketAppender::setSocket(log4cxx::helpers::SocketPtr& socket, Pool& p) {
+ synchronized sync(mutex);
+ oos = new ObjectOutputStream(new SocketOutputStream(socket), p);
}
-#endif
+void SocketAppender::cleanUp(Pool& p) {
+ if (oos != 0) {
+ try {
+ oos->close(p);
+ oos = 0;
+ } catch(std::exception& e) {
+ }
+ }
+}
+
+
+void SocketAppender::append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& p) {
+ if (oos != 0) {
+ try {
+ event->write(*oos, p);
+ oos->flush(p);
+ } catch(std::exception& e) {
+ oos = 0;
+ LogLog::warn(LOG4CXX_STR("Detected problem with connection: "), e);
+ if (getReconnectionDelay() > 0) {
+ fireConnector();
+ }
+ }
+ }
+}
Modified: logging/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/socketappenderskeleton.cpp Fri Nov 30 19:32:04 2007
@@ -22,9 +22,6 @@
#include <log4cxx/helpers/stringhelper.h>
#include <log4cxx/spi/loggingevent.h>
#include <log4cxx/helpers/synchronized.h>
-#include <apr_time.h>
-#include <apr_atomic.h>
-#include <apr_thread_proc.h>
#include <log4cxx/helpers/transcoder.h>
#include <log4cxx/helpers/bytearrayoutputstream.h>
@@ -33,13 +30,10 @@
using namespace log4cxx::helpers;
using namespace log4cxx::net;
-#if APR_HAS_THREADS
-
SocketAppenderSkeleton::SocketAppenderSkeleton(int defaultPort, int reconnectionDelay1)
: remoteHost(),
address(),
port(defaultPort),
- socket(),
reconnectionDelay(reconnectionDelay1),
locationInfo(false),
thread() {
@@ -50,7 +44,6 @@
remoteHost(),
address(address1),
port(port1),
- socket(),
reconnectionDelay(delay),
locationInfo(false),
thread() {
@@ -60,11 +53,10 @@
SocketAppenderSkeleton::SocketAppenderSkeleton(const LogString& host, int port1, int delay)
: remoteHost(host),
address(InetAddress::getByName(host)),
- port(port1),
- socket(),
+ port(port1),
reconnectionDelay(delay),
- locationInfo(false),
- thread() {
+ locationInfo(false),
+ thread() {
}
SocketAppenderSkeleton::~SocketAppenderSkeleton()
@@ -72,13 +64,43 @@
finalize();
}
-void SocketAppenderSkeleton::activateOptions(Pool& /* p */ )
+void SocketAppenderSkeleton::activateOptions(Pool& p)
{
- connect();
+ AppenderSkeleton::activateOptions(p);
+ connect(p);
+}
+
+void SocketAppenderSkeleton::close() {
+ synchronized sync(mutex);
+ if (closed) return;
+ closed = true;
+ cleanUp(pool);
+ thread.interrupt();
+}
+
+void SocketAppenderSkeleton::connect(Pool& p) {
+ if (address == 0) {
+ LogLog::error(LogString(LOG4CXX_STR("No remote host is set for Appender named \"")) +
+ name + LOG4CXX_STR("\"."));
+ } else {
+ cleanUp(p);
+ try {
+ SocketPtr socket(new Socket(address, port));
+ setSocket(socket, p);
+ } catch(SocketException& e) {
+ LogString msg = LOG4CXX_STR("Could not connect to remote log4cxx server at [")
+ +address->getHostName()+LOG4CXX_STR("].");
+ if(reconnectionDelay > 0)
+ {
+ msg += LOG4CXX_STR(" We will try again later. ");
+ }
+ fireConnector(); // fire the connector thread
+ LogLog::error(msg, e);
+ }
+ }
}
-void SocketAppenderSkeleton::setOption(const LogString& option,
- const LogString& value, int defaultPort, int defaultDelay)
+void SocketAppenderSkeleton::setOption(const LogString& option, const LogString& value)
{
if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("REMOTEHOST"), LOG4CXX_STR("remotehost")))
{
@@ -86,7 +108,7 @@
}
else if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("PORT"), LOG4CXX_STR("port")))
{
- setPort(OptionConverter::toInt(value, defaultPort));
+ setPort(OptionConverter::toInt(value, getDefaultPort()));
}
else if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("LOCATIONINFO"), LOG4CXX_STR("locationinfo")))
{
@@ -94,7 +116,7 @@
}
else if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("RECONNECTIONDELAY"), LOG4CXX_STR("reconnectiondelay")))
{
- setReconnectionDelay(OptionConverter::toInt(value, defaultDelay));
+ setReconnectionDelay(OptionConverter::toInt(value, getDefaultDelay()));
}
else
{
@@ -102,96 +124,6 @@
}
}
-void SocketAppenderSkeleton::append(const spi::LoggingEventPtr& event, Pool& p)
-{
- if(address == 0)
- {
- errorHandler->error(
- LOG4CXX_STR("No remote host is set for appender named \"") +
- name+LOG4CXX_STR("\"."));
- return;
- }
-
- if(socket != 0) {
- try {
- ByteArrayOutputStreamPtr byteStream(new ByteArrayOutputStream());
- OutputStreamPtr os(byteStream);
- renderEvent(event, os, p);
- std::vector<unsigned char> bytes(byteStream->toByteArray());
- socket->write(&bytes[0], bytes.size());
- }
- catch(SocketException& e) {
- socket = 0;
- LogLog::warn(LOG4CXX_STR("Detected problem with connection: "), e);
-
- if(reconnectionDelay > 0) {
- fireConnector();
- }
- }
- }
-}
-
-
-
-void SocketAppenderSkeleton::close()
-{
- synchronized sync(mutex);
- if (closed) return;
- closed = true;
- cleanUp();
-}
-
-void SocketAppenderSkeleton::cleanUp()
-{
- if(socket != 0)
- {
- try
- {
- socket->close();
- }
- catch(IOException& e)
- {
- LogLog::error(LOG4CXX_STR("Could not close socket :"), e);
- }
-
- socket = 0;
- }
-
- thread.join();
-}
-
-void SocketAppenderSkeleton::connect()
-{
- if(address == 0)
- {
- return;
- }
-
- try
- {
- // First, close the previous connection if any.
- cleanUp();
-
- socket = new Socket(address, port);
- }
- catch(SocketException& e)
- {
- LogString msg = LOG4CXX_STR("Could not connect to remote log4cxx server at [")
-
- +address->getHostName()+LOG4CXX_STR("].");
-
- if(reconnectionDelay > 0)
- {
- msg += LOG4CXX_STR(" We will try again later. ");
- }
-
- fireConnector(); // fire the connector thread
-
- LogLog::error(msg, e);
- }
-}
-
-
void SocketAppenderSkeleton::fireConnector()
{
synchronized sync(mutex);
@@ -200,7 +132,7 @@
}
}
-void* APR_THREAD_FUNC SocketAppenderSkeleton::monitor(log4cxx_thread_t* /* thread */, void* data) {
+void* LOG4CXX_THREAD_FUNC SocketAppenderSkeleton::monitor(log4cxx_thread_t* /* thread */, void* data) {
SocketAppenderSkeleton* socketAppender = (SocketAppenderSkeleton*) data;
SocketPtr socket;
bool isClosed = socketAppender->closed;
@@ -208,18 +140,14 @@
{
try
{
- apr_sleep(APR_INT64_C(1000) * socketAppender->reconnectionDelay);
- LogLog::debug(LOG4CXX_STR("Attempting connection to ")
- +socketAppender->address->getHostName());
+ Thread::sleep(socketAppender->reconnectionDelay);
+ LogLog::debug(LogString(LOG4CXX_STR("Attempting connection to "))
+ + socketAppender->address->getHostName());
socket = new Socket(socketAppender->address, socketAppender->port);
-
- synchronized sync(socketAppender->mutex);
- {
- socketAppender->socket = socket;
- LogLog::debug(LOG4CXX_STR("Connection established. Exiting connector thread."));
- socketAppender->thread.ending();
- return NULL;
- }
+ Pool p;
+ socketAppender->setSocket(socket, p);
+ LogLog::debug(LOG4CXX_STR("Connection established. Exiting connector thread."));
+ return NULL;
}
catch(ConnectException&)
{
@@ -237,11 +165,9 @@
+ LOG4CXX_STR(". Exception is ")
+ exmsg);
}
- isClosed = socketAppender->closed;
+ isClosed = socketAppender->closed;
}
LogLog::debug(LOG4CXX_STR("Exiting Connector.run() method."));
return NULL;
}
-
-#endif
Modified: logging/log4cxx/trunk/src/main/cpp/sockethubappender.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/sockethubappender.cpp?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/sockethubappender.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/sockethubappender.cpp Fri Nov 30 19:32:04 2007
@@ -26,7 +26,7 @@
#include <apr_atomic.h>
#include <apr_thread_proc.h>
#include <log4cxx/helpers/objectoutputstream.h>
-#include <log4cxx/helpers/bytearrayoutputstream.h>
+#include <log4cxx/helpers/socketoutputstream.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
@@ -45,12 +45,12 @@
}
SocketHubAppender::SocketHubAppender()
- : port(DEFAULT_PORT), sockets(), locationInfo(false), thread()
+ : port(DEFAULT_PORT), streams(), locationInfo(false), thread()
{
}
SocketHubAppender::SocketHubAppender(int port1)
- : port(port1), sockets(), locationInfo(false), thread()
+ : port(port1), streams(), locationInfo(false), thread()
{
startServer();
}
@@ -97,18 +97,18 @@
synchronized sync(mutex);
// close all of the connections
LogLog::debug(LOG4CXX_STR("closing client connections"));
- for (std::vector<helpers::SocketPtr>::iterator iter = sockets.begin();
- iter != sockets.end();
- iter++) {
+ for (std::vector<helpers::ObjectOutputStreamPtr>::iterator iter = streams.begin();
+ iter != streams.end();
+ iter++) {
if ( (*iter) != NULL) {
try {
- (*iter)->close();
+ (*iter)->close(pool);
} catch(SocketException& e) {
LogLog::error(LOG4CXX_STR("could not close socket: "), e);
}
}
}
- sockets.erase(sockets.begin(), sockets.end());
+ streams.erase(streams.begin(), streams.end());
LogLog::debug(LOG4CXX_STR("SocketHubAppender ")
@@ -119,19 +119,14 @@
{
// if no open connections, exit now
- if(sockets.empty())
+ if(streams.empty())
{
return;
}
- ByteArrayOutputStreamPtr os(new ByteArrayOutputStream());
- ObjectOutputStream objStream(os, p);
- event->write(objStream, p);
- std::vector<unsigned char> bytes(os->toByteArray());
-
// loop through the current set of open connections, appending the event to each
- std::vector<SocketPtr>::iterator it = sockets.begin();
- std::vector<SocketPtr>::iterator itEnd = sockets.end();
+ std::vector<ObjectOutputStreamPtr>::iterator it = streams.begin();
+ std::vector<ObjectOutputStreamPtr>::iterator itEnd = streams.end();
while(it != itEnd)
{
// list size changed unexpectedly? Just exit the append.
@@ -142,14 +137,14 @@
try
{
- (*it)->write(&bytes[0], bytes.size());
+ event->write(**it, p);
it++;
}
- catch(SocketException&)
+ catch(std::exception& e)
{
// there was an io exception so just drop the connection
- it = sockets.erase(it);
- LogLog::debug(LOG4CXX_STR("dropped connection"));
+ it = streams.erase(it);
+ LogLog::debug(LOG4CXX_STR("dropped connection"), e);
}
}
}
@@ -162,7 +157,7 @@
void* APR_THREAD_FUNC SocketHubAppender::monitor(log4cxx_thread_t* /* thread */, void* data) {
SocketHubAppender* pThis = (SocketHubAppender*) data;
- ServerSocket * serverSocket = 0;
+ ServerSocket* serverSocket = 0;
try
{
@@ -211,7 +206,10 @@
// add it to the oosList.
synchronized sync(pThis->mutex);
- pThis->sockets.push_back(socket);
+ OutputStreamPtr os(new SocketOutputStream(socket));
+ Pool p;
+ ObjectOutputStreamPtr oos(new ObjectOutputStream(os, p));
+ pThis->streams.push_back(oos);
}
catch (IOException& e)
{
@@ -219,7 +217,6 @@
}
}
}
-
delete serverSocket;
return NULL;
}
Modified: logging/log4cxx/trunk/src/main/cpp/socketimpl.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/socketimpl.cpp?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/socketimpl.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/socketimpl.cpp Fri Nov 30 19:32:04 2007
@@ -237,7 +237,6 @@
void SocketImpl::close()
{
if (socket != 0) {
- LOGLOG_DEBUG(LOG4CXX_STR("closing socket"));
apr_status_t status = apr_socket_close((apr_socket_t*) socket);
if (status != APR_SUCCESS) {
throw SocketException(status);
@@ -322,7 +321,6 @@
size_t SocketImpl::read(void * buf, size_t len) const
{
-// LOGLOG_DEBUG(LOG4CXX_STR("SocketImpl::reading ") << len << LOG4CXX_STR(" bytes."));
char * p = (char *)buf;
while ((size_t)(p - (char *)buf) < len)
@@ -345,7 +343,6 @@
// thanks to Yves Mettier (ymettier@libertysurf.fr) for this routine
size_t SocketImpl::write(const void * buf, size_t len)
{
-// LOGLOG_DEBUG(LOG4CXX_STR("SocketImpl::write ") << len << LOG4CXX_STR(" bytes."));
const char * p = (const char *)buf;
Copied: logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp (from r596891, logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp)
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp?p2=logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp&p1=logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp&r1=596891&r2=600045&rev=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/socketoutputstream.cpp Fri Nov 30 19:32:04 2007
@@ -18,126 +18,35 @@
#include <log4cxx/logstring.h>
#include <log4cxx/helpers/socketoutputstream.h>
#include <log4cxx/helpers/socket.h>
-#include <log4cxx/helpers/loglog.h>
+#include <log4cxx/helpers/bytebuffer.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
IMPLEMENT_LOG4CXX_OBJECT(SocketOutputStream)
-#define INCREMENT 512
-
-SocketOutputStream::SocketOutputStream(SocketPtr socket1)
-: socket(socket1), beg(0), cur(0), end(0)
-{
-}
-
-SocketOutputStream::~SocketOutputStream()
-{
- delete [] beg;
-}
-
-void SocketOutputStream::write(const void * buffer, size_t len)
-{
-// LOGLOG_DEBUG (LOG4CXX_STR("SocketOutputStream writing ") << len << LOG4CXX_STR(" bytes."));
- if (cur + len > end)
- {
- if (beg == 0)
- {
- size_t size = ((len > INCREMENT) ? len : INCREMENT);
-// LOGLOG_DEBUG (LOG4CXX_STR("SocketOutputStream growing ") << size << LOG4CXX_STR(" bytes."));
- beg = new unsigned char[size];
- end = beg + size;
- cur = beg;
- }
- else
- {
- size_t size = end - beg + ((len > INCREMENT) ? len : INCREMENT);
- unsigned char * old = beg;
-// LOGLOG_DEBUG (LOG4CXX_STR("SocketOutputStream growing ") <<
-// ((len > INCREMENT) ? len : INCREMENT) << LOG4CXX_STR(" bytes."));
- beg = new unsigned char[size];
- memcpy(beg, old, cur - old);
- cur = beg + (cur - old);
- end = beg + size;
- delete [] old;
- }
- }
-
- memcpy(cur, buffer, len);
- cur+= len;
-}
-
-void SocketOutputStream::write(unsigned int value)
-{
- write(&value, sizeof(value));
-}
-
-void SocketOutputStream::write(int value)
-{
- write(&value, sizeof(value));
+SocketOutputStream::SocketOutputStream(const SocketPtr& socket1)
+: socket(socket1) {
}
-void SocketOutputStream::write(unsigned long value)
-{
- write(&value, sizeof(value));
+SocketOutputStream::~SocketOutputStream() {
}
-void SocketOutputStream::write(long value)
-{
- write(&value, sizeof(value));
+void SocketOutputStream::close(Pool& p) {
+ flush(p);
+ socket->close();
}
-void SocketOutputStream::write(const LogString& value)
-{
- LogString::size_type size;
-
- size = value.size();
- if (size > 1024)
- {
- size = 1024;
- }
-
- write(&size, sizeof(LogString::size_type));
- if (size > 0)
- {
- write(value.c_str(), size * sizeof(logchar));
- }
+void SocketOutputStream::flush(Pool& p) {
+ socket->write(&array[0], array.size());
+ array.resize(0);
}
-void SocketOutputStream::writeRaw(const LogString& value)
-{
- LogString::size_type size;
-
- size = value.size();
- if (size > 0)
- {
- if (size > 1024)
- {
- size = 1024;
- }
-
- write(value.c_str(), size * sizeof(logchar));
- }
+void SocketOutputStream::write(ByteBuffer& buf, Pool& /* p */ ) {
+ size_t sz = array.size();
+ array.resize(sz + buf.remaining());
+ memcpy(&array[sz], buf.current(), buf.remaining());
+ buf.position(buf.limit());
}
-void SocketOutputStream::close()
-{
- // force flushing
- flush();
- // dereference socket
- socket = 0;
-}
-
-void SocketOutputStream::flush()
-{
- if (cur != beg)
- {
- // write to socket
- socket->write(beg, cur - beg);
-
- // seek to begin
- cur = beg;
- }
-}
Modified: logging/log4cxx/trunk/src/main/cpp/xmlsocketappender.cpp
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/cpp/xmlsocketappender.cpp?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/cpp/xmlsocketappender.cpp (original)
+++ logging/log4cxx/trunk/src/main/cpp/xmlsocketappender.cpp Fri Nov 30 19:32:04 2007
@@ -17,8 +17,7 @@
#include <log4cxx/net/xmlsocketappender.h>
#include <log4cxx/helpers/loglog.h>
-#include <log4cxx/helpers/bytearrayoutputstream.h>
-#include <log4cxx/helpers/bytebuffer.h>
+#include <log4cxx/helpers/outputstreamwriter.h>
#include <log4cxx/helpers/charsetencoder.h>
#include <log4cxx/helpers/optionconverter.h>
#include <log4cxx/helpers/stringhelper.h>
@@ -28,8 +27,7 @@
#include <apr_time.h>
#include <log4cxx/helpers/synchronized.h>
#include <log4cxx/helpers/transcoder.h>
-
-#if APR_HAS_THREADS
+#include <log4cxx/helpers/socketoutputstream.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
@@ -48,31 +46,24 @@
XMLSocketAppender::XMLSocketAppender()
: SocketAppenderSkeleton(DEFAULT_PORT, DEFAULT_RECONNECTION_DELAY)
-#if !LOG4CXX_LOGCHAR_IS_UTF8
- , utf8Encoder(CharsetEncoder::getUTF8Encoder())
-#endif
{
layout = new XMLLayout();
}
XMLSocketAppender::XMLSocketAppender(InetAddressPtr address1, int port1)
: SocketAppenderSkeleton(address1, port1, DEFAULT_RECONNECTION_DELAY)
-#if !LOG4CXX_LOGCHAR_IS_UTF8
- , utf8Encoder(CharsetEncoder::getUTF8Encoder())
-#endif
{
layout = new XMLLayout();
- connect();
+ Pool p;
+ activateOptions(p);
}
XMLSocketAppender::XMLSocketAppender(const LogString& host, int port1)
: SocketAppenderSkeleton(host, port1, DEFAULT_RECONNECTION_DELAY)
-#if !LOG4CXX_LOGCHAR_IS_UTF8
- , utf8Encoder(CharsetEncoder::getUTF8Encoder())
-#endif
{
layout = new XMLLayout();
- connect();
+ Pool p;
+ activateOptions(p);
}
XMLSocketAppender::~XMLSocketAppender() {
@@ -80,35 +71,48 @@
}
-void XMLSocketAppender::setLocationInfo(bool locationInfo1) {
- this->locationInfo = locationInfo1;
- XMLLayoutPtr xmlLayout(layout);
- xmlLayout->setLocationInfo(locationInfo1);
+int XMLSocketAppender::getDefaultDelay() const {
+ return DEFAULT_RECONNECTION_DELAY;
}
+int XMLSocketAppender::getDefaultPort() const {
+ return DEFAULT_PORT;
+}
-void XMLSocketAppender::renderEvent(const spi::LoggingEventPtr& event,
- const helpers::OutputStreamPtr& os1, Pool& p)
-{
+void XMLSocketAppender::setSocket(log4cxx::helpers::SocketPtr& socket, Pool& p) {
+ OutputStreamPtr os(new SocketOutputStream(socket));
+ CharsetEncoderPtr charset(CharsetEncoder::getUTF8Encoder());
+ synchronized sync(mutex);
+ writer = new OutputStreamWriter(os, charset);
+}
+
+void XMLSocketAppender::cleanUp(Pool& p) {
+ if (writer != 0) {
+ try {
+ writer->close(p);
+ writer = 0;
+ } catch(std::exception &e) {
+ }
+ }
+}
+
+void XMLSocketAppender::append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& p) {
+ if (writer != 0) {
LogString output;
layout->format(output, event, p);
-#if LOG4CXX_LOGCHAR_IS_UTF8
- ByteBuffer buf(const_cast<char*>(output.data()), output.size());
-#else
- size_t maxSize = output.size() * 6;
- char* bytes = (char*) apr_palloc((apr_pool_t*) p.getAPRPool(), maxSize);
- ByteBuffer buf(bytes, maxSize);
- LogString::const_iterator iter(output.begin());
- utf8Encoder->encode(output, iter, buf);
- buf.flip();
-#endif
- os1->write(buf, p);
-}
-
-void XMLSocketAppender::setOption(const LogString& option,
- const LogString& value) {
- SocketAppenderSkeleton::setOption(option, value, DEFAULT_PORT, DEFAULT_RECONNECTION_DELAY);
+ try {
+ writer->write(output, p);
+ writer->flush(p);
+ } catch(std::exception& e) {
+ writer = 0;
+ LogLog::warn(LOG4CXX_STR("Detected problem with connection: "), e);
+ if (getReconnectionDelay() > 0) {
+ fireConnector();
+ }
+ }
+ }
}
-#endif
+
+
Modified: logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h Fri Nov 30 19:32:04 2007
@@ -27,7 +27,6 @@
namespace helpers {
class OutputStream;
typedef helpers::ObjectPtrT<OutputStream> OutputStreamPtr;
- class ByteBuffer;
class CharsetEncoder;
typedef helpers::ObjectPtrT<CharsetEncoder> CharsetEncoderPtr;
@@ -46,6 +45,7 @@
virtual ~ObjectOutputStream();
void close(Pool& p);
+ void flush(Pool& p);
void writeUTF(const LogString&, Pool& p);
void writeObject(const LogString&, Pool& p);
void writeObject(const std::map<LogString, LogString>& mdc, Pool& p);
@@ -74,10 +74,10 @@
ObjectOutputStream& operator=(const ObjectOutputStream&);
OutputStreamPtr os;
-#if !LOG4CXX_LOGCHAR_IS_UTF8
log4cxx::helpers::CharsetEncoderPtr utf8Encoder;
-#endif
};
+
+ typedef helpers::ObjectPtrT<ObjectOutputStream> ObjectOutputStreamPtr;
} // namespace helpers
Copied: logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h (from r596891, logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h)
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h?p2=logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h&p1=logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h&r1=596891&r2=600045&rev=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/helpers/socketoutputstream.h Fri Nov 30 19:32:04 2007
@@ -19,8 +19,8 @@
#define _LOG4CXX_HELPERS_SOCKET_OUTPUT_STREAM_H
#include <log4cxx/logstring.h>
-#include <log4cxx/helpers/objectimpl.h>
-#include <log4cxx/helpers/objectptr.h>
+#include <log4cxx/helpers/outputstream.h>
+#include <vector>
namespace log4cxx
{
@@ -29,69 +29,27 @@
class Socket;
typedef ObjectPtrT<Socket> SocketPtr;
- class SocketOutputStream;
- typedef ObjectPtrT<SocketOutputStream> SocketOutputStreamPtr;
- class LOG4CXX_EXPORT SocketOutputStream : public ObjectImpl
+ class LOG4CXX_EXPORT SocketOutputStream : public OutputStream
{
public:
DECLARE_ABSTRACT_LOG4CXX_OBJECT(SocketOutputStream)
BEGIN_LOG4CXX_CAST_MAP()
LOG4CXX_CAST_ENTRY(SocketOutputStream)
+ LOG4CXX_CAST_ENTRY_CHAIN(OutputStream)
END_LOG4CXX_CAST_MAP()
- SocketOutputStream(SocketPtr socket);
+ SocketOutputStream(const SocketPtr& socket);
~SocketOutputStream();
- void write(const void * buffer, size_t len);
- void write(unsigned int value);
- void write(int value);
- void write(unsigned long value);
- void write(long value);
-
- /**
- * Writes a LogString to a socket.
- * The length of the string is written as the first
- * two bytes to allow proper deserialization on the
- * client side.
- */
- void write(const LogString& value);
-
- /**
- * Writes a LogString to a socket.
- * Only the contents of the String itself are written,
- * no length byte is passed to the client. This is
- * usefull when the client does not need to properly
- * deserialize the String, such as raw telnet clients.
- */
- void writeRaw(const LogString& value);
-
- // some write functions are missing ...
-
- /** Close the stream and dereference the socket.
- */
- void close();
-
- /** Flushes this output stream and forces any buffered output
- bytes to be written out.
- */
- void flush();
+ virtual void close(Pool& p);
+ virtual void flush(Pool& p);
+ virtual void write(ByteBuffer& buf, Pool& p);
protected:
+ std::vector<unsigned char> array;
SocketPtr socket;
- /** memory stream buffer */
-/* class membuf :
- public std::basic_streambuf<char, std::char_traits<char> >
- {
- public:
- const void * buffer() const;
- const size_t size() const;
- }*/
-
- unsigned char * beg, * cur, * end;
-
-
private:
//
// prevent copy and assignment statements
@@ -99,6 +57,9 @@
SocketOutputStream& operator=(const SocketOutputStream&);
};
+
+ typedef ObjectPtrT<SocketOutputStream> SocketOutputStreamPtr;
+
} // namespace helpers
} // namespace log4cxx
Modified: logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h Fri Nov 30 19:32:04 2007
@@ -22,10 +22,12 @@
namespace log4cxx
{
+ namespace helpers {
+ class ObjectOutputStream;
+ typedef ObjectPtrT<ObjectOutputStream> ObjectOutputStreamPtr;
+ }
namespace net
{
- class LOG4CXX_EXPORT SocketAppender;
- typedef helpers::ObjectPtrT<SocketAppender> SocketAppenderPtr;
/**
Sends {@link spi::LoggingEvent LoggingEvent} objects to a remote a log server,
@@ -99,14 +101,14 @@
*/
static int DEFAULT_RECONNECTION_DELAY;
- DECLARE_LOG4CXX_OBJECT(SocketAppender)
- BEGIN_LOG4CXX_CAST_MAP()
- LOG4CXX_CAST_ENTRY(SocketAppender)
- LOG4CXX_CAST_ENTRY_CHAIN(AppenderSkeleton)
- END_LOG4CXX_CAST_MAP()
+ DECLARE_LOG4CXX_OBJECT(SocketAppender)
+ BEGIN_LOG4CXX_CAST_MAP()
+ LOG4CXX_CAST_ENTRY(SocketAppender)
+ LOG4CXX_CAST_ENTRY_CHAIN(AppenderSkeleton)
+ END_LOG4CXX_CAST_MAP()
SocketAppender();
- ~SocketAppender();
+ ~SocketAppender();
/**
Connects to remote server at <code>address</code> and <code>port</code>.
@@ -119,30 +121,24 @@
SocketAppender(const LogString& host, int port);
- /**
- *Set options
- */
- virtual void setOption(const LogString& option,
- const LogString& value) {
- SocketAppenderSkeleton::setOption(option, value, DEFAULT_PORT, DEFAULT_RECONNECTION_DELAY);
- }
-
-
- /**
- * The SocketAppender does not use a layout. Hence, this method
- * returns <code>false</code>.
- * */
- bool requiresLayout() const
- { return false; }
-
- protected:
- virtual void renderEvent(const spi::LoggingEventPtr& event,
- const helpers::OutputStreamPtr& os,
- log4cxx::helpers::Pool& p);
+ protected:
+ virtual void setSocket(log4cxx::helpers::SocketPtr& socket, log4cxx::helpers::Pool& p);
+
+ virtual void cleanUp(log4cxx::helpers::Pool& p);
+
+ virtual int getDefaultDelay() const;
+
+ virtual int getDefaultPort() const;
+ void append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& pool);
+ private:
+ log4cxx::helpers::ObjectOutputStreamPtr oos;
}; // class SocketAppender
+
+ typedef helpers::ObjectPtrT<SocketAppender> SocketAppenderPtr;
+
} // namespace net
} // namespace log4cxx
Modified: logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappenderskeleton.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappenderskeleton.h?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappenderskeleton.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/net/socketappenderskeleton.h Fri Nov 30 19:32:04 2007
@@ -51,7 +51,6 @@
helpers::InetAddressPtr address;
int port;
- helpers::SocketPtr socket;
int reconnectionDelay;
bool locationInfo;
@@ -73,23 +72,9 @@
Connect to the specified <b>RemoteHost</b> and <b>Port</b>.
*/
void activateOptions(log4cxx::helpers::Pool& p);
-
-
- /**
- * Close this appender.
- *
- * <p>This will mark the appender as closed and call then
- * #cleanUp method.
- * */
+
void close();
- /**
- * Drop the connection to the remote host and release the underlying
- * connector thread if it has been created
- * */
- void cleanUp();
-
- void connect();
/**
* This appender does not use a layout. Hence, this method
@@ -99,10 +84,6 @@
bool requiresLayout() const
{ return false; }
-
- void append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& p);
-
-
/**
* The <b>RemoteHost</b> option takes a string value which should be
* the host name of the server where a
@@ -163,20 +144,23 @@
int getReconnectionDelay() const
{ return reconnectionDelay; }
- void fireConnector();
+ void fireConnector();
+
+ void setOption(const LogString& option,
+ const LogString& value);
protected:
- /**
- Set options
- */
- void setOption(const LogString& option,
- const LogString& value, int defaultPort, int defaultDelay);
-
- virtual void renderEvent(const spi::LoggingEventPtr& event,
- const helpers::OutputStreamPtr& os,
- log4cxx::helpers::Pool& p) = 0;
- private:
+ virtual void setSocket(log4cxx::helpers::SocketPtr& socket, log4cxx::helpers::Pool& p) = 0;
+
+ virtual void cleanUp(log4cxx::helpers::Pool& p) = 0;
+
+ virtual int getDefaultDelay() const = 0;
+
+ virtual int getDefaultPort() const = 0;
+
+ private:
+ void connect(log4cxx::helpers::Pool& p);
/**
The Connector will reconnect when the server becomes available
again. It does this by attempting to open a new connection every
Modified: logging/log4cxx/trunk/src/main/include/log4cxx/net/sockethubappender.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/net/sockethubappender.h?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/net/sockethubappender.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/net/sockethubappender.h Fri Nov 30 19:32:04 2007
@@ -19,14 +19,16 @@
#define _LOG4CXX_NET_SOCKET_HUB_APPENDER_H
#include <log4cxx/appenderskeleton.h>
-#include <log4cxx/helpers/socket.h>
-#include <log4cxx/helpers/thread.h>
-#include <log4cxx/helpers/mutex.h>
#include <vector>
+#include <log4cxx/helpers/thread.h>
namespace log4cxx
{
+ namespace helpers {
+ class ObjectOutputStream;
+ typedef ObjectPtrT<ObjectOutputStream> ObjectOutputStreamPtr;
+ }
namespace net
{
/**
@@ -103,7 +105,7 @@
static int DEFAULT_PORT;
int port;
- std::vector<helpers::SocketPtr> sockets;
+ std::vector<helpers::ObjectOutputStreamPtr> streams;
bool locationInfo;
public:
@@ -180,6 +182,7 @@
static void* LOG4CXX_THREAD_FUNC monitor(helpers::log4cxx_thread_t* thread, void* data);
}; // class SocketHubAppender
+ typedef helpers::ObjectPtrT<SocketHubAppender> SocketHubAppenderPtr;
} // namespace net
} // namespace log4cxx
Modified: logging/log4cxx/trunk/src/main/include/log4cxx/net/xmlsocketappender.h
URL: http://svn.apache.org/viewvc/logging/log4cxx/trunk/src/main/include/log4cxx/net/xmlsocketappender.h?rev=600045&r1=600044&r2=600045&view=diff
==============================================================================
--- logging/log4cxx/trunk/src/main/include/log4cxx/net/xmlsocketappender.h (original)
+++ logging/log4cxx/trunk/src/main/include/log4cxx/net/xmlsocketappender.h Fri Nov 30 19:32:04 2007
@@ -23,8 +23,8 @@
namespace log4cxx
{
namespace helpers {
- class CharsetEncoder;
- typedef helpers::ObjectPtrT<CharsetEncoder> CharsetEncoderPtr;
+ class Writer;
+ typedef helpers::ObjectPtrT<Writer> WriterPtr;
}
namespace net
{
@@ -101,8 +101,6 @@
*/
static int DEFAULT_RECONNECTION_DELAY;
- bool locationInfo;
-
/**
An event XML stream cannot exceed 1024 bytes.
*/
@@ -128,42 +126,22 @@
XMLSocketAppender(const LogString& host, int port);
- /**
- *Set options
- */
- virtual void setOption(const LogString& option,
- const LogString& value);
-
-
- /**
- The <b>LocationInfo</b> option takes a boolean value. If true,
- the information sent to the remote host will include location
- information. By default no location information is sent to the server.
- */
- void setLocationInfo(bool locationInfo);
-
- /**
- Returns value of the <b>LocationInfo</b> option.
- */
- bool getLocationInfo() const
- { return locationInfo; }
-
protected:
- void renderEvent(const spi::LoggingEventPtr& event,
- const helpers::OutputStreamPtr& os,
- log4cxx::helpers::Pool& p);
-
+ virtual void setSocket(log4cxx::helpers::SocketPtr& socket, log4cxx::helpers::Pool& p);
+
+ virtual void cleanUp(log4cxx::helpers::Pool& p);
+
+ virtual int getDefaultDelay() const;
+
+ virtual int getDefaultPort() const;
+ void append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& pool);
private:
+ log4cxx::helpers::WriterPtr writer;
// prevent copy and assignment statements
XMLSocketAppender(const XMLSocketAppender&);
XMLSocketAppender& operator=(const XMLSocketAppender&);
-
-#if !LOG4CXX_LOGCHAR_IS_UTF8
- log4cxx::helpers::CharsetEncoderPtr utf8Encoder;
-#endif
-
}; // class XMLSocketAppender
typedef helpers::ObjectPtrT<XMLSocketAppender> XMLSocketAppenderPtr;