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

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

commit 40d3ff2d8900b210bfda691f76077256ffa1f2f4
Author: Stephen Webb <[email protected]>
AuthorDate: Mon Aug 24 16:41:29 2026 +1000

    Log a 'Unknown option ...' warning for an obsolete/incorrect configuration 
file item
---
 src/examples/cpp/CMakeLists.txt                    |  5 ++-
 .../optionhandler.cpp => examples/cpp/MyApp4.cpp}  | 32 ++++++++---------
 src/examples/cpp/MyApp4.xml                        | 41 ++++++++++++++++++++++
 src/main/cpp/appenderskeleton.cpp                  |  2 ++
 src/main/cpp/asyncappender.cpp                     |  4 +--
 src/main/cpp/fallbackerrorhandler.cpp              |  3 +-
 src/main/cpp/filter.cpp                            |  3 +-
 src/main/cpp/filterbasedtriggeringpolicy.cpp       |  3 +-
 src/main/cpp/fmtlayout.cpp                         |  2 ++
 src/main/cpp/htmllayout.cpp                        |  2 ++
 src/main/cpp/jsonlayout.cpp                        |  2 ++
 src/main/cpp/levelmatchfilter.cpp                  |  2 ++
 src/main/cpp/levelrangefilter.cpp                  |  2 ++
 src/main/cpp/locationinfofilter.cpp                |  2 ++
 src/main/cpp/loggermatchfilter.cpp                 |  2 ++
 src/main/cpp/{optionhandler.cpp => logstring.cpp}  | 20 +++--------
 src/main/cpp/manualtriggeringpolicy.cpp            |  3 +-
 src/main/cpp/mapfilter.cpp                         |  2 ++
 src/main/cpp/onlyonceerrorhandler.cpp              |  3 +-
 src/main/cpp/optionhandler.cpp                     |  6 ++++
 src/main/cpp/patternlayout.cpp                     |  2 ++
 src/main/cpp/rollingpolicybase.cpp                 |  2 ++
 src/main/cpp/sizebasedtriggeringpolicy.cpp         |  2 ++
 src/main/cpp/stringmatchfilter.cpp                 |  2 ++
 src/main/cpp/syslogappender.cpp                    |  8 -----
 src/main/cpp/xmllayout.cpp                         |  2 ++
 src/main/include/log4cxx/fmtlayout.h               |  8 +++++
 src/main/include/log4cxx/spi/optionhandler.h       |  3 +-
 src/site/markdown/configuration-samples.md         | 38 ++------------------
 29 files changed, 122 insertions(+), 86 deletions(-)

diff --git a/src/examples/cpp/CMakeLists.txt b/src/examples/cpp/CMakeLists.txt
index 87dc2ec6..f9bf6536 100644
--- a/src/examples/cpp/CMakeLists.txt
+++ b/src/examples/cpp/CMakeLists.txt
@@ -15,7 +15,7 @@
 # limitations under the License.
 #
 
-set(ALL_LOG4CXX_EXAMPLES auto-configured console delayedloop stream 
ndc-example custom-appender MyApp1 MyApp2)
+set(ALL_LOG4CXX_EXAMPLES auto-configured console delayedloop stream 
ndc-example custom-appender MyApp1 MyApp2 MyApp4)
 if(NOT LOG4CXX_DOMCONFIGURATOR_SUPPORT)
     list(REMOVE_ITEM ALL_LOG4CXX_EXAMPLES delayedloop custom-appender)
 endif()
@@ -41,6 +41,9 @@ foreach(exampleName IN LISTS ALL_LOG4CXX_EXAMPLES)
     if(${exampleName} STREQUAL MyApp2)
         target_sources(${PROGRAM_NAME} PRIVATE com/foo/config2.cpp 
com/foo/bar.cpp)
     endif()
+    if(${exampleName} STREQUAL MyApp4)
+        target_sources(${PROGRAM_NAME} PRIVATE com/foo/config4.cpp 
com/foo/bar.cpp)
+    endif()
     if(${exampleName} STREQUAL MyApp-qt)
         target_sources(${PROGRAM_NAME} PRIVATE com/foo/config-qt.cpp 
com/foo/bar-qt.cpp)
         target_link_libraries(${PROGRAM_NAME} PRIVATE log4cxx-qt)
