I like Remko's suggestion, a nice application of the KISS principle ;-)

Gary

On Mon, Aug 13, 2018, 07:58 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.
>
> 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
>
>

Reply via email to