You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rm...@apache.org on 2022/06/02 01:33:03 UTC

[logging-log4cxx] 01/01: LOGCXX-556 Update syslog appender to better account for multi-part messages

This is an automated email from the ASF dual-hosted git repository.

rmiddleton pushed a commit to branch LOGCXX-556
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git

commit 5ac5a9c5aece40e434e8ea9ec1102d76a5e9e34e
Author: Robert Middleton <ro...@rm5248.com>
AuthorDate: Wed Jun 1 21:32:47 2022 -0400

    LOGCXX-556 Update syslog appender to better account for multi-part messages
---
 src/main/cpp/syslogappender.cpp               | 15 +++++++++++----
 src/main/include/log4cxx/net/syslogappender.h |  8 ++++++++
 src/test/cpp/net/syslogappendertestcase.cpp   | 14 +++++++++++++-
 3 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/main/cpp/syslogappender.cpp b/src/main/cpp/syslogappender.cpp
index 99d91f6c..ff9b6428 100644
--- a/src/main/cpp/syslogappender.cpp
+++ b/src/main/cpp/syslogappender.cpp
@@ -23,6 +23,7 @@
 #include <log4cxx/level.h>
 #include <log4cxx/helpers/transcoder.h>
 #include <log4cxx/helpers/optionconverter.h>
+#include <log4cxx/patternlayout.h>
 #if !defined(LOG4CXX)
 	#define LOG4CXX 1
 #endif
@@ -69,7 +70,7 @@ SyslogAppender::SyslogAppender()
 	: syslogFacility(LOG_USER), facilityPrinting(false), sw(0), maxMessageLength(1024)
 {
 	this->initSyslogFacilityStr();
-
+	this->layout = LayoutPtr(new PatternLayout("%m"));
 }
 
 SyslogAppender::SyslogAppender(const LayoutPtr& layout1,
@@ -326,11 +327,17 @@ void SyslogAppender::append(const spi::LoggingEventPtr& event, Pool& p)
 
 		while ( start != msg.end() )
 		{
-			LogString::iterator end = start + maxMessageLength - 12;
+			LogString::iterator end;// = start + maxMessageLength - 12;
+
+//			if ( end > msg.end() )
+//			{
+//				end = msg.end();
+//			}
 
-			if ( end > msg.end() )
-			{
+			if( msg.size() > (maxMessageLength - MINIMUM_MESSAGE_SIZE) ) {
 				end = msg.end();
+			}else{
+				end = start + maxMessageLength - MINIMUM_MESSAGE_SIZE;
 			}
 
 			LogString newMsg = LogString( start, end );
diff --git a/src/main/include/log4cxx/net/syslogappender.h b/src/main/include/log4cxx/net/syslogappender.h
index 689fd2c1..d09d249a 100644
--- a/src/main/include/log4cxx/net/syslogappender.h
+++ b/src/main/include/log4cxx/net/syslogappender.h
@@ -42,6 +42,9 @@ namespace net
  * When the message is too large for the current MaxMessageLength,
  * the packet number and total # will be appended to the end of the
  * message like this: (5/10)
+ *
+ * Note the maximum message length must be at least 12 to account
+ * for the total number of packets.
  */
 class LOG4CXX_EXPORT SyslogAppender : public AppenderSkeleton
 {
@@ -150,6 +153,9 @@ class LOG4CXX_EXPORT SyslogAppender : public AppenderSkeleton
 
 		inline void setMaxMessageLength(int maxMessageLength1)
 		{
+			if( maxMessageLength1 < MINIMUM_MESSAGE_SIZE ){
+				maxMessageLength1 = MINIMUM_MESSAGE_SIZE;
+			}
 			maxMessageLength = maxMessageLength1;
 		}
 
@@ -171,6 +177,8 @@ class LOG4CXX_EXPORT SyslogAppender : public AppenderSkeleton
 	private:
 		SyslogAppender(const SyslogAppender&);
 		SyslogAppender& operator=(const SyslogAppender&);
+
+		const int MINIMUM_MESSAGE_SIZE = 12;
 }; // class SyslogAppender
 LOG4CXX_PTR_DEF(SyslogAppender);
 } // namespace net
diff --git a/src/test/cpp/net/syslogappendertestcase.cpp b/src/test/cpp/net/syslogappendertestcase.cpp
index 8470548f..a18462e8 100644
--- a/src/test/cpp/net/syslogappendertestcase.cpp
+++ b/src/test/cpp/net/syslogappendertestcase.cpp
@@ -21,6 +21,7 @@
 
 using namespace log4cxx;
 using namespace log4cxx::helpers;
+using namespace log4cxx::net;
 
 /**
    Unit tests of log4cxx::SyslogAppender
@@ -33,7 +34,7 @@ class SyslogAppenderTestCase : public AppenderSkeletonTestCase
 		//
 		LOGUNIT_TEST(testDefaultThreshold);
 		LOGUNIT_TEST(testSetOptionThreshold);
-
+		LOGUNIT_TEST(testLargeMessage);
 		LOGUNIT_TEST_SUITE_END();
 
 
@@ -43,6 +44,17 @@ class SyslogAppenderTestCase : public AppenderSkeletonTestCase
 		{
 			return new log4cxx::net::SyslogAppender();
 		}
+
+		void testLargeMessage() {
+			SyslogAppenderPtr syslogAppender =
+					SyslogAppenderPtr(new SyslogAppender());
+
+			syslogAppender->setMaxMessageLength(20);
+
+			Logger::getRootLogger()->addAppender(syslogAppender);
+
+			Logger::getRootLogger()->error( LOG4CXX_STR( "This is a message over 20 characters in length so we can test stuff" ) );
+		}
 };
 
 LOGUNIT_TEST_SUITE_REGISTRATION(SyslogAppenderTestCase);