diff --git a/src/main/cpp/optionhandler.cpp b/src/examples/cpp/MyApp4.cpp
similarity index 66%
copy from src/main/cpp/optionhandler.cpp
copy to src/examples/cpp/MyApp4.cpp
index 936cccdd..e89a7b8d 100644
--- a/src/main/cpp/optionhandler.cpp
+++ b/src/examples/cpp/MyApp4.cpp
@@ -14,22 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <log4cxx/spi/optionhandler.h>
-#include <log4cxx/helpers/pool.h>
+#include "com/foo/config.h"
+#include "com/foo/bar.h"
 
-using namespace LOG4CXX_NS;
-
-#if LOG4CXX_ABI_VERSION <= 15
-void spi::OptionHandler::activateOptions()
-{
-       // Ensure any ABI 15 overriden activateOptions is invoked
-       helpers::Pool p;
-       activateOptions(p);
-}
-#else
-void spi::OptionHandler::activateOptions(helpers::Pool&)
-{
-       // Redirect to the ABI 16 activateOptions
-       activateOptions();
+int main() {
+       int result = EXIT_SUCCESS;
+       try {
+               auto logger = com::foo::getLogger("MyApp");
+               LOG4CXX_INFO(logger, "Entering application.");
+               com::foo::Bar bar;
+               bar.doIt();
+               LOG4CXX_INFO(logger, "Exiting application.");
+       }
+       catch(std::exception&) {
+               result = EXIT_FAILURE;
+       }
+       return result;
 }
-#endif
diff --git a/src/examples/cpp/MyApp4.xml b/src/examples/cpp/MyApp4.xml
new file mode 100644
index 00000000..2594c775
--- /dev/null
+++ b/src/examples/cpp/MyApp4.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"; 
debug="true" -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";>
+
+  <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
+    <param name="Target" value="System.out"/>
+    <param name="Threshold" value="info"/>
+    <layout class="org.apache.log4j.PatternLayout">
+      <param name="ConversionPattern" value="%c - %Y%m%y%n"/>
+    </layout>
+  </appender>
+
+  <appender name="FileAppender" class="org.apache.log4j.RollingFileAppender">
+    <param name="file" 
value="${LocalAppData}/${CURRENT_VENDOR_FOLDER}/${CURRENT_PRODUCT_FOLDER}/logs/${PROGRAM_FILE_PATH.STEM}.log"
 />
+    <layout class="org.apache.log4j.PatternLayout">
+      <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] %c 
%-5p - %m%n" />
+    </layout>
+    <rollingPolicy class="org.apache.log4j.rolling.FixedWindowRollingPolicy">
+       <param name="fileNamePattern" 
value="${LocalAppData}/${CURRENT_VENDOR_FOLDER}/${CURRENT_PRODUCT_FOLDER}/logs/${PROGRAM_FILE_PATH.STEM}.%i.log"/>
+       <param name="minIndex" value="0"/>
+    </rollingPolicy>
+    <triggeringPolicy 
class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
+      <param name="maxFileSize" value="4MB" />
+    </triggeringPolicy>
+  </appender>
+
+  <root asynchronous="true" >
+     <priority value="info" />
+     <appender-ref ref="ConsoleAppender"/>
+     <appender-ref ref="FileAppender"/>
+  </root>
+
+  <logger name="com" >
+     <priority value="debug"/>
+  </logger>
+
+  <logger name="com.example" >
+     <priority value="trace"/>
+  </logger>
+
+</log4j:configuration>
\ No newline at end of file
diff --git a/src/main/cpp/appenderskeleton.cpp 
b/src/main/cpp/appenderskeleton.cpp
index a23ec9c0..7fe56883 100644
--- a/src/main/cpp/appenderskeleton.cpp
+++ b/src/main/cpp/appenderskeleton.cpp
@@ -217,6 +217,8 @@ void AppenderSkeleton::setOption(const LogString& option,
                m_priv->exceptionTriggeringMessage = value;
        }
 #endif
