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:
