On Aug 16, 2013, at 8:38 PM, Gary Gregory wrote:

> On Fri, Aug 16, 2013 at 8:31 PM, Nick Williams 
> <[email protected]> wrote:
> Several inline comments.
> 
> On Aug 16, 2013, at 6:43 PM, Gary Gregory wrote:
> 
>> Make sure you can see the messages from the status logger, maybe there is an 
>> error processing the log4j config file early on.
> 
> There are no messages from the status logger.
> 
>> G
>> 
>> 
>> On Fri, Aug 16, 2013 at 7:38 PM, Remko Popma <[email protected]> wrote:
>> What is this " LoggingTest.cleanupClass:49 NullPointer" at the bottom of 
>> your list of errors? What does that do?
> 
> The NPE is coming from the method that cleans up after all the tests in the 
> class have run. I'm ignoring this error. It doesn't happen if the tests pass, 
> so obviously the problem is the tests, not the NPE in the cleanup method. 
> It's just a symptom of the test failures, not a symptom of the underlying 
> problem.
> 
>> 
>> 
>> On Sat, Aug 17, 2013 at 8:27 AM, Gary Gregory <[email protected]> wrote:
>> It's likely that MongoDB needs another jar on the CP.
> 
> Doesn't appear so. Otherwise MongoException would be found BUT one of its 
> dependencies would trigger a NoClassDefFoundError. Plus, I've looked through 
> the code. The only dependencies that it has that aren't in the same JAR are 
> dependencies that com.mongodb.DB also has. So therefore they aren't the cause 
> of the problem, or it would fail even without my new code.
> 
> Here is the entire stack trace of one of the failures. They all look 
> identical to this, minus different test names / methods that they call.
> 
> testTraceWithException(org.apache.log4j.LoggerTest)  Time elapsed: 0.137 sec  
> <<< ERROR!
> java.lang.NoClassDefFoundError: com/mongodb/MongoException
>       at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
>       at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
>       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
>       at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
>       at java.lang.Class.forName0(Native Method)
>       at java.lang.Class.forName(Class.java:171)
>       at 
> org.apache.logging.log4j.core.config.plugins.PluginManager.decode(PluginManager.java:232)
>       at 
> org.apache.logging.log4j.core.config.plugins.PluginManager.collectPlugins(PluginManager.java:151)
>       at 
> org.apache.logging.log4j.core.config.plugins.PluginManager.collectPlugins(PluginManager.java:129)
>       at 
> org.apache.logging.log4j.core.pattern.PatternParser.<init>(PatternParser.java:116)
>       at 
> org.apache.logging.log4j.core.pattern.PatternParser.<init>(PatternParser.java:102)
>       at 
> org.apache.logging.log4j.core.layout.PatternLayout.createPatternParser(PatternLayout.java:183)
>       at 
> org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:115)
>       at 
> org.apache.logging.log4j.core.layout.PatternLayout.createLayout(PatternLayout.java:218)
>       at 
> org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:51)
>       at 
> org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:63)
>       at 
> org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:204)
>       at 
> org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:101)
>       at 
> org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:67)
>       at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:83)
>       at 
> org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:34)
>       at org.apache.logging.log4j.LogManager.getContext(LogManager.java:200)
>       at org.apache.log4j.Logger$PrivateManager.getContext(Logger.java:61)
>       at org.apache.log4j.Logger.getRootLogger(Logger.java:47)
>       at 
> org.apache.log4j.LoggerTest.testTraceWithException(LoggerTest.java:415)
> 
> Is this run from an IDE or from the command line with Maven? Do both fail the 
> same?
> 
> Gary

This is run from the command line. I always build using `mvn test` or `mvn 
site` (depending on my needs at the moment). I never compile/test from my IDE. 
I still haven't quite got the classpath right (IntelliJ imports all the 
dependencies, but it does something wrong with them insofar as their scope, for 
which I have filed an IntelliJ bug), so I can't compile all/test all from my 
IDE.

Nick

