Hi folks,

as far as I understand the mail thread (while not being a Commons Math 
developer)

* logging could be helpful but it could be argued/reasoned that logging is not 
required for an utility package 
* there is no perfect logging framework for all use-cases and deployments
* Apache Commons strive for minimal dependencies

One thing I did in the past is to add a dummy singleton logger implementation 
which can be replaced by the user of the library 

* The dummy implementation will do nothing
* Adding another level of indirection will not win a software engineering award
* Having a singleton could be an issue if multiple parties within the deployed 
application is using Commons Math
* Replacing the dummy logging stub with you logging framework of choice is a 
bit tedious 

In other words - it is not beautiful implementation but could be reasonable 
work-around to make our two camps happy (or both unhappy)

Cheers,

Siegfried Goeschl


> On 27 Sep 2015, at 04:05, Romain Manni-Bucau <rmannibu...@gmail.com> wrote:
> 
> Le 26 sept. 2015 15:19, "Ralph Goers" <ralph.go...@dslextreme.com> a écrit :
>> 
>> Romain,
>> 
>> Choosing JUL for a framework does a HUGE disservice to the users of your
> framework. JUL is by far the worst logging framework design of anything you
> could choose. It is like the JDK designers purposely chose to use a
> mechanism to map their API to another implementation that really doesn’t
> work.  SLF4J handles this by not bypassing it and using a JUL handler to
> map everything into it, and then uses an “interesting” scheme to try to
> make that perform well. Log4j tries to use the method documented by JUL but
> it has a few problems.
>> 
> 
> It is contextual, slf4j with its classloader handling is the worse for
> other users...all analyzis lead to a really "common" lib shouldnt rely on
> any logging API IMHO.
> 
>> Ralph
>> 
>>> On Sep 26, 2015, at 12:49 PM, Romain Manni-Bucau <rmannibu...@gmail.com>
> wrote:
>>> 
>>> Le 26 sept. 2015 12:07, "Luc Maisonobe" <l...@spaceroots.org <mailto:
> l...@spaceroots.org>> a écrit :
>>>> 
>>>> Le 26/09/2015 20:59, Ralph Goers a écrit :
>>>>> I don’t normally participate in Math but I do feel the need to stick
> my
>>> nose in here.
>>>>> 1. You are absolutely correct to determine whether you need logging at
>>> all before discussing what to choose.
>>>>> 2. If you do decide logging is required:
>>>>> a. Please stay away from java.util.logging. It really would be the
>>> best solution for a framework like math except it is extremely
> difficult to
>>> redirect efficiently to some other logging framework. The methods used
> by
>>> SLF4J and Log4j are imperfect to say the least.
>>>>> b. Log4j 1.x has reached eol. It effectively has not been supported
>>> for 5 years.
>>>>> c. Log4j 2 has an API that can be redirected to another logging
>>> framework if desired.
>>>>> d. Commons logging still works but its API is very primitive by
>>> todays standards. That said, it does work.
>>>> 
>>>> From what I have seen, if I ever were to choose a logging framework for
>>>> any project, I agree log4j 2 is currently the best choice. I was
>>>> impressed by slf4j a few years ago, but think now the step further is
>>>> log4j 2 (without any accurate reason, just a rough feeling).
>>>> 
>>> 
>>> And in 2 years foolog4j will be better. JUL is not perfect for sure but
>>> ensures:
>>> - no dep
>>> - always usable
>>> - allows to let the user integrate with the lib without having to fork
> it
>>> to get rid of a logging dep - think to tomee which consumes N commons
> deps,
>>> if all uses a different logging framework it is worse to configure and
>>> highly inconsistent - that is why we chose jul by default
>>> 
>>> That is for the logging framework choice.
>>> Now commons shouldnt log much IMO otherwise it would start to loose
> commons
>>> in sense of shareable component cause of the integration issues it
>>> generates in the final application.
>>> 
>>> - Romain
>>> 
>>>> best regards,
>>>> Luc
>>>> 
>>>>> 
>>>>> Ralph
>>>>> 
>>>>> 
>>>>>> On Sep 26, 2015, at 10:07 AM, Luc Maisonobe <l...@spaceroots.org>
> wrote:
>>>>>> 
>>>>>> Le 26/09/2015 18:42, Gilles a écrit :
>>>>>>> On Sat, 26 Sep 2015 09:03:06 -0700, Phil Steitz wrote:
>>>>>>>> On 9/26/15 4:56 AM, Thomas Neidhart wrote:
>>>>>>>>> On 09/26/2015 01:11 PM, Gilles wrote:
>>>>>>>>>> On Sat, 26 Sep 2015 09:53:30 +0200, Thomas Neidhart wrote:
>>>>>>>>>>> On 09/26/2015 02:33 AM, Gilles wrote:
>>>>>>>>>>>> On Fri, 25 Sep 2015 16:52:26 -0700, Hasan Diwan wrote:
>>>>>>>>>>>>> On 25 September 2015 at 16:47, Gilles <
>>> gil...@harfang.homelinux.org>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On Fri, 25 Sep 2015 17:30:33 +0200, Thomas Neidhart wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> On Fri, Sep 25, 2015 at 5:09 PM, Gilles
>>>>>>>>>>>>>>> <gil...@harfang.homelinux.org>
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> On Fri, 25 Sep 2015 07:28:48 -0700, Phil Steitz wrote:
>>>>>>>>>>>>>>>> On 9/25/15 7:03 AM, Gilles wrote:
>>>>>>>>>>>>>>>>> On Fri, 25 Sep 2015 15:54:14 +0200, Thomas Neidhart wrote:
>>>>>>>>>>>>>>>>>> Hi Ole,
>>>>>>>>>>>>>>>>>>> for a start, I think you are asking the wrong question.
>>>>>>>>>>>>>>>>>>> First of all we need to agree that we want to add some
>>> kind of
>>>>>>>>>>>>>>>>>>> logging
>>>>>>>>>>>>>>>>>>> facility to CM.
>>>>>>>>>>>>>>>>>>> If the outcome is positive, there are a handful of
>>>>>>>>>>>>>>>>>>> alternatives,
>>>>>>>>>>>>>>>>>>> some of
>>>>>>>>>>>>>>>>>>> them more viable than slf4j in the context of CM (e.g.
>>> JUL or
>>>>>>>>>>>>>>>>>>> commons-logging).
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Could someone summarize why those alternatives were
> deemed
>>>>>>>>>>>>>>>>>> "more
>>>>>>>>>>>>>>>>>> viable"?
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> btw. the same discussion has been done for other commons
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> components as
>>>>>>>>>>>>>>>>>>> well, and the result usually was: do not add logging
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> What was the rationale?
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Look at the archives.  We have discussed this multiple
> times
>>>>>>>>>>>>>>>>> in the
>>>>>>>>>>>>>>>>> past in [math] and each time came to the conclusion that
>>> Thomas
>>>>>>>>>>>>>>>>> succinctly states above.  What has changed now?
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> We also discussed several times to stick with Java 5.
>>>>>>>>>>>>>>>> Fortunately, that has changed. [Although sticking with Java
>>> 7 is
>>>>>>>>>>>>>>>> still
>>>>>>>>>>>>>>>> a bad decision IMHO.]
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> As for logging, IIRC, the sole argument was "no dependency"
>>>>>>>>>>>>>>>> because
>>>>>>>>>>>>>>>> (IIRC) of the potential "JAR hell".
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> that's not correct. The decision to not include any
>>>>>>>>>>>>>>> dependencies has
>>>>>>>>>>>>>>> nothing to do with "JAR hell".
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Although I can't find it now, I'm pretty sure that I more
> than
>>> once
>>>>>>>>>>>>>> got such an answer.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> In order to prevent JAR hell, commons components strictly
> stick
>>>>>>>>>>>>>> to the
>>>>>>>>>>>>>>> "Versioning guidelines" [1]
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I can't see how it relates.
>>>>>>>>>>>>>> But if you mean that no JAR hell can emerge from using a
>>> logging
>>>>>>>>>>>>>> framework,
>>>>>>>>>>>>>> then that's good news.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> The no-dependency rule is more related to the proposal of the
>>>>>>>>>>>>>> component,
>>>>>>>>>>>>>>> see [2]
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Thanks for the reminder; in that document, we read:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> (1) Scope of the Package
>>>>>>>>>>>>>> [...]
>>>>>>>>>>>>>> 5. Limited dependencies. No external dependencies beyond
>>> Commons
>>>>>>>>>>>>>> components and the JDK
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> So we are fine if use "Log4j 2" as kindly offered by Gary.
>>>>>>>>>>> log4j is not a commons component btw.
>>>>>>>>>> Too bad for me. :-/
>>>>>>>>>> Case resolved, then, by the argument of authority?
>>>>>>>>> I just pointed out that log4j is not a commons component and did
> not
>>>>>>>>> imply anything else.
>>>>>>>>> 
>>>>>>>>>> "Commons" is OK but not another Apache project, by virtue of a
>>>>>>>>>> document that still refers to "JDK 1.2", "CVS", "Bugzilla" (not
> to
>>>>>>>>>> mention that the "scope" of CM currently goes well beyond "the
> most
>>>>>>>>>> common practical problems not immediately available in the Java
>>>>>>>>>> programming language")...
>>>>>>>>>> 
>>>>>>>>>> What's the _technical_ rationale for accepting this dependency
> and
>>>>>>>>>> not accepting that dependency?
>>>>>>>>>> 
>>>>>>>>>>> I have not seen a single example of a useful logging message
> that
>>>>>>>>>>> could
>>>>>>>>>>> be added to commons-math, but we are already discussing which
>>>>>>>>>>> framework
>>>>>>>>>>> to use.
>>>>>>>>>> If it is not useful to you, why would you conclude that it is not
>>>>>>>>>> useful to others?
>>>>>>>>>> 
>>>>>>>>>> At the cost of repeating myself, once more, the use-case is not
>>>>>>>>>> primarily about debugging CM, but sometimes one could need to
>>> assess
>>>>>>>>>> how a "non-obvious" CM algorithm responds to an application's
>>> request.
>>>>>>>>>> I've clearly expressed that use-case in a previous message.
>>>>>>>>>> 
>>>>>>>>>> Another example: I have a class that wraps a CM root solver; it
> is
>>>>>>>>>> stuffed with log statements because the message contained in the
>>>>>>>>>> "NoBracketingException" was utterly insufficient (and plainly
>>>>>>>>>> misleading due the default formatting of numbers) to figure out
> why
>>>>>>>>>> certain calls succeeded and others not.
>>>>>>>>>> It's a problem (or a limitation) in the application, but in the
>>>>>>>>>> absence of other clues, tracing the solver could help figure out
> a
>>>>>>>>>> workaround.
>>>>>>>>>> The alternative to the "logging" approach, would have been to
>>> include
>>>>>>>>>> a precondition check before calling the solver, that would in
>>> effect
>>>>>>>>>> duplicate the bracketing check done inside the solver. Given the
>>> vast
>>>>>>>>>> amount of cases where the code ran smoothly, this is clearly a
>>>>>>>>>> sub-optimal solution as compared to turning logging on and rerun
>>> the
>>>>>>>>>> case that led to a crash.
>>>>>>>>>> 
>>>>>>>>>> What can I say more about the usefulness (for a "low-tech" person
>>>>>>>>>> like me) than the intro here:
>>>>>>>>>> http://logging.apache.org/log4j/2.x/manual/index.html
>>>>>>>>>> ?
>>>>>>>>>> 
>>>>>>>>>>> The examples with println debugging are not valid imho, because
>>> how do
>>>>>>>>>>> you know in advance what you will need to log in order to
>>> successfully
>>>>>>>>>>> debug some piece of code and such low-level information should
>>> not be
>>>>>>>>>>> captured in logs anyway.
>>>>>>>>>> Why are there several log levels?  Low-level info can be routed
> to
>>>>>>>>>> "DEBUG" or "TRACE".
>>>>>>>>>> As Ole put it quite eloquently, logging is a safety net that we
>>> hope
>>>>>>>>>> we'll never need, until we do.
>>>>>>>>>> 
>>>>>>>>>> Each layer of an application has its own notion of what is the
>>>>>>>>>> appropriate log level. What is "INFO" for some low-level library
>>>>>>>>>> will very probably not be so for most applications that use the
>>>>>>>>>> library.
>>>>>>>>>> Setting levels per package or class takes care of that: it's the
>>>>>>>>>> library's *user* who chooses what is useful in the current
>>> situation,
>>>>>>>>>> not the library's developer.
>>>>>>>>>> In the context of that asynchronous collaboration, the role of
> the
>>>>>>>>>> library's developer is to carefully choose what *could* be
>>>>>>>>>> interesting, if the need should arise.
>>>>>>>>>> 
>>>>>>>>>> So, can we eventually discuss the _technical_ arguments against
>>>>>>>>>> logging inside CM, rather than personal opinion?
>>>>>>>>> again, what I want to see is an example what *should* be logged in
>>> the
>>>>>>>>> case of an algorithm. Take the LevenbergMarquardtOptimizer as an
>>>>>>>>> example:
>>>>>>>>> 
>>>>>>>>> * what did you log using System.out.println()?
>>>>>>>>> * the algo computes a lot of internal data, which of these is
>>>>>>>>> interesting for debugging problems or for general logging?
>>>>>>>>> * there are various branches the algo can take, are just some
>>>>>>>>> interesting to log, or all of them?
>>>>>>>>> 
>>>>>>>>> the use-cases presented so far were mainly about debugging
> specific
>>>>>>>>> problems, and I am *strongly* against adding logging information
>>> just
>>>>>>>>> for this purpose as you are clearly facing a dilemma here:
>>>>>>>>> 
>>>>>>>>> you have to log *everything* an algo does as otherwise you might
>>> miss
>>>>>>>>> the part that creates problems
>>>>>>>>> 
>>>>>>>>> but logging everything is not useful for a standard user of the
>>> library
>>>>>>>>> so it contradicts the original proposal to include logging
>>>>>>>>> 
>>>>>>>>> Again, CM is not an application where you need to log what it is
>>> doing,
>>>>>>>>> but a bunch of algorithms and utility methods to perform certain
>>>>>>>>> calculations. I fail to see the need to add logging. What could be
>>>>>>>>> useful, and we had requests like that in the past, is to observe
> the
>>>>>>>>> state of a certain algorithm and to decide how to proceed in
> certain
>>>>>>>>> cases.
>>>>>>>>> 
>>>>>>>>> That is useful for users.
>>>>>>>>> 
>>>>>>>>> Another useful addition would be to add more aggressive
> assertions.
>>> If
>>>>>>>>> one user encounters a problem, he/she could run the application
> with
>>>>>>>>> assertions enabled and spot potential problems e.g. due to wrong
>>> input.
>>>>>>>>> 
>>>>>>>>> Logging is a solution for a non existing problem imho.
>>>>>>>>> Logging will not avoid the need to debug CM in case of problems
>>> imho.
>>>>>>>> 
>>>>>>>> +1
>>>>>>>> The other thing I would add is that the one place where it does
> make
>>>>>>>> sense to dump text is in exception error messages, which is a place
>>>>>>>> where I think we could really improve things.  Fortunately, that is
>>>>>>>> fairly easily done.
>>>>>>>> 
>>>>>>>> I have seen nothing in this thread to convince me that adding
>>>>>>>> logging in [math] will be net positive for either those of us who
>>>>>>>> maintain the component or for users.  If we are not providing clear
>>>>>>>> exception error messages and/or APIs (with complete documentation)
>>>>>>>> so that users can understand what they need to debug their
>>>>>>>> applications, then we should focus on solving those problems.
>>>>>>>> 
>>>>>>>> Phil
>>>>>>> 
>>>>>>> First, you carefully do not reply to any of the concrete arguments
>>>>>>> given in this thread, second you give a conclusion to an issue not
>>>>>>> reported in this thread: exceptions and logging do not provide the
>>>>>>> same service.
>>>>>>> 
>>>>>>> At least, I'd wish that people sharing their own opinion (it's
>>>>>>> nothing more since _zero_ technical argument against logging have
>>>>>>> been put forth) stop taking the collective "users" on their side.
>>>>>>> As for *actual* users/maintainers, Ole and I have a need, while
>>>>>>> Thomas and you haven't.  Those are all the facts that exist until
>>>>>>> now.
>>>>>>> 
>>>>>>> In such a situation, what do we do as a project; maintain the status
>>>>>>> quo, or try for a change?
>>>>>>> On numerous occasions over the years, the status quo was enforced;
>>>>>>> and I don't see that it benefited the project in terms of new
>>>>>>> contributors.
>>>>>>> So I'm +1 for trying to change, for a change.
>>>>>> 
>>>>>> I think one thing has been written in this thread that is worth
>>>>>> noting and could be an intermediate position.
>>>>>> 
>>>>>> It seems to me one place where we could get some useful information,
>>>>>> and provide it to users is for iterative algorithms (both optimizers
>>>>>> and solvers have already been mentioned, we could add ode integrators
>>>>>> as well to this). For such algorithms, having some way to monitor how
>>>>>> the iterations perform seem an improvement. An observer pattern as
>>>>>> proposed a few days ago for this kind of algorithms would be fine.
>>>>>> Once again, something simple and that does not attempt to be hyper
>>>>>> generic but rather taylored to the algorithms (i.e. most probably
>>>>>> different observer interfaces for different algorithms types).
>>>>>> 
>>>>>> This intermediate position would provide something to both users
>>>>>> and developers, and it would not attempt to log everything and
>>>>>> add a dependency (I am probably the one who opposed to logging on
>>>>>> the grounds of dependencies).
>>>>>> 
>>>>>> best regards,
>>>>>> Luc
>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> Gilles
>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Thomas
>>>>>>>>> 
>>>>>>>>>>>>>> My long-standing mentioning of slf4j was only because of its
>>>>>>>>>>>>>> "weightlessness" (thanks to the no-op implementation of its
>>> API).
>>>>>>>>>>>>>> If "Log4j 2" has followed this path, good for everyone.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> No objection, then?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I'm still not clear what log4j 2 adds -- most Apache java
>>> projects
>>>>>>>>>>>>> seem to
>>>>>>>>>>>>> use log4j 1.2, seems to work well. -- H
>>>>>>>>>>>>> 
>>>>>>>>>>>> I can only answer about "slf4j" where the "f" stands for
> facade:
>>> it's
>>>>>>>>>>>> "only"
>>>>>>>>>>>> an API, with bridges to several logging frameworks (log4j,
>>> logback,
>>>>>>>>>>>> etc.).
>>>>>>>>>>>> 
>>>>>>>>>>>> The separation of concerns (API vs one of several
>>> implementations to
>>>>>>>>>>>> choose from)
>>>>>>>>>>>> allows the top-level application to uniformly configure logging
>>> or to
>>>>>>>>>>>> disable it
>>>>>>>>>>>> completely (if choosing the "no-op" implementation).
>>>>>>>>>>> That is virtually true for all logging frameworks, including
>>> log4j,
>>>>>>>>>>> slf4j, commons-logging.
>>>>>>>>>> Has it always been true?
>>>>>>>>>> I'm certainly no expert; I only try to stay clear of tools about
>>> which
>>>>>>>>>> people complain a lot.  A few years ago, that was the case of jcl
>>> and
>>>>>>>>>> jul as compared to slf4j.
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Gilles
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>> ---------------------------------------------------------------------
>>>>>>>>>> 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 <mailto:
>>> dev-unsubscr...@commons.apache.org>
>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org <mailto:
>>> 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

Reply via email to