On 13 August 2018 at 14:57, Remko Popma <remko.po...@gmail.com> wrote:
> If it was up to me I would use JUL in this particular case to keep the 
> library free of dependencies. JUL is reasonable since performance is not an 
> issue.
>
> Users that use a logging framework can redirect the JUL logging into their 
> log file with the JUL adapter of their logging library.
>
> But that’s just me.

+1, seems good to me as well.

> Remko
>
> (Shameless plug) Every java main() method deserves http://picocli.info
>
>> On Aug 13, 2018, at 21:05, Bruno P. Kinoshita 
>> <brunodepau...@yahoo.com.br.INVALID> wrote:
>>
>> I was thinking more about using that as an argument for using a logging 
>> framework, but I think you are right. Probably slf4j/commons-logging + some 
>> default binding, then allowing users to change the implementation.
>>
>> Perhaps slf4j + log4j?
>>
>>
>> Bruno
>>
>> ________________________________
>> From: Remko Popma <remko.po...@gmail.com>
>> To: Commons Developers List <dev@commons.apache.org>
>> Sent: Monday, 13 August 2018 11:55 PM
>> Subject: Re: [imaging] IMAGING-154 remove Debug class
>>
>>
>>
>> For new projects I would really avoid using Commons Logging. Ceki had a 
>> point when he created SLF4J.
>>
>>
>> The projects you mentioned that have a dependency on Commons Logging were 
>> started before SLF4J (and perhaps JUL) were created, I believe.
>>
>>
>>
>> (Shameless plug) Every java main() method deserves http://picocli.info
>>
>>
>>>> On Aug 13, 2018, at 18:22, Bruno P. Kinoshita 
>>>> <brunodepau...@yahoo.com.br.INVALID> wrote:
>>
>>> Right now that's where I am standing too. If adding a dependency to log4j 
>>> is a no-no, then I'd probably check if jul would be OK, or otherwise maybe 
>>> import just Log4J's LowLevelLogUtil into the project would work?
>>
>>
>>
>>> Commons DBCP, Commons Configuration, Commons Beanutils, Commons JEXL, and 
>>> Commons Validator. All of these have a compile dependency to Commons 
>>> Logging. So it wouldn't be creating a new precedent.
>>
>>
>>
>>> Commons Pool and Commons Compress have some optional dependencies, but none 
>>> for logging... maybe an optional dependency, with disabling the logging by 
>>> default **could** work?
>>
>>
>>
>>> Cheers
>>
>>> Bruno
>>
>>
>>
>>> ________________________________
>>
>>> From: Remko Popma <remko.po...@gmail.com>
>>
>>> To: Commons Developers List <dev@commons.apache.org>
>>
>>> Sent: Monday, 13 August 2018 9:50 AM
>>
>>> Subject: Re: [imaging] IMAGING-154 remove Debug class
>>
>>
>>
>>
>>> If you want to avoid a dependency I would not create a custom logging 
>>> abstraction but just use JUL. Most logging libraries have JUL adapters so 
>>> clients can do the bridging on their side.
>>
>>
>>> (Shameless plug) Every java main() method deserves http://picocli.info
>>
>>
>>>> On Aug 13, 2018, at 0:17, Matt Sicker <boa...@gmail.com> wrote:
>>
>>
>>>> What I've seen done when trying to avoid a logging API dependency is to
>>
>>>> create a minimal logging API purely for framework use. This can have a
>>
>>>> default System.err style implementation, but the idea is to make it easy
>>
>>>> (and performant hopefully) to bridge into the end user's choice of
>>
>>>> framework and configuration without actually requiring a real logging
>>
>>>> framework (at least until you want to use it in production). While it seems
>>
>>>> overkill, the problem is that neither JUL nor System.err are sufficient for
>>
>>>> logging. Even a simple API like Android's logging API can be good enough to
>>
>>>> abstract it in a small library.
>>
>>
>>>> For a look at the very simplest route, you can see how Log4j2 handles
>>
>>>> logging before any logging classes have been initialized. It's basically a
>>
>>>> configurable wrapper around System.err:
>>
>>>> https://github.com/apache/logging-log4j2/blob/master/log4j-api/src/main/java/org/apache/logging/log4j/util/LowLevelLogUtil.java
>>
>>
>>
>>>>> On Sun, 12 Aug 2018 at 09:12, Gary Gregory <garydgreg...@gmail.com> wrote:
>>
>>
>>>>> You could also log to a pluggable print stream which could be sys err by
>>
>>>>> default. Kind of like what JDBC allows. My bias is to Log4j 2 as well :-)
>>
>>
>>>>> Gary
>>
>>
>>>>>> On Sun, Aug 12, 2018, 08:00 Remko Popma <remko.po...@gmail.com> wrote:
>>
>>
>>>>>> There’s a couple of considerations about doing logging in a library, but
>>
>>>>>> I’ll just mention a few:
>>
>>
>>>>>> * dependencies
>>
>>>>>> * performance
>>
>>>>>> * ease of use
>>
>>
>>>>>> * Dependencies*
>>
>>>>>> Will the library be less attractive to users if it requires an external
>>
>>>>>> dependency? Then don’t introduce one (so: use system err or JUL). On the
>>
>>>>>> other hand, if the vast majority of usages is in a context with many
>>
>>>>> other
>>
>>>>>> external libraries (like in a web container) you have more freedom.
>>
>>
>>>>>> *Performance*
>>
>>>>>> Please take a look at the log4j 2 performance page (
>>
>>>>>> https://logging.apache.org/log4j/2.x/performance.html#tradeoffs).
>>
>>>>> Console
>>
>>>>>> logging is 50x (yes fifty times) slower than file logging.
>>
>>>>>> That’s a strong argument against system err logging. I’m not a fan of
>>
>>>>> JUL,
>>
>>>>>> but if you need to avoid dependencies you’re better off using JUL, that’s
>>
>>>>>> only 5x slower than log4j. Also depends on how much logging you expect to
>>
>>>>>> do in the worst case.
>>
>>
>>>>>> *Ease of use*
>>
>>>>>> I’m biased and would say that Log4j 2 has the nicest and richest API.
>>
>>>>>> Console logging (System.err.printf) probably has the poorest API. Other
>>
>>>>>> libraries sit in the middle.
>>
>>
>>>>>> *Final note*
>>
>>>>>> I would never log to System out, always use system err instead. This
>>
>>>>>> allows programs using your library to pipe output to other programs
>>
>>>>> without
>>
>>>>>> their output getting mixed with your library’s diagnostic output.
>>
>>
>>>>>> Hope this helps,
>>
>>
>>>>>> Remko
>>
>>
>>>>>> (Shameless plug) Every java main() method deserves http://picocli.info
>>
>>
>>>>>>> On Aug 12, 2018, at 21:21, Gilles <gil...@harfang.homelinux.org>
>>
>>>>> wrote:
>>
>>
>>>>>>> Hello Bruno.
>>
>>
>>>>>>>> On Sun, 12 Aug 2018 08:56:37 +0000 (UTC), Bruno P. Kinoshita wrote:
>>
>>>>>>>> Hi all,
>>
>>
>>
>>>>>>>> I commented on IMAGING-154, but copying the last comment here as it
>>
>>>>>>>> contains the approach I would like to follow to fix the last change in
>>
>>>>>>>> the project blocking
>>
>>>>>>>> a 1.0 release:
>>
>>
>>
>>>>>>>> ---
>>
>>
>>>>>>>> So went ahead to re-design the Debug class, in a way users could
>>
>>>>>>>> still enable/disable debugging, and also use a PrintStream so that
>>
>>>>>>>> other thing rather than System.out could be used.
>>
>>
>>
>>
>>>>>>>> Then, realized removing System.out was the natural next step. But
>>
>>>>>>>> alas, the library uses System.out for debugging, but sometimes it uses
>>
>>>>>>>> it for writing to System.out in a "verbose mode". What is more
>>
>>>>>>>> complicated, is that sometimes classes methods like `toString()` are
>>
>>>>>>>> calling debug methods that receive a PrintStream already.
>>
>>
>>
>>
>>>>>>>> So I spent some more time quickly comparing what other libraries I've
>>
>>>>>>>> seen being used / or used for image processing:
>>
>>
>>
>>>>> https://kinoshita.eti.br/2018/08/12/use-of-logging-in-java-image-processing-libraries/
>>
>>>>>> .
>>
>>>>>>>> Turns out only very low level libraries, such as the JNI bridge for
>>
>>>>>>>> OpenCV, im4java, and Java's ImageIO can do with just throwing
>>
>>>>>>>> Exception's.
>>
>>
>>
>>
>>>>>>>> All other libraries have one way or another of logging. Be it with
>>
>>>>>>>> JUL, SLF4J, custom loggers, or with the ol' System.out/err.
>>
>>
>>
>>
>>>>>>>> My preferred compromise for this ticket was to keep Debug, making
>>
>>>>>>>> System.out possible but optional, and mark the class internal only.
>>
>>>>>>>> Now my preferred solution is to keep the Debug internal, but add a
>>
>>>>>>>> logger to it. And then also add logging to replace where System.out is
>>
>>>>>>>> used for the "verbose" mode.
>>
>>>>>>>> ---
>>
>>
>>
>>
>>>>>>>> Any thoughts? Objections? If none, I will try to work on this issue
>>
>>>>>>>> next weekend, making the Debug class internal only, and replacing
>>
>>>>>>>> System.out by a logging utility. After that, we should be good to
>>
>>>>>>>> start preparing the vote for 1.0.
>>
>>
>>
>>
>>>>>>>> * I know it's hard to get a consensus on having logging in Commons
>>
>>>>>>>> components, as we have  normally low level libraries, where using
>>
>>>>>>>> logging is not always practical.
>>
>>
>>>>>>> There are Log4j2 experts reading here.  It would be interesting
>>
>>>>>>> to hear them about what is practical or not.  There are several
>>
>>>>>>> aspects to "practical": simplicity, flexibility, compatibility,
>>
>>>>>>> performance, ...
>>
>>>>>>> How does Log4j2 fare in these areas?
>>
>>>>>>> Is there a known (through experience) limit in where it should
>>
>>>>>>> be used?
>>
>>
>>>>>>>> But I would now argue that Java own
>>
>>>>>>>> ImageIO is low level. But ImageJ2, Processing, OpenJPEG, and Commons
>>
>>>>>>>> Imaging are located at a higher level, some times even using it for
>>
>>>>>>>> basic image handling/parsing/reading.
>>
>>
>>>>>>> As with many discussions on this list, conflicting arguments occur
>>
>>>>>>> because people lack common (!) definitions.
>>
>>>>>>> So one goes: "You cannot do <something> in a low-level component"
>>
>>>>>>> but does not define "low-level"...
>>
>>
>>>>>>>> * Feel free to cast a counter-argument for it, but please think
>>
>>>>>>>> whether you'd still be -0, +0 for this change. We have delayed 1.0 for
>>
>>>>>>>> a while, so if you have a strong opinion on not adding a logger,
>>
>>>>>>>> please provide an alternative for IMAGING-154.
>>
>>
>>>>>>>> Otherwise we may fail
>>
>>>>>>>> to prepare a 1.0 release yet again, and then somebody else may have to
>>
>>>>>>>> work on it in a few months/years...
>>
>>
>>>>>>> We are there because the project is too rigid about itself as
>>
>>>>>>> a whole (cf. for example the [RNG] thread about BC).
>>
>>>>>>> IMHO, it's not the always least common denominator that is the
>>
>>>>>>> best decision...
>>
>>>>>>> As you noticed, components most easily stall in their development
>>
>>>>>>> for lack of proper review, or risk acceptance (i.e. assume that
>>
>>>>>>> those who are closer to the code (at a given time) probably know
>>
>>>>>>> best... :-/
>>
>>
>>>>>>> My opinion is that we can take the risk to introduce logging, and
>>
>>>>>>> if people complain somehow, take it back later.
>>
>>
>>>>>>>> one possible compromise for this,
>>
>>>>>>>> might be i) make Debug internal,
>>
>>
>>>>>>> +1
>>
>>
>>>>>>> [Hmm... Does "internal" mean that minor release can break BC
>>
>>>>>>> on such a class?]
>>
>>
>>>>>>>> ii) remove all System.out calls,
>>
>>
>>>>>>> +1 or
>>
>>>>>>> -1
>>
>>
>>>>>>> [Depends on what "low-level" means here. "stdout"/"stderr" is
>>
>>>>>>> indeed used in low-level utilities but is the intent the same
>>
>>>>>>> here?]
>>
>>
>>>>>>>> which means removing the verbose flags, the checks, and calls to
>>
>>>>>>>> System.out in there.
>>
>>
>>>>>>> It would be a loss of potentially useful information (e.g. for
>>
>>>>>>> debugging).
>>
>>
>>>>>>> Regards,
>>
>>>>>>> Gilles
>>
>>
>>
>>>>>>>> Thanks!
>>
>>>>>>>> Bruno
>>
>>
>>>>>>>> ________________________________
>>
>>>>>>>> From: Bruno P. Kinoshita <brunodepau...@yahoo.com.br.INVALID>
>>
>>>>>>>> To: Commons Developers List <dev@commons.apache.org>
>>
>>>>>>>> Sent: Tuesday, 6 February 2018 11:30 PM
>>
>>>>>>>> Subject: Re: [imaging] IMAGING-154 remove Debug class
>>
>>
>>
>>
>>>>>>>> Hi sebb,
>>
>>
>>>>>>>>> Another aspect of debugging is ensuring that methods are small and
>>
>>
>>>>>>>>> easily tested independently.
>>
>>>>>>>>> However this is difficult to do, and care must be taken to ensure
>>
>>>>> that
>>
>>>>>>>>> the public API is not unnecessarily extended..
>>
>>
>>>>>>>> A very good point.
>>
>>
>>>>>>>> The parsers in commons-imaging expose some #dump... methods
>>
>>>>>>>> (
>>
>>
>>>>> https://github.com/apache/commons-imaging/blob/7e7f96857df999175bb614732e13272a82f7962a/src/main/java/org/apache/commons/imaging/ImageParser.java#L794
>>
>>>>>> ).
>>
>>
>>>>>>>> While I can see that parsers may need to dump the data they are
>>
>>>>>>>> holding in some structured way for inspecting, reporting, serializing,
>>
>>>>>>>> etc, it looks like some other classes were affected by it too. For
>>
>>>>>>>> example...
>>
>>
>>
>>>>>>>> A JPEG Segment has a #dump() method
>>
>>
>>
>>
>>
>>>>> https://github.com/apache/commons-imaging/blob/7e7f96857df999175bb614732e13272a82f7962a/src/main/java/org/apache/commons/imaging/formats/jpeg/segments/Segment.java#L34
>>
>>
>>
>>>>>>>> which gets defined in each subclass of Segment. It can be confusing
>>
>>>>>>>> to have a method such as #dump() in a Segment, from the point of view
>>
>>>>>>>> of someone writing a photo editor for example. The user could use that
>>
>>>>>>>> to pass his/her own logger's PrintWriter, which would make removing or
>>
>>>>>>>> changing logging in the future in commons-imaging.
>>
>>
>>
>>>>>>>> If we keep the Debug class, and make it internal, there would still
>>
>>>>>>>> be these methods to take care. And there are some methods where users
>>
>>>>>>>> can provide a PrintWriter, while others instead use System.out
>>
>>>>>>>> (e.g.
>>
>>
>>>>> https://github.com/apache/commons-imaging/blob/7e7f96857df999175bb614732e13272a82f7962a/src/main/java/org/apache/commons/imaging/FormatCompliance.java#L70
>>
>>>>>> ).
>>
>>
>>>>>>>> Cheers
>>
>>>>>>>> Bruno
>>
>>
>>>>>>>> ________________________________
>>
>>>>>>>> From: sebb <seb...@gmail.com>
>>
>>>>>>>> To: Commons Developers List <dev@commons.apache.org>; Bruno P.
>>
>>>>>>>> Kinoshita <brunodepau...@yahoo.com.br>
>>
>>>>>>>> Sent: Tuesday, 6 February 2018 11:06 PM
>>
>>>>>>>> Subject: Re: [imaging] IMAGING-154 remove Debug class
>>
>>
>>
>>
>>>>>>>> On 6 February 2018 at 09:52, Bruno P. Kinoshita
>>
>>>>>>>> <brunodepau...@yahoo.com.br.invalid> wrote:
>>
>>>>>>>>> Hi Jorg,
>>
>>
>>>>>>>>> I'd be fine with that solution too. I think this one would cause the
>>
>>>>>> smaller change to the code as is.
>>
>>
>>>>>>>>> I believe my preference is still to remove the Debug class. But
>>
>>>>>> between logging and making Debug internal only, I'd choose making it
>>
>>>>>> internal.
>>
>>
>>>>>>>> +1
>>
>>
>>>>>>>> I think making it internal means it can still be dropped later.
>>
>>
>>>>>>>>> Looking forward to hearing what others think about these options.
>>
>>
>>
>>>>>>>> Another aspect of debugging is ensuring that methods are small and
>>
>>>>>>>> easily tested independently.
>>
>>>>>>>> However this is difficult to do, and care must be taken to ensure that
>>
>>>>>>>> the public API is not unnecessarily extended..
>>
>>
>>>>>>>>> Thanks
>>
>>>>>>>>> Bruno
>>
>>
>>
>>>>>>>>> ________________________________
>>
>>>>>>>>> From: Jörg Schaible <joerg.schai...@bpm-inspire.com>
>>
>>>>>>>>> To: dev@commons.apache.org
>>
>>>>>>>>> Sent: Tuesday, 6 February 2018 9:24 PM
>>
>>>>>>>>> Subject: Re: [imaging] IMAGING-154 remove Debug class
>>
>>
>>
>>
>>>>>>>>> Hi Bruno,
>>
>>
>>
>>>>>>>>> if it might also be helpful to our users, why not keep and provide
>>
>>>>> it.
>>
>>>>>> As
>>
>>
>>>>>>>>> I understand it, the Debug class is a tool helping in development to
>>
>>
>>>>>>>>> analyze some behavior.
>>
>>
>>
>>>>>>>>> Nothing stops us from declaring this class internal (we might even
>>
>>>>> put
>>
>>>>>> it
>>
>>
>>>>>>>>> into a package "internal" or "debug") that might be changed without
>>
>>
>>>>>>>>> further comment. Nobody may rely on it in production code, but during
>>
>>
>>>>>>>>> development it might be helpful. With such an approach we might not
>>
>>>>>> have
>>
>>
>>>>>>>>> a need to find a better interface to provide this functionality.
>>
>>
>>
>>>>>>>>> Just my 2¢,
>>
>>
>>>>>>>>> Jörg
>>
>>
>>
>>
>>>>>>>>> Am Mon, 05 Feb 2018 12:20:58 +0000 schrieb Bruno P. Kinoshita:
>>
>>
>>
>>>>>>>>>> Hello,
>>
>>
>>
>>
>>>>>>>>>> If memory serves me well, some time ago we had a discussion around
>>
>>
>>>>>>>>>> sanselan & commons-imaging 1.0. One of the issues with
>>
>>>>> commons-imaging
>>
>>
>>>>>>>>>> 1.0 was the Debug class.
>>
>>
>>
>>
>>>>>>>>>> https://issues.apache.org/jira/browse/IMAGING-154
>>
>>
>>
>>
>>>>>>>>>> I finished the pull request, but Gilles raised an important point,
>>
>>>>>> about
>>
>>
>>>>>>>>>> discussing other alternatives first.
>>
>>
>>
>>
>>>>>>>>>> Initially I am against logging in low level libraries, especially
>>
>>
>>>>>>>>>> commons components. But some time ago I had to debug TIFF issues in
>>
>>
>>>>>>>>>> commons-imaging, and having the dump methods was a tremendous help.
>>
>>
>>
>>
>>
>>
>>>>>>>>>> The issue is that some imaging algorithms/processing have a lot of
>>
>>
>>>>>>>>>> variables that can be altered. And keeping an eye on all of them in
>>
>>>>>> the
>>
>>
>>>>>>>>>> debugger can be quite hard - though not impossible.
>>
>>
>>
>>
>>>>>>>>>> So all in all, now I am more confident to proceed without the Debug
>>
>>
>>>>>>>>>> class. But some users could have a hard time investigating possible
>>
>>
>>>>>>>>>> issues in the library without seeing what's going on within the
>>
>>>>>> library.
>>
>>
>>
>>
>>>>>>>>>> IMO, that could be solved with the logging/dump features... or
>>
>>>>>> through a
>>
>>
>>>>>>>>>> better design, especially around exception handling/throwing. The
>>
>>>>>> latter
>>
>>
>>>>>>>>>> is my preferred approach. Instead of logging, I prefer - whenever
>>
>>
>>>>>>>>>> possible - that low level libraries throw exceptions and let me
>>
>>>>> handle
>>
>>
>>>>>>>>>> the logging.
>>
>>
>>
>>
>>
>>
>>>>>>>>>> So, any thoughts? :) I'm +1 to remove the Debug class, and +0 to a
>>
>>
>>>>>>>>>> logging added to commons-imaging.
>>
>>
>>
>>
>>>>>>>>>> Bruno
>>
>>
>>
>>>>>>> ---------------------------------------------------------------------
>>
>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
>>
>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org
>>
>>
>>
>>
>>
>>
>>>> --
>>
>>>> Matt Sicker <boa...@gmail.com>
>>
>>
>>
>>> ---------------------------------------------------------------------
>>
>>> 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
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to