+       else
+               Appender::setOption(option, value);
 }
 
 const spi::ErrorHandlerPtr AppenderSkeleton::getErrorHandler() const
diff --git a/src/main/cpp/asyncappender.cpp b/src/main/cpp/asyncappender.cpp
index ef12808d..323144ef 100644
--- a/src/main/cpp/asyncappender.cpp
+++ b/src/main/cpp/asyncappender.cpp
@@ -325,12 +325,12 @@ void AsyncAppender::setOption(const LogString& option,
                setLocationInfo(OptionConverter::toBoolean(value, false));
        }
 
-       if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("BUFFERSIZE"), 
LOG4CXX_STR("buffersize")))
+       else if (StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("BUFFERSIZE"), LOG4CXX_STR("buffersize")))
        {
                setBufferSize(OptionConverter::toInt(value, 
DEFAULT_BUFFER_SIZE));
        }
 
-       if (StringHelper::equalsIgnoreCase(option, LOG4CXX_STR("BLOCKING"), 
LOG4CXX_STR("blocking")))
+       else if (StringHelper::equalsIgnoreCase(option, 
LOG4CXX_STR("BLOCKING"), LOG4CXX_STR("blocking")))
        {
                setBlocking(OptionConverter::toBoolean(value, true));
        }
diff --git a/src/main/cpp/fallbackerrorhandler.cpp 
b/src/main/cpp/fallbackerrorhandler.cpp
index 8a1652e8..98cf4af1 100644
--- a/src/main/cpp/fallbackerrorhandler.cpp
+++ b/src/main/cpp/fallbackerrorhandler.cpp
@@ -174,8 +174,9 @@ void FallbackErrorHandler::activateOptions(Pool&)
 }
 #endif
 
-void FallbackErrorHandler::setOption(const LogString&, const LogString&)
+void FallbackErrorHandler::setOption(const LogString& option, const LogString& 
value)
 {
+       ErrorHandler::setOption(option, value);
 }
 
 bool FallbackErrorHandler::errorReported() const
diff --git a/src/main/cpp/filter.cpp b/src/main/cpp/filter.cpp
index 39e63a8d..5a9e838d 100644
--- a/src/main/cpp/filter.cpp
+++ b/src/main/cpp/filter.cpp
@@ -49,7 +49,8 @@ void Filter::activateOptions( 
LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
 {
 }
 
-void Filter::setOption(const LogString&, const LogString&)
+void Filter::setOption(const LogString& option, const LogString& value)
 {
+       OptionHandler::setOption(option, value);
 }
 
diff --git a/src/main/cpp/filterbasedtriggeringpolicy.cpp 
b/src/main/cpp/filterbasedtriggeringpolicy.cpp
index 4a52aac5..0d77c881 100644
--- a/src/main/cpp/filterbasedtriggeringpolicy.cpp
+++ b/src/main/cpp/filterbasedtriggeringpolicy.cpp
@@ -119,8 +119,9 @@ void FilterBasedTriggeringPolicy::activateOptions( 
LOG4CXX_ACTIVATE_OPTIONS_FORM
        }
 }
 
-void FilterBasedTriggeringPolicy::setOption(const LogString& /* option */, 
const LogString& /* value */ )
+void FilterBasedTriggeringPolicy::setOption(const LogString& option, const 
LogString& value )
 {
+       TriggeringPolicy::setOption(option, value);
 }
 
 
diff --git a/src/main/cpp/fmtlayout.cpp b/src/main/cpp/fmtlayout.cpp
index 719bf44e..80b9e645 100644
--- a/src/main/cpp/fmtlayout.cpp
+++ b/src/main/cpp/fmtlayout.cpp
@@ -79,6 +79,8 @@ void FMTLayout::setOption(const LogString& option, const 
LogString& value)
        {
                m_priv->conversionPattern = 
helpers::OptionConverter::convertSpecialChars(value);
        }
