14
14
* See the License for the specific language governing permissions and
15
15
* limitations under the License.
16
16
*/
17
- #include < log4cxx/private/string_c11.h>
18
17
#include < log4cxx/logstring.h>
19
18
#include < log4cxx/xml/domconfigurator.h>
20
19
#include < log4cxx/appender.h>
@@ -68,6 +67,7 @@ struct DOMConfigurator::DOMConfiguratorPrivate
68
67
helpers::Properties props = Configurator::properties();
69
68
spi::LoggerRepositoryPtr repository;
70
69
spi::LoggerFactoryPtr loggerFactory;
70
+ bool appenderAdded{ false };
71
71
};
72
72
73
73
namespace LOG4CXX_NS
@@ -190,9 +190,19 @@ AppenderPtr DOMConfigurator::findAppenderByReference(
190
190
apr_xml_doc* doc,
191
191
AppenderMap& appenders)
192
192
{
193
+ AppenderPtr appender;
193
194
LogString appenderName (subst (getAttribute (utf8Decoder, appenderRef, REF_ATTR)));
195
+ if (appenderName.empty ())
196
+ {
197
+ LogString msg (LOG4CXX_STR (" [" ));
198
+ utf8Decoder->decode (appenderRef->name , MAX_ATTRIBUTE_NAME_LEN, msg);
199
+ msg += LOG4CXX_STR (" ] attribute [" );
200
+ utf8Decoder->decode (REF_ATTR, MAX_ATTRIBUTE_NAME_LEN, msg);
201
+ msg += LOG4CXX_STR (" ] not found" );
202
+ LogLog::warn (msg);
203
+ return appender;
204
+ }
194
205
AppenderMap::const_iterator match = appenders.find (appenderName);
195
- AppenderPtr appender;
196
206
197
207
if (match != appenders.end ())
198
208
{
@@ -311,27 +321,23 @@ AppenderPtr DOMConfigurator::parseAppender(Pool& p,
311
321
}
312
322
else if (tagName == APPENDER_REF_TAG)
313
323
{
314
- LogString refName = subst (getAttribute (utf8Decoder, currentElement, REF_ATTR));
315
-
316
- if (!refName.empty () && appender->instanceof (AppenderAttachable::getStaticClass ()))
324
+ if (appender->instanceof (AppenderAttachable::getStaticClass ()))
317
325
{
318
326
AppenderAttachablePtr aa = LOG4CXX_NS::cast<AppenderAttachable>(appender);
319
- if (LogLog::isDebugEnabled ( ))
327
+ if (auto delegateAppender = findAppenderByReference (p, utf8Decoder, currentElement, doc, appenders ))
320
328
{
321
- LogLog::debug (LOG4CXX_STR (" Attaching " ) + Appender::getStaticClass ().getName ()
322
- + LOG4CXX_STR (" named [" ) + refName + LOG4CXX_STR (" ] to " ) + Appender::getStaticClass ().getName ()
323
- + LOG4CXX_STR (" named [" ) + appender->getName () + LOG4CXX_STR (" ]" ));
329
+ if (LogLog::isDebugEnabled ())
330
+ {
331
+ LogLog::debug (LOG4CXX_STR (" Attaching " ) + Appender::getStaticClass ().getName ()
332
+ + LOG4CXX_STR (" named [" ) + delegateAppender->getName () + LOG4CXX_STR (" ] to " ) + Appender::getStaticClass ().getName ()
333
+ + LOG4CXX_STR (" named [" ) + appender->getName () + LOG4CXX_STR (" ]" ));
334
+ }
335
+ aa->addAppender (delegateAppender);
324
336
}
325
- aa->addAppender (findAppenderByReference (p, utf8Decoder, currentElement, doc, appenders));
326
- }
327
- else if (refName.empty ())
328
- {
329
- LogLog::error (LOG4CXX_STR (" Can't add " ) + Appender::getStaticClass ().getName () + LOG4CXX_STR (" with empty ref attribute" ));
330
337
}
331
338
else
332
339
{
333
- LogLog::error (LOG4CXX_STR (" Requesting attachment of " ) + Appender::getStaticClass ().getName ()
334
- + LOG4CXX_STR (" named [" ) + refName + LOG4CXX_STR (" ] to " ) + Appender::getStaticClass ().getName ()
340
+ LogLog::error (LOG4CXX_STR (" Cannot attach to " ) + Appender::getStaticClass ().getName ()
335
341
+ LOG4CXX_STR (" named [" ) + appender->getName () + LOG4CXX_STR (" ]" )
336
342
+ LOG4CXX_STR (" which does not implement " ) + AppenderAttachable::getStaticClass ().getName ());
337
343
}
@@ -386,7 +392,8 @@ void DOMConfigurator::parseErrorHandler(Pool& p,
386
392
}
387
393
else if (tagName == APPENDER_REF_TAG)
388
394
{
389
- eh->setBackupAppender (findAppenderByReference (p, utf8Decoder, currentElement, doc, appenders));
395
+ if (auto appender = findAppenderByReference (p, utf8Decoder, currentElement, doc, appenders))
396
+ eh->setBackupAppender (appender);
390
397
}
391
398
else if (tagName == LOGGER_REF)
392
399
{
@@ -461,7 +468,7 @@ void DOMConfigurator::parseLogger(
461
468
462
469
if (LogLog::isDebugEnabled ())
463
470
{
464
- LogLog::debug (LOG4CXX_STR (" Retreiving an instance of " ) + loggerName);
471
+ LogLog::debug (LOG4CXX_STR (" Getting [ " ) + loggerName + LOG4CXX_STR ( " ] " ) );
465
472
}
466
473
LoggerPtr logger = m_priv->repository ->getLogger (loggerName, m_priv->loggerFactory );
467
474
@@ -493,7 +500,12 @@ void DOMConfigurator::parseLoggerFactory(
493
500
494
501
if (className.empty ())
495
502
{
496
- LogLog::error (LOG4CXX_STR (" Logger Factory tag class attribute not found." ));
503
+ LogString msg (LOG4CXX_STR (" [" ));
504
+ utf8Decoder->decode (factoryElement->name , MAX_ATTRIBUTE_NAME_LEN, msg);
505
+ msg += LOG4CXX_STR (" ] attribute [" );
506
+ utf8Decoder->decode (CLASS_ATTR, MAX_ATTRIBUTE_NAME_LEN, msg);
507
+ msg += LOG4CXX_STR (" ] not found" );
508
+ LogLog::warn (msg);
497
509
}
498
510
else
499
511
{
@@ -558,25 +570,16 @@ void DOMConfigurator::parseChildrenOfLoggerElement(
558
570
559
571
if (tagName == APPENDER_REF_TAG)
560
572
{
561
- AppenderPtr appender = findAppenderByReference (p, utf8Decoder, currentElement, doc, appenders);
562
- LogString refName = subst (getAttribute (utf8Decoder, currentElement, REF_ATTR));
563
-
564
- if (appender)
573
+ if (auto appender = findAppenderByReference (p, utf8Decoder, currentElement, doc, appenders))
565
574
{
566
575
if (LogLog::isDebugEnabled ())
567
576
{
568
577
LogLog::debug (LOG4CXX_STR (" Adding " ) + Appender::getStaticClass ().getName ()
569
- + LOG4CXX_STR (" named [" ) + refName + LOG4CXX_STR (" ]" )
578
+ + LOG4CXX_STR (" named [" ) + appender-> getName () + LOG4CXX_STR (" ]" )
570
579
+ LOG4CXX_STR (" to logger [" ) + logger->getName () + LOG4CXX_STR (" ]" ));
571
580
}
572
581
newappenders.push_back (appender);
573
582
}
574
- else
575
- {
576
- LogLog::debug (LOG4CXX_STR (" Appender named [" ) + refName +
577
- LOG4CXX_STR (" ] not found." ));
578
- }
579
-
580
583
}
581
584
else if (tagName == LEVEL_TAG)
582
585
{
@@ -594,8 +597,10 @@ void DOMConfigurator::parseChildrenOfLoggerElement(
594
597
if (newappenders.empty ())
595
598
logger->removeAllAppenders ();
596
599
else
600
+ {
597
601
logger->replaceAppenders (newappenders);
598
-
602
+ m_priv->appenderAdded = true ;
603
+ }
599
604
propSetter.activate (p);
600
605
}
601
606
@@ -760,7 +765,7 @@ void DOMConfigurator::parseLevel(
760
765
LogString levelStr (subst (getAttribute (utf8Decoder, element, VALUE_ATTR)));
761
766
if (LogLog::isDebugEnabled ())
762
767
{
763
- LogLog::debug (LOG4CXX_STR (" Level value for " ) + loggerName + LOG4CXX_STR (" is [" ) + levelStr + LOG4CXX_STR (" ]" ));
768
+ LogLog::debug (LOG4CXX_STR (" Setting [ " ) + loggerName + LOG4CXX_STR (" ] level to [" ) + levelStr + LOG4CXX_STR (" ]" ));
764
769
}
765
770
766
771
if (StringHelper::equalsIgnoreCase (levelStr, LOG4CXX_STR (" INHERITED" ), LOG4CXX_STR (" inherited" ))
@@ -815,7 +820,7 @@ void DOMConfigurator::parseLevel(
815
820
816
821
if (LogLog::isDebugEnabled ())
817
822
{
818
- LogLog::debug (loggerName + LOG4CXX_STR (" level set to " ) +
823
+ LogLog::debug (LOG4CXX_STR ( " [ " ) + loggerName + LOG4CXX_STR (" ] level is " ) +
819
824
logger->getEffectiveLevel ()->toString ());
820
825
}
821
826
}
@@ -841,7 +846,6 @@ spi::ConfigurationStatus DOMConfigurator::doConfigure
841
846
)
842
847
{
843
848
m_priv->repository = repository ? repository : LogManager::getLoggerRepository ();
844
- m_priv->repository ->setConfigured (true );
845
849
846
850
#if LOG4CXX_ABI_VERSION <= 15
847
851
m_priv->loggerFactory = std::make_shared<DefaultLoggerFactory>();
@@ -856,15 +860,9 @@ spi::ConfigurationStatus DOMConfigurator::doConfigure
856
860
857
861
if (rv != APR_SUCCESS)
858
862
{
859
- // There is not technically an exception thrown here, but this behavior matches
860
- // what the PropertyConfigurator does
861
- IOException io (rv);
862
- LogString msg2 (LOG4CXX_STR (" Could not read configuration file [" ));
863
- msg2.append (filename.getPath ());
864
- msg2.append (LOG4CXX_STR (" ]. " ));
865
- LOG4CXX_DECODE_CHAR (msg, io.what ());
866
- msg2.append (msg);
867
- LogLog::error (msg2);
863
+ LogLog::error (LOG4CXX_STR (" Could not open configuration file [" )
864
+ + filename.getPath () + LOG4CXX_STR (" ]" )
865
+ , IOException (rv));
868
866
return spi::ConfigurationStatus::NotConfigured;
869
867
}
870
868
else
@@ -874,32 +872,32 @@ spi::ConfigurationStatus DOMConfigurator::doConfigure
874
872
875
873
if (LogLog::isDebugEnabled ())
876
874
{
877
- LogString debugMsg = LOG4CXX_STR (" Loading configuration file [" )
878
- + filename.getPath () + LOG4CXX_STR (" ]" );
879
- LogLog::debug (debugMsg);
875
+ LogLog::debug (LOG4CXX_STR (" Loading configuration file [" )
876
+ + filename.getPath () + LOG4CXX_STR (" ]" ));
880
877
}
881
878
882
879
rv = apr_xml_parse_file (p.getAPRPool (), &parser, &doc, fd, 2000 );
883
880
884
881
if (rv != APR_SUCCESS)
885
882
{
886
- char errbuf[2000 ];
887
- char errbufXML[2000 ];
888
- LogString msg2 (LOG4CXX_STR (" Error parsing file [" ));
889
- msg2.append (filename.getPath ());
890
- msg2.append (LOG4CXX_STR (" ], " ));
891
- apr_strerror (rv, errbuf, sizeof (errbuf));
892
- LOG4CXX_DECODE_CHAR (lerrbuf, std::string (errbuf));
893
- msg2.append (lerrbuf);
894
-
883
+ LogString reason;
895
884
if (parser)
896
885
{
897
- apr_xml_parser_geterror (parser, errbufXML, sizeof (errbufXML));
898
- LOG4CXX_DECODE_CHAR (lerrbufXML, std::string (errbufXML));
899
- msg2.append (lerrbufXML);
886
+ char errbuf[2000 ];
887
+ apr_xml_parser_geterror (parser, errbuf, sizeof (errbuf));
888
+ LOG4CXX_DECODE_CHAR (lsErrbuf, std::string (errbuf));
889
+ reason.append (lsErrbuf);
900
890
}
901
-
902
- LogLog::error (msg2);
891
+ else
892
+ {
893
+ char errbuf[2000 ];
894
+ apr_strerror (rv, errbuf, sizeof (errbuf));
895
+ LOG4CXX_DECODE_CHAR (lsErrbuf, std::string (errbuf));
896
+ reason.append (lsErrbuf);
897
+ }
898
+ LogLog::error (LOG4CXX_STR (" Error parsing file [" )
899
+ + filename.getPath () + LOG4CXX_STR (" ]" )
900
+ , RuntimeException (reason));
903
901
return spi::ConfigurationStatus::NotConfigured;
904
902
}
905
903
else
@@ -910,6 +908,15 @@ spi::ConfigurationStatus DOMConfigurator::doConfigure
910
908
}
911
909
}
912
910
911
+ if (!m_priv->appenderAdded )
912
+ {
913
+ LogLog::warn (LOG4CXX_STR (" [" ) + filename.getPath ()
914
+ + LOG4CXX_STR (" ] did not add an " ) + Appender::getStaticClass ().getName ()
915
+ + LOG4CXX_STR (" to a logger" ));
916
+ return spi::ConfigurationStatus::NotConfigured;
917
+ }
918
+
919
+ m_priv->repository ->setConfigured (true );
913
920
return spi::ConfigurationStatus::Configured;
914
921
}
915
922
@@ -1042,7 +1049,12 @@ void DOMConfigurator::parse(
1042
1049
}
1043
1050
else
1044
1051
{
1045
- LogLog::error (LOG4CXX_STR (" DOM element is - not a <configuration> element." ));
1052
+ LogString msg (LOG4CXX_STR (" Root element [" ));
1053
+ utf8Decoder->decode (element->name , MAX_ATTRIBUTE_NAME_LEN, msg);
1054
+ msg += LOG4CXX_STR (" ] is not [" );
1055
+ utf8Decoder->decode (CONFIGURATION_TAG, MAX_ATTRIBUTE_NAME_LEN, msg);
1056
+ msg += LOG4CXX_STR (" ]" );
1057
+ LogLog::error (msg);
1046
1058
return ;
1047
1059
}
1048
1060
}
@@ -1163,8 +1175,7 @@ LogString DOMConfigurator::getAttribute(
1163
1175
{
1164
1176
if (attrName == attr->name )
1165
1177
{
1166
- ByteBuffer buf ((char *) attr->value , strnlen_s (attr->value , MAX_ATTRIBUTE_NAME_LEN));
1167
- utf8Decoder->decode (buf, attrValue);
1178
+ utf8Decoder->decode (attr->value , MAX_ATTRIBUTE_NAME_LEN, attrValue);
1168
1179
}
1169
1180
}
1170
1181
0 commit comments