Author: tschoening Date: Tue Dec 15 16:53:54 2015 New Revision: 1720193 URL: http://svn.apache.org/viewvc?rev=1720193&view=rev Log: LOGCXX-461: hopefully improved readability
Modified: incubator/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp incubator/log4cxx/trunk/src/main/cpp/socketappender.cpp incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h incubator/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h Modified: incubator/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp URL: http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp?rev=1720193&r1=1720192&r2=1720193&view=diff ============================================================================== --- incubator/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp (original) +++ incubator/log4cxx/trunk/src/main/cpp/objectoutputstream.cpp Tue Dec 15 16:53:54 2015 @@ -6,7 +6,7 @@ * (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 + * 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, @@ -31,164 +31,197 @@ using namespace log4cxx::helpers; IMPLEMENT_LOG4CXX_OBJECT(ObjectOutputStream) ObjectOutputStream::ObjectOutputStream(OutputStreamPtr outputStream, Pool& p) - : os(outputStream) , - utf8Encoder(CharsetEncoder::getUTF8Encoder()), - objectHandle(0x7E0000), - classDescriptions(new ClassDescriptionMap()) + : os(outputStream), + utf8Encoder(CharsetEncoder::getUTF8Encoder()), + objectHandle(0x7E0000), + classDescriptions(new ClassDescriptionMap()) { - char start[] = { static_cast<char>(0xAC), static_cast<char>(0xED), 0x00, 0x05 }; - ByteBuffer buf(start, sizeof(start)); - os->write(buf, p); + char start[] = { static_cast<char>(0xAC), static_cast<char>(0xED), 0x00, 0x05 }; + ByteBuffer buf(start, sizeof(start)); + os->write(buf, p); } -ObjectOutputStream::~ObjectOutputStream() { - delete classDescriptions; +ObjectOutputStream::~ObjectOutputStream() +{ + delete classDescriptions; } -void ObjectOutputStream::close(Pool& p) { - os->close(p); +void ObjectOutputStream::close(Pool& p) +{ + os->close(p); } -void ObjectOutputStream::flush(Pool& p) { - os->flush(p); +void ObjectOutputStream::flush(Pool& p) +{ + os->flush(p); } -void ObjectOutputStream::writeObject(const LogString& val, Pool& p) { - objectHandle++; - writeByte(TC_STRING, p); - char bytes[2]; +void ObjectOutputStream::writeObject(const LogString& val, Pool& p) +{ + objectHandle++; + writeByte(TC_STRING, p); + char bytes[2]; #if LOG4CXX_LOGCHAR_IS_UTF8 - size_t len = val.size(); - ByteBuffer dataBuf(const_cast<char*>(val.data()), val.size()); + size_t len = val.size(); + ByteBuffer dataBuf(const_cast<char*>(val.data()), val.size()); #else - size_t maxSize = 6 * val.size(); - char* data = p.pstralloc(maxSize); - ByteBuffer dataBuf(data, maxSize); - LogString::const_iterator iter(val.begin()); - utf8Encoder->encode(val, iter, dataBuf); - dataBuf.flip(); - size_t len = dataBuf.limit(); + size_t maxSize = 6 * val.size(); + char* data = p.pstralloc(maxSize); + ByteBuffer dataBuf(data, maxSize); + LogString::const_iterator iter(val.begin()); + utf8Encoder->encode(val, iter, dataBuf); + dataBuf.flip(); + size_t len = dataBuf.limit(); #endif - bytes[1] = (char) (len & 0xFF); - bytes[0] = (char) ((len >> 8) & 0xFF); - ByteBuffer lenBuf(bytes, sizeof(bytes)); - os->write(lenBuf, p); - os->write(dataBuf, p); -} - - -void ObjectOutputStream::writeObject(const MDC::Map& val, Pool& p) { - // - // TC_OBJECT and the classDesc for java.util.Hashtable - // - char prolog[] = { - 0x72, 0x00, 0x13, 0x6A, 0x61, 0x76, 0x61, - 0x2E, 0x75, 0x74, 0x69, 0x6C, 0x2E, 0x48, 0x61, - 0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x13, - static_cast<char>(0xBB), 0x0F, 0x25, 0x21, 0x4A, static_cast<char>(0xE4), static_cast<char>(0xB8), 0x03, - 0x00, 0x02, 0x46, 0x00, 0x0A, 0x6C, 0x6F, 0x61, - 0x64, 0x46, 0x61, 0x63, 0x74, 0x6F, 0x72, 0x49, - 0x00, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6F, 0x6C, 0x64, 0x78, 0x70 }; - writeProlog("java.util.Hashtable", 1, prolog, sizeof(prolog), p); - // - // loadFactor = 0.75, threshold = 5, blockdata start, buckets.size = 7 - char data[] = { 0x3F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, - TC_BLOCKDATA, 0x08, 0x00, 0x00, 0x00, 0x07 }; - ByteBuffer dataBuf(data, sizeof(data)); - os->write(dataBuf, p); - char size[4]; - size_t sz = val.size(); - size[3] = (char) (sz & 0xFF); - size[2] = (char) ((sz >> 8) & 0xFF); - size[1] = (char) ((sz >> 16) & 0xFF); - size[0] = (char) ((sz >> 24) & 0xFF); - ByteBuffer sizeBuf(size, sizeof(size)); - os->write(sizeBuf, p); - for(MDC::Map::const_iterator iter = val.begin(); - iter != val.end(); - iter++) { - writeObject(iter->first, p); - writeObject(iter->second, p); - } - writeByte(TC_ENDBLOCKDATA, p); -} - -void ObjectOutputStream::writeUTFString(const std::string& val, Pool& p) { - char bytes[3]; - size_t len = val.size(); - ByteBuffer dataBuf(const_cast<char*>(val.data()), val.size()); - objectHandle++; - bytes[0] = 0x74; - bytes[1] = (char) ((len >> 8) & 0xFF); - bytes[2] = (char) (len & 0xFF); - ByteBuffer lenBuf(bytes, sizeof(bytes)); - os->write(lenBuf, p); - os->write(dataBuf, p); -} - - - -void ObjectOutputStream::writeByte(char val, Pool& p) { - ByteBuffer buf(&val, 1); - os->write(buf, p); -} - -void ObjectOutputStream::writeInt(int val, Pool& p) { - char bytes[4]; - bytes[3] = (char) (val & 0xFF); - bytes[2] = (char) ((val >> 8) & 0xFF); - bytes[1] = (char) ((val >> 16) & 0xFF); - bytes[0] = (char) ((val >> 24) & 0xFF); - ByteBuffer buf(bytes, sizeof(bytes)); - os->write(buf, p); -} - -void ObjectOutputStream::writeLong(log4cxx_time_t val, Pool& p) { - char bytes[8]; - bytes[7] = (char) (val & 0xFF); - bytes[6] = (char) ((val >> 8) & 0xFF); - bytes[5] = (char) ((val >> 16) & 0xFF); - bytes[4] = (char) ((val >> 24) & 0xFF); - bytes[3] = (char) ((val >> 32) & 0xFF); - bytes[2] = (char) ((val >> 40) & 0xFF); - bytes[1] = (char) ((val >> 48) & 0xFF); - bytes[0] = (char) ((val >> 56) & 0xFF); - ByteBuffer buf(bytes, sizeof(bytes)); - os->write(buf, p); -} - -void ObjectOutputStream::writeBytes(const char* bytes, size_t len, Pool& p) { - ByteBuffer buf(const_cast<char*>(bytes), len); - os->write(buf, p); -} - -void ObjectOutputStream::writeNull(Pool& p) { - writeByte(TC_NULL, p); -} - -void ObjectOutputStream::writeProlog(const char* className, - int classDescIncrement, - char* classDesc, - size_t len, - Pool& p) { - ClassDescriptionMap::const_iterator match = classDescriptions->find(className); - if (match != classDescriptions->end()) { - char bytes[6]; - bytes[0] = TC_OBJECT; - bytes[1] = TC_REFERENCE; - bytes[2] = (char) ((match->second >> 24) & 0xFF); - bytes[3] = (char) ((match->second >> 16) & 0xFF); - bytes[4] = (char) ((match->second >> 8) & 0xFF); - bytes[5] = (char) (match->second & 0xFF); - ByteBuffer buf(bytes, sizeof(bytes)); - os->write(buf, p); - objectHandle++; - } else { - classDescriptions->insert(ClassDescriptionMap::value_type(className, objectHandle)); - writeByte(TC_OBJECT, p); - ByteBuffer buf(classDesc, len); - os->write(buf, p); - objectHandle += (classDescIncrement + 1); - } -} + bytes[1] = (char) (len & 0xFF); + bytes[0] = (char) ((len >> 8) & 0xFF); + ByteBuffer lenBuf(bytes, sizeof(bytes)); + + os->write(lenBuf, p); + os->write(dataBuf, p); +} + + +void ObjectOutputStream::writeObject(const MDC::Map& val, Pool& p) +{ + // + // TC_OBJECT and the classDesc for java.util.Hashtable + // + char prolog[] = { + 0x72, 0x00, 0x13, 0x6A, 0x61, 0x76, 0x61, + 0x2E, 0x75, 0x74, 0x69, 0x6C, 0x2E, 0x48, 0x61, + 0x73, 0x68, 0x74, 0x61, 0x62, 0x6C, 0x65, 0x13, + static_cast<char>(0xBB), 0x0F, 0x25, 0x21, 0x4A, static_cast<char>(0xE4), static_cast<char>(0xB8), 0x03, + 0x00, 0x02, 0x46, 0x00, 0x0A, 0x6C, 0x6F, 0x61, + 0x64, 0x46, 0x61, 0x63, 0x74, 0x6F, 0x72, 0x49, + 0x00, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6F, 0x6C, 0x64, 0x78, 0x70 }; + writeProlog("java.util.Hashtable", 1, prolog, sizeof(prolog), p); + + // loadFactor = 0.75, threshold = 5, blockdata start, buckets.size = 7 + char data[] = { 0x3F, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, + TC_BLOCKDATA, 0x08, 0x00, 0x00, 0x00, 0x07 }; + ByteBuffer dataBuf(data, sizeof(data)); + os->write(dataBuf, p); + + char size[4]; + size_t sz = val.size(); + + size[3] = (char) (sz & 0xFF); + size[2] = (char) ((sz >> 8) & 0xFF); + size[1] = (char) ((sz >> 16) & 0xFF); + size[0] = (char) ((sz >> 24) & 0xFF); + + ByteBuffer sizeBuf(size, sizeof(size)); + os->write(sizeBuf, p); + + for (MDC::Map::const_iterator iter = val.begin(); + iter != val.end(); + iter++) + { + writeObject(iter->first, p); + writeObject(iter->second, p); + } + writeByte(TC_ENDBLOCKDATA, p); +} + +void ObjectOutputStream::writeUTFString(const std::string& val, Pool& p) +{ + char bytes[3]; + size_t len = val.size(); + ByteBuffer dataBuf(const_cast<char*>(val.data()), val.size()); + objectHandle++; + + bytes[0] = 0x74; + bytes[1] = (char) ((len >> 8) & 0xFF); + bytes[2] = (char) (len & 0xFF); + + ByteBuffer lenBuf(bytes, sizeof(bytes)); + os->write(lenBuf, p); + os->write(dataBuf, p); +} + + + +void ObjectOutputStream::writeByte(char val, Pool& p) +{ + ByteBuffer buf(&val, 1); + os->write(buf, p); +} + +void ObjectOutputStream::writeInt(int val, Pool& p) +{ + char bytes[4]; + + bytes[3] = (char) (val & 0xFF); + bytes[2] = (char) ((val >> 8) & 0xFF); + bytes[1] = (char) ((val >> 16) & 0xFF); + bytes[0] = (char) ((val >> 24) & 0xFF); + + ByteBuffer buf(bytes, sizeof(bytes)); + os->write(buf, p); +} + +void ObjectOutputStream::writeLong(log4cxx_time_t val, Pool& p) +{ + char bytes[8]; + + bytes[7] = (char) (val & 0xFF); + bytes[6] = (char) ((val >> 8) & 0xFF); + bytes[5] = (char) ((val >> 16) & 0xFF); + bytes[4] = (char) ((val >> 24) & 0xFF); + bytes[3] = (char) ((val >> 32) & 0xFF); + bytes[2] = (char) ((val >> 40) & 0xFF); + bytes[1] = (char) ((val >> 48) & 0xFF); + bytes[0] = (char) ((val >> 56) & 0xFF); + + ByteBuffer buf(bytes, sizeof(bytes)); + os->write(buf, p); +} + +void ObjectOutputStream::writeBytes(const char* bytes, size_t len, Pool& p) +{ + ByteBuffer buf(const_cast<char*>(bytes), len); + os->write(buf, p); +} + +void ObjectOutputStream::writeNull(Pool& p) +{ + writeByte(TC_NULL, p); +} + +void ObjectOutputStream::writeProlog(const char* className, + int classDescIncrement, + char* classDesc, + size_t len, + Pool& p) +{ + ClassDescriptionMap::const_iterator match = classDescriptions->find(className); + + if (match != classDescriptions->end()) + { + char bytes[6]; + + bytes[0] = TC_OBJECT; + bytes[1] = TC_REFERENCE; + bytes[2] = (char) ((match->second >> 24) & 0xFF); + bytes[3] = (char) ((match->second >> 16) & 0xFF); + bytes[4] = (char) ((match->second >> 8) & 0xFF); + bytes[5] = (char) (match->second & 0xFF); + + ByteBuffer buf(bytes, sizeof(bytes)); + os->write(buf, p); + + objectHandle++; + } + else + { + classDescriptions->insert(ClassDescriptionMap::value_type(className, objectHandle)); + writeByte(TC_OBJECT, p); + + ByteBuffer buf(classDesc, len); + os->write(buf, p); + + objectHandle += (classDescIncrement + 1); + } +} Modified: incubator/log4cxx/trunk/src/main/cpp/socketappender.cpp URL: http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/cpp/socketappender.cpp?rev=1720193&r1=1720192&r2=1720193&view=diff ============================================================================== --- incubator/log4cxx/trunk/src/main/cpp/socketappender.cpp (original) +++ incubator/log4cxx/trunk/src/main/cpp/socketappender.cpp Tue Dec 15 16:53:54 2015 @@ -38,74 +38,93 @@ IMPLEMENT_LOG4CXX_OBJECT(SocketAppender) // The default port number of remote logging server (4560) -int SocketAppender::DEFAULT_PORT = 4560; +int SocketAppender::DEFAULT_PORT = 4560; // The default reconnection delay (30000 milliseconds or 30 seconds). -int SocketAppender::DEFAULT_RECONNECTION_DELAY = 30000; - - +int SocketAppender::DEFAULT_RECONNECTION_DELAY = 30000; SocketAppender::SocketAppender() -: SocketAppenderSkeleton(DEFAULT_PORT, DEFAULT_RECONNECTION_DELAY) { +: SocketAppenderSkeleton(DEFAULT_PORT, DEFAULT_RECONNECTION_DELAY) +{ } SocketAppender::SocketAppender(InetAddressPtr& address1, int port1) -: SocketAppenderSkeleton(address1, port1, DEFAULT_RECONNECTION_DELAY) { - Pool p; - activateOptions(p); +: SocketAppenderSkeleton(address1, port1, DEFAULT_RECONNECTION_DELAY) +{ + Pool p; + activateOptions(p); } SocketAppender::SocketAppender(const LogString& host, int port1) -: SocketAppenderSkeleton(host, port1, DEFAULT_RECONNECTION_DELAY) { - Pool p; - activateOptions(p); +: SocketAppenderSkeleton(host, port1, DEFAULT_RECONNECTION_DELAY) +{ + Pool p; + activateOptions(p); } SocketAppender::~SocketAppender() { - finalize(); + finalize(); +} + +int SocketAppender::getDefaultDelay() const +{ + return DEFAULT_RECONNECTION_DELAY; } -int SocketAppender::getDefaultDelay() const { - return DEFAULT_RECONNECTION_DELAY; +int SocketAppender::getDefaultPort() const +{ + return DEFAULT_PORT; } -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); -} - -void SocketAppender::cleanUp(Pool& p) { - if (oos != 0) { - try { - oos->close(p); - oos = 0; - } catch(std::exception& e) { - } - } +void SocketAppender::setSocket(log4cxx::helpers::SocketPtr& socket, Pool& p) +{ + synchronized sync(mutex); + + oos = new ObjectOutputStream(new SocketOutputStream(socket), p); } +void SocketAppender::cleanUp(Pool& p) +{ + if (oos == 0) + { + return; + } + + try + { + oos->close(p); + oos = 0; + } + catch(std::exception& e) + {} +} -void SocketAppender::append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& p) { - if (oos != 0) { - LogString ndcVal; - event->getNDC(ndcVal); - event->getThreadName(); - // Get a copy of this thread's MDC. - event->getMDCCopy(); - 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(); - } - } - } +void SocketAppender::append(const spi::LoggingEventPtr& event, log4cxx::helpers::Pool& p) +{ + if (oos == 0) + { + return; + } + + LogString ndcVal; + event->getNDC(ndcVal); + event->getThreadName(); + event->getMDCCopy(); + + 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: incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h URL: http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h?rev=1720193&r1=1720192&r2=1720193&view=diff ============================================================================== --- incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h (original) +++ incubator/log4cxx/trunk/src/main/include/log4cxx/helpers/objectoutputstream.h Tue Dec 15 16:53:54 2015 @@ -25,71 +25,74 @@ namespace log4cxx { + namespace helpers + { + /** + * Emulates java serialization. + */ + class LOG4CXX_EXPORT ObjectOutputStream : public ObjectImpl + { + public: + DECLARE_ABSTRACT_LOG4CXX_OBJECT(ObjectOutputStream) + BEGIN_LOG4CXX_CAST_MAP() + LOG4CXX_CAST_ENTRY(ObjectOutputStream) + END_LOG4CXX_CAST_MAP() + + ObjectOutputStream(OutputStreamPtr os, Pool& p); + virtual ~ObjectOutputStream(); + + void close(Pool& p); + void flush(Pool& p); + void writeObject(const LogString&, Pool& p); + void writeUTFString(const std::string&, Pool& p); + void writeObject(const MDC::Map& mdc, Pool& p); + void writeInt(int val, Pool& p); + void writeLong(log4cxx_time_t val, Pool& p); + void writeProlog(const char* className, + int classDescIncrement, + char* bytes, + size_t len, + Pool& p); + void writeNull(Pool& p); + + enum { STREAM_MAGIC = 0xACED }; + enum { STREAM_VERSION = 5 }; + enum + { + TC_NULL = 0x70, + TC_REFERENCE = 0x71, + TC_CLASSDESC = 0x72, + TC_OBJECT = 0x73, + TC_STRING = 0x74, + TC_ARRAY = 0x75, + TC_CLASS = 0x76, + TC_BLOCKDATA = 0x77, + TC_ENDBLOCKDATA = 0x78 + }; + enum + { + SC_WRITE_METHOD = 0x01, + SC_SERIALIZABLE = 0x02 + }; + + void writeByte(char val, Pool& p); + void writeBytes(const char* bytes, size_t len, Pool& p); + + private: + ObjectOutputStream(const ObjectOutputStream&); + ObjectOutputStream& operator=(const ObjectOutputStream&); + + OutputStreamPtr os; + log4cxx::helpers::CharsetEncoderPtr utf8Encoder; + unsigned int objectHandle; + typedef std::map<std::string, unsigned int> ClassDescriptionMap; + ClassDescriptionMap* classDescriptions; + }; - namespace helpers { + LOG4CXX_PTR_DEF(ObjectOutputStream); + } // namespace helpers - /** - * Emulates java serialization. - */ - class LOG4CXX_EXPORT ObjectOutputStream : public ObjectImpl - { - public: - DECLARE_ABSTRACT_LOG4CXX_OBJECT(ObjectOutputStream) - BEGIN_LOG4CXX_CAST_MAP() - LOG4CXX_CAST_ENTRY(ObjectOutputStream) - END_LOG4CXX_CAST_MAP() - - ObjectOutputStream(OutputStreamPtr os, Pool& p); - virtual ~ObjectOutputStream(); - - void close(Pool& p); - void flush(Pool& p); - void writeObject(const LogString&, Pool& p); - void writeUTFString(const std::string&, Pool& p); - void writeObject(const MDC::Map& mdc, Pool& p); - void writeInt(int val, Pool& p); - void writeLong(log4cxx_time_t val, Pool& p); - void writeProlog(const char* className, - int classDescIncrement, - char* bytes, - size_t len, - Pool& p); - void writeNull(Pool& p); - - enum { STREAM_MAGIC = 0xACED }; - enum { STREAM_VERSION = 5 }; - enum { TC_NULL = 0x70, - TC_REFERENCE = 0x71, - TC_CLASSDESC = 0x72, - TC_OBJECT = 0x73, - TC_STRING = 0x74, - TC_ARRAY = 0x75, - TC_CLASS = 0x76, - TC_BLOCKDATA = 0x77, - TC_ENDBLOCKDATA = 0x78 }; - enum { - SC_WRITE_METHOD = 0x01, - SC_SERIALIZABLE = 0x02 }; - - void writeByte(char val, Pool& p); - void writeBytes(const char* bytes, size_t len, Pool& p); - - private: - ObjectOutputStream(const ObjectOutputStream&); - ObjectOutputStream& operator=(const ObjectOutputStream&); - - OutputStreamPtr os; - log4cxx::helpers::CharsetEncoderPtr utf8Encoder; - unsigned int objectHandle; - typedef std::map<std::string, unsigned int> ClassDescriptionMap; - ClassDescriptionMap* classDescriptions; - }; - - LOG4CXX_PTR_DEF(ObjectOutputStream); - - } // namespace helpers - -} //namespace log4cxx +} //namespace log4cxx #endif //_LOG4CXX_HELPERS_OUTPUTSTREAM_H Modified: incubator/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h URL: http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h?rev=1720193&r1=1720192&r2=1720193&view=diff ============================================================================== --- incubator/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h (original) +++ incubator/log4cxx/trunk/src/main/include/log4cxx/net/socketappender.h Tue Dec 15 16:53:54 2015 @@ -23,120 +23,112 @@ namespace log4cxx { - namespace net - { + namespace net + { + /** + Sends {@link log4cxx::spi::LoggingEvent LoggingEvent} objects to a remote a log server, + usually Apache Chainsaw. + + <p>The SocketAppender has the following properties: + + - If sent to Apache Chainsaw, remote logging + is non-intrusive as far as the log event is concerned. In other + words, the event will be logged with the same time stamp, {@link + NDC NDC}, location info as if it were logged locally by + the client. + + - SocketAppenders do not use a layout. They ship a + serialized {@link log4cxx::spi::LoggingEvent LoggingEvent} object + to the server side. + + - Remote logging uses the TCP protocol. Consequently, if + the server is reachable, then log events will eventually arrive + at the server. + + - If the remote server is down, the logging requests are + simply dropped. However, if and when the server comes back up, + then event transmission is resumed transparently. This + transparent reconneciton is performed by a <em>connector</em> + thread which periodically attempts to connect to the server. + + - Logging events are automatically <em>buffered</em> by the + native TCP implementation. This means that if the link to server + is slow but still faster than the rate of (log) event production + by the client, the client will not be affected by the slow + network connection. However, if the network connection is slower + then the rate of event production, then the client can only + progress at the network rate. In particular, if the network link + to the the server is down, the client will be blocked. + @n @n On the other hand, if the network link is up, but the server + is down, the client will not be blocked when making log requests + but the log events will be lost due to server unavailability. + + - Even if a <code>SocketAppender</code> is no longer + attached to any logger, it will not be destroyed in + the presence of a connector thread. A connector thread exists + only if the connection to the server is down. To avoid this + destruction problem, you should #close the the + <code>SocketAppender</code> explicitly. See also next item. + @n @n Long lived applications which create/destroy many + <code>SocketAppender</code> instances should be aware of this + destruction problem. Most other applications can safely + ignore it. + + - If the application hosting the <code>SocketAppender</code> + exits before the <code>SocketAppender</code> is closed either + explicitly or subsequent to destruction, then there might + be untransmitted data in the pipe which might be lost. + @n @n To avoid lost data, it is usually sufficient to + #close the <code>SocketAppender</code> either explicitly or by + calling the LogManager#shutdown method + before exiting the application. + */ + class LOG4CXX_EXPORT SocketAppender : public SocketAppenderSkeleton + { + public: + /** + The default port number of remote logging server (4560). + */ + static int DEFAULT_PORT; + + /** + The default reconnection delay (30000 milliseconds or 30 seconds). + */ + 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() + + SocketAppender(); + ~SocketAppender(); + + /** + Connects to remote server at <code>address</code> and <code>port</code>. + */ + SocketAppender(helpers::InetAddressPtr& address, int port); + + /** + Connects to remote server at <code>host</code> and <code>port</code>. + */ + SocketAppender(const LogString& host, int port); + + 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); - /** - Sends {@link log4cxx::spi::LoggingEvent LoggingEvent} objects to a remote a log server, - usually Apache Chainsaw. - - <p>The SocketAppender has the following properties: - - - If sent to Apache Chainsaw, remote logging - is non-intrusive as far as the log event is concerned. In other - words, the event will be logged with the same time stamp, {@link - NDC NDC}, location info as if it were logged locally by - the client. - - - SocketAppenders do not use a layout. They ship a - serialized {@link log4cxx::spi::LoggingEvent LoggingEvent} object - to the server side. - - - Remote logging uses the TCP protocol. Consequently, if - the server is reachable, then log events will eventually arrive - at the server. - - - If the remote server is down, the logging requests are - simply dropped. However, if and when the server comes back up, - then event transmission is resumed transparently. This - transparent reconneciton is performed by a <em>connector</em> - thread which periodically attempts to connect to the server. - - - Logging events are automatically <em>buffered</em> by the - native TCP implementation. This means that if the link to server - is slow but still faster than the rate of (log) event production - by the client, the client will not be affected by the slow - network connection. However, if the network connection is slower - then the rate of event production, then the client can only - progress at the network rate. In particular, if the network link - to the the server is down, the client will be blocked. - @n @n On the other hand, if the network link is up, but the server - is down, the client will not be blocked when making log requests - but the log events will be lost due to server unavailability. - - - Even if a <code>SocketAppender</code> is no longer - attached to any logger, it will not be destroyed in - the presence of a connector thread. A connector thread exists - only if the connection to the server is down. To avoid this - destruction problem, you should #close the the - <code>SocketAppender</code> explicitly. See also next item. - @n @n Long lived applications which create/destroy many - <code>SocketAppender</code> instances should be aware of this - destruction problem. Most other applications can safely - ignore it. - - - If the application hosting the <code>SocketAppender</code> - exits before the <code>SocketAppender</code> is closed either - explicitly or subsequent to destruction, then there might - be untransmitted data in the pipe which might be lost. - @n @n To avoid lost data, it is usually sufficient to - #close the <code>SocketAppender</code> either explicitly or by - calling the LogManager#shutdown method - before exiting the application. - */ - - class LOG4CXX_EXPORT SocketAppender : public SocketAppenderSkeleton - { - public: - /** - The default port number of remote logging server (4560). - */ - static int DEFAULT_PORT; - - /** - The default reconnection delay (30000 milliseconds or 30 seconds). - */ - 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() - - SocketAppender(); - ~SocketAppender(); - - /** - Connects to remote server at <code>address</code> and <code>port</code>. - */ - SocketAppender(helpers::InetAddressPtr& address, int port); - - /** - Connects to remote server at <code>host</code> and <code>port</code>. - */ - SocketAppender(const LogString& host, int port); - - - 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 - - LOG4CXX_PTR_DEF(SocketAppender); - - } // namespace net + private: + log4cxx::helpers::ObjectOutputStreamPtr oos; + + }; // class SocketAppender + + LOG4CXX_PTR_DEF(SocketAppender); + } // namespace net } // namespace log4cxx #endif // _LOG4CXX_NET_SOCKET_APPENDER_H