+       else
+               Layout::setOption(option, value);
 }
 
 void FMTLayout::activateOptions( LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
diff --git a/src/main/cpp/htmllayout.cpp b/src/main/cpp/htmllayout.cpp
index 6ceed459..67e9c485 100644
--- a/src/main/cpp/htmllayout.cpp
+++ b/src/main/cpp/htmllayout.cpp
@@ -79,6 +79,8 @@ void HTMLLayout::setOption(const LogString& option,
                setLocationInfo(OptionConverter::toBoolean(value, false));
                m_priv->expectedPatternLength = 
priv::doubledLayoutSize(getFormattedEventCharacterCount());
        }
+       else
+               Layout::setOption(option, value);
 }
 
 void HTMLLayout::format( LOG4CXX_FORMAT_LAYOUT_FORMAL_PARAMETERS ) const
diff --git a/src/main/cpp/jsonlayout.cpp b/src/main/cpp/jsonlayout.cpp
index a66c8a77..118f5b67 100644
--- a/src/main/cpp/jsonlayout.cpp
+++ b/src/main/cpp/jsonlayout.cpp
@@ -127,6 +127,8 @@ void JSONLayout::setOption(const LogString& option, const 
LogString& value)
        {
                setPrettyPrint(OptionConverter::toBoolean(value, false));
        }
+       else
+               Layout::setOption(option, value);
 }
 
 void JSONLayout::format( LOG4CXX_FORMAT_LAYOUT_FORMAL_PARAMETERS ) const
diff --git a/src/main/cpp/levelmatchfilter.cpp 
b/src/main/cpp/levelmatchfilter.cpp
index a927b216..a1372fc9 100644
--- a/src/main/cpp/levelmatchfilter.cpp
+++ b/src/main/cpp/levelmatchfilter.cpp
@@ -61,6 +61,8 @@ void LevelMatchFilter::setOption(const LogString& option,
        {
                priv->acceptOnMatch = OptionConverter::toBoolean(value, 
priv->acceptOnMatch);
        }
+       else
+               Filter::setOption(option, value);
 }
 
 void LevelMatchFilter::setLevelToMatch(const LogString& levelToMatch1)
