Oughtn't there be an option to have logging for developers? If you'd like to use it, feel free; if not, don't. Including log4j (or slf or commons-logging, so on) doesn't add too much weight to the jar -- one file, a small properties file, and 4-lines in the pom file. If there is interest, I can submit a patch adding log4j and log4j.properties to JIRA. Let me know? -- H
On 25 September 2015 at 16:26, Gilles <gil...@harfang.homelinux.org> wrote: > On Fri, 25 Sep 2015 13:06:43 -0700, Phil Steitz wrote: > > I say something like: "I had to fork some CM class to insert > log statements." > You say something like: "No, you don't; write test or inspect > the code." > > You had been more constructive: > http://markmail.org/thread/a5jl6fkjjtm5qbsw > > Even if Ole may have picked the wrong example with Tomcat, the > actual request is to be able to follow the execution of a fairly > complex algorithm, like an optimizer, when applied to a fairly > complex user's code, in order to figure out whether there is a > problem; and if so, where it is (in the user's model, in the > call, in the optimizer, whether there is a mismatch between the > user's expectations and the capability of the selected algorithm, > etc.) > > Ole's first example with an excerpt of the Levenberg-Marquardt > implementation is actually a hit: a few years ago, a bug was found > somewhere right around that same code: > https://issues.apache.org/jira/browse/MATH-406 > It's an example where logging is a valuable help in debugging. > Another is the poor man's logging fiddling to track the cause of > the erratic behaviour of one of the CI machines. > > Gilles > > > On 9/25/15 11:01 AM, Ole Ersoy wrote: >> >>> >>> >>> On 09/25/2015 11:34 AM, Phil Steitz wrote: >>> >>>> I disagree. Good tests, API contracts, exception management and >>>> documentation can and should eliminate the need for cluttering >>>> low-level library code with debug logging. >>>> >>> >>> Logging could be viewed as clutter. Constructed the right way, >>> the logging statements could also be viewed as comments. >>> >>> I agree that good tests, API contracts, and in general keeping the >>> design as minimalistic and simple as possible should be the first >>> criteria to review before introducing logging. When the code is >>> trivial I leave logging out, unless I need to put in a few >>> statements in order to track collaboration between components in >>> an algorithm. >>> Other times the method is as simple as it gets and I have to have >>> logging. For example take the LevenbergMarquardtOptimizer >>> optimize() method. It's atomic in the sense that what's in the >>> method belongs in the method. There are several loops within the >>> main loop, etc. and tracking what's going, even with a observer >>> being notified on each increment, would be far from elegant. >>> >> >> Why, exactly do you need to "track what is going on?" If you need >> to do that as a user of the code, some kind of listener or API to >> give you the information that you need is appropriate. Dumping text >> to an external resource to "solve" this usually indicates smelliness >> somewhere - either in the library API or the client code. >> >> >>> For example perhaps we want to see what's going on with the >>> parameters in this small (5% of the method size) section of code: >>> >> >> What parameters and where did they come from? If from the client, >> the client can validate them. If the library needs to validate or >> confirm suitability, then it should do that in code or via tests. >> >>> >>> // compute the scaled predicted reduction >>> // and the scaled directional derivative >>> for (int j = 0; j < solvedCols; ++j) { >>> int pj = permutation[j]; >>> double dirJ = lmDir[pj]; >>> work1[j] = 0; >>> for (int i = 0; i <= j; ++i) { >>> work1[i] += weightedJacobian[i][pj] * dirJ; >>> } >>> } >>> >>> If there is something wrong with this in production, the shortest >>> path to figuring that out is reviewing a trace. The longer path >>> is to stop the server. Grab the data. Open up a debugger. Run >>> the data. >>> >>> If we wanted to observe this section of code the observer would be >>> looking at sub loops of of the optimize method. So that's doable, >>> but it creates an interface design for the observer that's >>> cluttered with events corresponding to various low level algorithm >>> details. >>> >>> >>> Several times, I've been obliged to create a modified version of CM >>>>> to introduce "print" statements (poor man's logging!) in order to >>>>> figure out why my code did not do what it was supposed to. >>>>> >>>> >>> It's pretty tragic that anyone of us should have to do this. It's >>> also wasteful, because if Gilles has to do this, then there's a >>> good chance that others have to do it to. The reason Tomcat logs >>> at various levels is so that we can see what's going on in >>> production and track down bugs. >>> >> >> No. Have a look at the Tomcat logging code. It is mostly >> initialization, shutdown and exceptions or warnings. This is >> necessary because tomcat is a container - there is no client >> application to catch exceptions or get API results back. The analog >> for the kind of instrumentation you are proposing inside [math] >> would be like tomcat larding itself up with debug logging throughout >> the request processing lifecycle, which it does not do. It is a >> bad analogy in any case, because Tomcat is a container, which is 2 >> big steps up the processing chain from a low-level library. >> >> Phil >> >> Lets become one with the logging and make it into something that >>> strengthens both code integrity and comprehensibility. Everyone >>> take take out your Feng Shui mat and do some deep breathing right >>> now. >>> >>> Here again, tests, good design, code inspection are the way to go in >>>> low-level components. I have also spent a lot of time researching >>>> bugs in [math], other Commons components and other complex systems. >>>> My experience is a little different: excessive logging / debug code >>>> for code that contains it often just tends to get in the way, >>>> >>> It's a very good point. Sometimes we come across logging >>> statements that are just noise. Given how rigorous we are about >>> reviewing everything though, I think a win win would be to limit >>> the noise during code review, and pledge not to "Call our mom" in >>> the middle of the code, etc. >>> >>> especially after it has rotted a bit. Rather than adding more code >>>> to maintain so that you can have less conceptual control over the >>>> functional code, it is better, IMNSHO, to focus on making the >>>> functional code as simple as possible with clean well-documented, >>>> test-validated API contracts. >>>> >>> >>> Totally agree. I think this should be the first priority, and >>> that logging should be used when there are no simple clean >>> alternatives. >>> >>> >>>> It also makes a code easier to debug while developing or >>>>> modifying it >>>>> (without resorting to poor man's logging, then deleting the >>>>> "print", >>>>> then reinstating them, then deleting them again, ad nauseam). >>>>> >>>> Pretty sure we have all been here. >>> >>> Cheers, >>> - Ole >>> >>> >>> >>>>> Gilles >>>>> >>>>> [1] No quality or complexity judgment implied. >>>>> >>>>> Phil >>>>>> >>>>>>> >>>>>>> Gilles >>>>>>> >>>>>>> Thomas >>>>>>>> >>>>>>>> >>>>>>>> On Fri, Sep 25, 2015 at 3:17 PM, Ole Ersoy <ole.er...@gmail.com> >>>>>>>> wrote: >>>>>>>> >>>>>>>> Hello, >>>>>>>>> >>>>>>>>> We have been discussing various ways to view what's happening >>>>>>>>> internally >>>>>>>>> with algorithms, and the topic of including SLF4J has come up. >>>>>>>>> I know that >>>>>>>>> this was discussed earlier and it was decided that CM is a low >>>>>>>>> level >>>>>>>>> dependency, therefore it should minimize the transitive >>>>>>>>> dependencies that >>>>>>>>> it introduces. The Java community has adopted many means of >>>>>>>>> dealing with >>>>>>>>> potential logging conflicts, so I'm requesting that we use >>>>>>>>> SLF4J >>>>>>>>> for >>>>>>>>> logging. >>>>>>>>> >>>>>>>>> I know that JBoss introduced its own logging system, and this >>>>>>>>> made me a >>>>>>>>> bit nervous about this suggestion, so I looked up strategies >>>>>>>>> for >>>>>>>>> switching >>>>>>>>> their logger out with SLF4J: >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> http://stackoverflow.com/questions/14733369/force-jboss-logging-to-use-of-slf4j >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> The general process I go through when working with many >>>>>>>>> dependencies that >>>>>>>>> might use commons-logging instead of SLF4J looks something like >>>>>>>>> this: >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> http://stackoverflow.com/questions/8921382/maven-slf4j-version-conflict-when-using-two-different-dependencies-that-requi >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> With JDK9 individual modules can define their own isolated >>>>>>>>> set of >>>>>>>>> dependencies. At this point the fix should be a permanent. If >>>>>>>>> someone has >>>>>>>>> has a very intricate scenario that we have not yet seen, they >>>>>>>>> could use >>>>>>>>> (And probably should use) OSGi to isolate dependencies. >>>>>>>>> >>>>>>>>> WDYT? >>>>>>>>> >>>>>>>>> Cheers, >>>>>>>>> - Ole >>>>>>>>> >>>>>>>> >>>>> >>>>> --------------------------------------------------------------------- >>>>> >>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>> >>>>> . >>>>> >>>>> >>>> >>>> >>>> --------------------------------------------------------------------- >>>> >>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>> >>>> >>>> >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>> For additional commands, e-mail: dev-h...@commons.apache.org >>> >>> >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> For additional commands, e-mail: dev-h...@commons.apache.org >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > > -- OpenPGP: https://hasan.d8u.us/gpg.key Sent from my mobile device Envoyé de mon portable