>  
> 
>> 
>> G
>> 
>> 
>> On Fri, Aug 16, 2013 at 6:48 PM, Nick Williams 
>> <[email protected]> wrote:
>> Guys, I'm having a hard time with this simple fix that should have taken 
>> five minutes. I'm getting test failures due to NoClassDefFoundErrors that 
>> shouldn't happen.
>> 
>> Here are the tests in error:
>>   CategoryTest.setupClass:52 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testTraceWithException:415 ? NoClassDefFound 
>> com/mongodb/MongoExcep...
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testLog:459 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testRB1:295 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testRB2:314 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testRB3:334 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testTrace:388 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testAdditivity1:119 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testAdditivity2:144 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testAdditivity3:183 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testIsTraceEnabled:443 ? NoClassDefFound 
>> com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.testExists:355 ? NoClassDefFound com/mongodb/MongoException
>>   LoggerTest.tearDown:75 ? NoClassDefFound com/mongodb/MongoException
>>   LoggingTest.setupClass:44 ? NoClassDefFound com/mongodb/MongoException
>>   LoggingTest.cleanupClass:49 NullPointer
>> 
>> Here's the code I added:
>> 
>>                 try {
>>                     if (!database.authenticate(username, 
>> password.toCharArray())) {
>>                         LOGGER.error("Failed to authenticate against MongoDB 
>> server. Unknown error.");
>>                     }
>>                 } catch (MongoException e) {
>>                     LOGGER.error("Failed to authenticate against MongoDB: " 
>> + e.getMessage(), e);
>>                 } catch (IllegalStateException e) {
>>                     LOGGER.error("Factory-supplied MongoDB database 
>> connection already authenticated with different" +
>>                             "credentials but lost connection.");
>>                 }
>> 
>> Problem is, "database" is an instance of com.mongodb.DB, which is in the 
>> same JAR as com.mongodb.MongoException. If I remove this code, the tests 
>> pass. How is this possible? The DB instance is there with or without this 
>> new code, which means the JAR is on the classpath, which means 
>> MongoException should be on the classpath.
>> 
>> Very confused...
>> 
>> Nick
>> 
>> On Aug 16, 2013, at 5:13 PM, Gary Gregory wrote:
>> 
>>> Thank you for the update Nick!
>>> :)
>>> Gary
>>> 
>>> 
>>> On Fri, Aug 16, 2013 at 5:39 PM, Nick Williams 
>>> <[email protected]> wrote:
>>> Answers inline.
>>> 
>>> On Aug 14, 2013, at 2:10 AM, YuCheng Ting wrote:
>>> 
>>>> Hi all,
>>>> 
>>>> I use beta8 log4j2 and wrote log4j2.xml like example in document 
>>>> (http://logging.apache.org/log4j/2.x/manual/appenders.html#NoSQLAppender ):
>>>> 
>>>> 
>>>> <appenders>
>>>>     <NoSql name="databaseAppender">
>>>>         <MongoDb databaseName="applicationDb" 
>>>> collectionName="applicationLog"
>>>>             server="mongo.example.org"
>>>>             username="loggingUser" password="abc123" />
>>>>     </NoSql>
>>>> </appenders>
>>> 
>>> Yep. That's correct.
>>> 
>>>> but I get the two exception:
>>>> 
>>>> 1, "can't serialize class org.apache.logging.log4j.Level" exception in 
>>>> (BasicBSONEncoder.java:270), I read the code and add follow code in my 
>>>> project before logging, it gone.
>>>> 
>>>>         BSON.addEncodingHook(org.apache.logging.log4j.Level.class, new 
>>>> Transformer() {
>>>>             @Override
>>>>             public Object transform(Object o) {
>>>>                 return o.toString();
>>>>             }
>>>>         });
>>> 
>>> This bug was reported and fixed a few weeks ago. The fix will be in the 
>>> next version, or you can compile locally. 
>>> https://issues.apache.org/jira/browse/LOG4J2-330
>>> 
>>>> 2, “not authorized for insert test.log”, because my MongoDB need auth to 
>>>> write, but the the "username" and "password" attributes in log4j2.xml is 
>>>> nearly useless, after I read source code, found it NOT auth in 
>>>> 
>>>> org.apache.logging.log4j.core.appender.db.nosql.mongo.MongoDBProvider.createNoSQLProvider
>>>> source code line 181 after check username and password and 
>>>> com.mongodb.DB.authenticate never be called.
>>> 
>>> This is a bug. I'm reporting it and fixing it now. The fix will be in the 
>>> next version, or you can compile locally (after I get the change committed, 
>>> of course).
>>> 
>>>> so I change log4j2.xml :
>>>> 
>>>> <NoSql name="mongodb">
>>>>              <MongoDb collectionName="log" databaseName="test"
>>>>                          factoryClassName="com.yuchs.test.log4j.MainTest"
>>>>                         factoryMethodName="getMongoClient" />
>>>> </NoSql>
>>>> 
>>>> and create MongoClient and call com.mongodb.DB.authenticate method in 
>>>> com.yuchs.test.log4j.MainTest.getMongoClient.
>>>> 
>>>> 
>>>> This is my question:
>>>> 
>>>> 1, Why not add BSON.addEncodingHook code into log4j2 project to avoid 
>>>> basic exception ? or another rule of method I don't know ?
>>>> 
>>>> 2, Why not auth DB in log4j2 project if password and username is set in 
>>>> log4j2.xml ? or another rule of method I don't know ?
>>>> 
>>>> Thanks everyone!
>>>> 
>>> 
>>> 
>>> 
>>> 
>>> -- 
>>> E-Mail: [email protected] | [email protected] 
>>> Java Persistence with Hibernate, Second Edition
>>> JUnit in Action, Second Edition
>>> Spring Batch in Action
>>> Blog: http://garygregory.wordpress.com 
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>> 
>> 
>> 
>> 
>> -- 
>> E-Mail: [email protected] | [email protected] 
>> Java Persistence with Hibernate, Second Edition
>> JUnit in Action, Second Edition
>> Spring Batch in Action
>> Blog: http://garygregory.wordpress.com 
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>> 
>> 
>> 
>> 
>> -- 
>> E-Mail: [email protected] | [email protected] 
>> Java Persistence with Hibernate, Second Edition
>> JUnit in Action, Second Edition
>> Spring Batch in Action
>> Blog: http://garygregory.wordpress.com 
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
> 
> 
> 
> 
> -- 
> E-Mail: [email protected] | [email protected] 
> Java Persistence with Hibernate, Second Edition
> JUnit in Action, Second Edition
> Spring Batch in Action
> Blog: http://garygregory.wordpress.com 
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory

Reply via email to