diff --git a/src/main/cpp/levelrangefilter.cpp 
b/src/main/cpp/levelrangefilter.cpp
index 732aeca5..1082fe54 100644
--- a/src/main/cpp/levelrangefilter.cpp
+++ b/src/main/cpp/levelrangefilter.cpp
@@ -72,6 +72,8 @@ void LevelRangeFilter::setOption(const LogString& option,
        {
                priv->acceptOnMatch = OptionConverter::toBoolean(value, 
priv->acceptOnMatch);
        }
+       else
+               Filter::setOption(option, value);
 }
 
 Filter::FilterDecision LevelRangeFilter::decide(
diff --git a/src/main/cpp/locationinfofilter.cpp 
b/src/main/cpp/locationinfofilter.cpp
index e83c1531..d0b172fa 100644
--- a/src/main/cpp/locationinfofilter.cpp
+++ b/src/main/cpp/locationinfofilter.cpp
@@ -75,6 +75,8 @@ void LocationInfoFilter::setOption(  const LogString& option,
                LOG4CXX_ENCODE_CHAR(sName, value);
                priv->methodName = sName;
        }
+       else
+               Filter::setOption(option, value);
 }
 
 Filter::FilterDecision LocationInfoFilter::decide(
diff --git a/src/main/cpp/loggermatchfilter.cpp 
b/src/main/cpp/loggermatchfilter.cpp
index 113bc253..afddd8ef 100644
--- a/src/main/cpp/loggermatchfilter.cpp
+++ b/src/main/cpp/loggermatchfilter.cpp
@@ -73,6 +73,8 @@ void LoggerMatchFilter::setOption(const LogString& option,
        {
                priv->acceptOnMatch = OptionConverter::toBoolean(value, 
priv->acceptOnMatch);
        }
+       else
+               Filter::setOption(option, value);
 }
 
 Filter::FilterDecision LoggerMatchFilter::decide(
diff --git a/src/main/cpp/optionhandler.cpp b/src/main/cpp/logstring.cpp
similarity index 66%
copy from src/main/cpp/optionhandler.cpp
copy to src/main/cpp/logstring.cpp
index 936cccdd..4ed68af4 100644
--- a/src/main/cpp/optionhandler.cpp
+++ b/src/main/cpp/logstring.cpp
@@ -14,22 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#include <log4cxx/spi/optionhandler.h>
-#include <log4cxx/helpers/pool.h>
 
-using namespace LOG4CXX_NS;
-
-#if LOG4CXX_ABI_VERSION <= 15
-void spi::OptionHandler::activateOptions()
-{
-       // Ensure any ABI 15 overriden activateOptions is invoked
-       helpers::Pool p;
-       activateOptions(p);
-}
-#else
-void spi::OptionHandler::activateOptions(helpers::Pool&)
+#include <log4cxx/log4cxx.h>
+#if LOG4CXX_LOGCHAR_IS_UNICHAR || LOG4CXX_UNICHAR_API
+#include <log4cxx/private/numpunct_unichar.h>
+namespace std
 {
-       // Redirect to the ABI 16 activateOptions
-       activateOptions();
+       LOG4CXX_EXPORT locale::id numpunct<::LOG4CXX_NS::UniChar>::id;
 }
 #endif
diff --git a/src/main/cpp/manualtriggeringpolicy.cpp 
b/src/main/cpp/manualtriggeringpolicy.cpp
index 1fff5242..3557320f 100644
--- a/src/main/cpp/manualtriggeringpolicy.cpp
+++ b/src/main/cpp/manualtriggeringpolicy.cpp
@@ -41,6 +41,7 @@ void ManualTriggeringPolicy::activateOptions( 
LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PA
 {
 }
 
-void ManualTriggeringPolicy::setOption(const LogString& /* option */, const 
LogString& /* value */ )
+void ManualTriggeringPolicy::setOption(const LogString& option, const 
LogString& value )
 {
+       TriggeringPolicy::setOption(option, value);
 }
diff --git a/src/main/cpp/mapfilter.cpp b/src/main/cpp/mapfilter.cpp
index e1eb0710..cd0a09af 100644
--- a/src/main/cpp/mapfilter.cpp
+++ b/src/main/cpp/mapfilter.cpp
@@ -63,6 +63,8 @@ void MapFilter::setOption(  const LogString& option,
        {
                priv->keyVals[option] = value;
        }
+       else
+               Filter::setOption(option, value);
 }
 
 Filter::FilterDecision MapFilter::decide(
diff --git a/src/main/cpp/onlyonceerrorhandler.cpp 
b/src/main/cpp/onlyonceerrorhandler.cpp
index b0944991..0e76f1bc 100644
--- a/src/main/cpp/onlyonceerrorhandler.cpp
+++ b/src/main/cpp/onlyonceerrorhandler.cpp
@@ -47,8 +47,9 @@ void OnlyOnceErrorHandler::activateOptions(Pool&)
 }
 #endif
 
-void OnlyOnceErrorHandler::setOption(const LogString&, const LogString&)
+void OnlyOnceErrorHandler::setOption(const LogString& option, const LogString& 
value)
 {
+       ErrorHandler::setOption(option, value);
 }
 
 void OnlyOnceErrorHandler::error(const LogString& message, const 
std::exception& e,
diff --git a/src/main/cpp/optionhandler.cpp b/src/main/cpp/optionhandler.cpp
index 936cccdd..5134d0d2 100644
--- a/src/main/cpp/optionhandler.cpp
+++ b/src/main/cpp/optionhandler.cpp
@@ -16,6 +16,7 @@
  */
 #include <log4cxx/spi/optionhandler.h>
 #include <log4cxx/helpers/pool.h>
+#include <log4cxx/helpers/loglog.h>
 
 using namespace LOG4CXX_NS;
 
@@ -33,3 +34,8 @@ void spi::OptionHandler::activateOptions(helpers::Pool&)
        activateOptions();
 }
 #endif
+
+void spi::OptionHandler::setOption(const LogString& option, const LogString& 
value)
+{
+       helpers::LogLog::warn(LOG4CXX_STR("Unknown option ") + option);
+}
\ No newline at end of file
diff --git a/src/main/cpp/patternlayout.cpp b/src/main/cpp/patternlayout.cpp
index 5ecc6db5..06403e07 100644
--- a/src/main/cpp/patternlayout.cpp
+++ b/src/main/cpp/patternlayout.cpp
@@ -164,6 +164,8 @@ void PatternLayout::setOption(const LogString& option, 
const LogString& value)
                                                                                
        LOG4CXX_STR("tracecolor"))){
                m_priv->m_traceColor = value;
        }
+       else
+               Layout::setOption(option, value);
 }
 
 void PatternLayout::activateOptions( 
LOG4CXX_ACTIVATE_OPTIONS_FORMAL_PARAMETERS )
diff --git a/src/main/cpp/rollingpolicybase.cpp 
b/src/main/cpp/rollingpolicybase.cpp
index bb951e65..ec137529 100644
--- a/src/main/cpp/rollingpolicybase.cpp
+++ b/src/main/cpp/rollingpolicybase.cpp
@@ -82,6 +82,8 @@ void RollingPolicyBase::setOption(const LogString& option, 
const LogString& valu
        {
                m_priv->createIntermediateDirectories = 
OptionConverter::toBoolean(value, false);
        }
+       else
+               RollingPolicy::setOption(option, value);
 }
 
 void RollingPolicyBase::setFileNamePattern(const LogString& fnp)
diff --git a/src/main/cpp/sizebasedtriggeringpolicy.cpp 
b/src/main/cpp/sizebasedtriggeringpolicy.cpp
index 61c7faee..34938604 100644
--- a/src/main/cpp/sizebasedtriggeringpolicy.cpp
+++ b/src/main/cpp/sizebasedtriggeringpolicy.cpp
@@ -60,4 +60,6 @@ void SizeBasedTriggeringPolicy::setOption(const LogString& 
option, const LogStri
        {
                maxFileSize = OptionConverter::toFileSize(value, 10 * 1024 * 
1024);
        }
+       else
+               TriggeringPolicy::setOption(option, value);
 }
diff --git a/src/main/cpp/stringmatchfilter.cpp 
b/src/main/cpp/stringmatchfilter.cpp
index 5e354127..4f2573d2 100644
--- a/src/main/cpp/stringmatchfilter.cpp
+++ b/src/main/cpp/stringmatchfilter.cpp
@@ -62,6 +62,8 @@ void StringMatchFilter::setOption(const LogString& option,
        {
                priv->acceptOnMatch = OptionConverter::toBoolean(value, 
priv->acceptOnMatch);
        }
+       else
+               Filter::setOption(option, value);
 }
 
 Filter::FilterDecision StringMatchFilter::decide(
diff --git a/src/main/cpp/syslogappender.cpp b/src/main/cpp/syslogappender.cpp
index 9d944b00..426929b8 100644
--- a/src/main/cpp/syslogappender.cpp
+++ b/src/main/cpp/syslogappender.cpp
@@ -408,16 +408,8 @@ int SyslogAppender::getFacility(
 
 void SyslogAppender::append( LOG4CXX_APPEND_FORMAL_PARAMETERS )
 {
-       if  (!isAsSevereAsThreshold(event->getLevel()))
-       {
-               return;
-       }
-
        LogString msg;
-       std::string encoded;
        _priv->layout->format(msg, event);
-
-       Transcoder::encode(msg, encoded);
        auto packets = detail::splitSyslogPackets(msg, 
static_cast<size_t>(_priv->maxMessageLength));
        if (packets.empty() && !msg.empty())
        {
diff --git a/src/main/cpp/xmllayout.cpp b/src/main/cpp/xmllayout.cpp
index e56c0de3..c50ed7ff 100644
--- a/src/main/cpp/xmllayout.cpp
+++ b/src/main/cpp/xmllayout.cpp
@@ -73,6 +73,8 @@ void XMLLayout::setOption(const LogString& option,
                setProperties(OptionConverter::toBoolean(value, false));
                m_priv->expectedPatternLength = 
priv::doubledLayoutSize(getFormattedEventCharacterCount());
        }
+       else
+               Layout::setOption(option, value);
 }
 
 void XMLLayout::format( LOG4CXX_FORMAT_LAYOUT_FORMAL_PARAMETERS ) const
diff --git a/src/main/include/log4cxx/fmtlayout.h 
b/src/main/include/log4cxx/fmtlayout.h
index c9cf0175..454f43de 100644
--- a/src/main/include/log4cxx/fmtlayout.h
+++ b/src/main/include/log4cxx/fmtlayout.h
@@ -63,6 +63,14 @@ namespace LOG4CXX_NS
  *  </tr>
  *  <tr>
  *      <td align="center">
+ *        <p><strong>d</strong></p>
+ *      </td>
+ *      <td>
+ *          Use {d:%Y-%m-%d %H:%M:%S} to output date and time.
+ *      </td>
+ *  </tr>
+ *  <tr>
+ *      <td align="center">
  *          <p><strong>C</strong></p>
  *          <p><strong>class</strong></p>
  *      </td>
diff --git a/src/main/include/log4cxx/spi/optionhandler.h 
b/src/main/include/log4cxx/spi/optionhandler.h
index 3841452f..ef002213 100644
--- a/src/main/include/log4cxx/spi/optionhandler.h
+++ b/src/main/include/log4cxx/spi/optionhandler.h
@@ -78,8 +78,7 @@ class LOG4CXX_EXPORT OptionHandler : public virtual 
helpers::Object
                other may be activated only when #activateOptions is
                called.
                */
-               virtual void setOption(const LogString& option,
-                       const LogString& value) = 0;
+               virtual void setOption(const LogString& option, const 
LogString& value);
 
 }; // class OptionConverter
 }  // namespace spi
diff --git a/src/site/markdown/configuration-samples.md 
b/src/site/markdown/configuration-samples.md
index e884dc98..25135859 100644
--- a/src/site/markdown/configuration-samples.md
+++ b/src/site/markdown/configuration-samples.md
@@ -147,10 +147,10 @@ log4j.rootCategory=INFO, A1
 log4j.asynchronous.root=true
 
 log4j.appender.A1=org.apache.log4j.RollingFileAppender
+log4j.appender.A1.BufferedIO=true
 log4j.appender.A1.MaxFileSize=5MB
 log4j.appender.A1.MaxBackupIndex=12
 
log4j.appender.A1.File=${LocalAppData}/${CURRENT_VENDOR_FOLDER}/${CURRENT_PRODUCT_FOLDER}/logs/${PROGRAM_FILE_PATH.STEM}.log
-log4j.appender.A1.Append=true
 log4j.appender.A1.layout=org.apache.log4j.PatternLayout
 log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] 
%-5p %.30c - %m%n
 
@@ -288,41 +288,7 @@ to store a log file per executable in a product related 
logs directory:
 - Windows, "C:\Users\XXXXX\AppData\Local\companyName\productName\logs"
 - Non-Windows, "/var/local/companyName/productName/logs"
 
-~~~{.xml}
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"; 
debug="true" -->
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/";>
-
-  <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
-    <param name="Target" value="System.out"/>
-    <layout class="org.apache.log4j.PatternLayout">
-      <param name="ConversionPattern" value="%c - %Y%m%y%n"/>
-    </layout>
-  </appender>
-
-  <appender name="FileAppender" class="org.apache.log4j.FileAppender">
-    <param name="file" 
value="${LocalAppData}/${CURRENT_VENDOR_FOLDER}/${CURRENT_PRODUCT_FOLDER}/logs/${PROGRAM_FILE_PATH.STEM}.log"
 />
-    <layout class="org.apache.log4j.PatternLayout">
-      <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] %c 
%-5p - %m%n" />
-    </layout>
-  </appender>
-
-  <root asynchronous="true" >
-     <priority value="info" />
-     <appender-ref ref="ConsoleAppender"/>
-     <appender-ref ref="FileAppender"/>
-  </root>
-
-  <logger name="com" >
-     <priority value="debug"/>
-  </logger>
-
-  <logger name="com.example" >
-     <priority value="trace"/>
-  </logger>
-
-</log4j:configuration>
-~~~
+\include MyApp4.xml
 
 Sample output:
 

Reply via email to