Hi, I'm not sure I got what we would gain but here is my view on this topic:
* SystemLogger has the ServiceLoader "pick random first" implementation which is not what we want I think and the API stays low level, * If we want to drop Log we would rather go to JUL, which stays more powerful in terms of API, usable in terms of implementation and stillas pluggable as SystemLogger for a runtime like maven, * The point about performance is kind of behind now we are java 17 we have stackwalker so an integration thing but no more the old new Throwable().getStackTrace() blocker, * I tend to agree with your point about N records (N>1) vs 1 record but this is independent of all log API you mentionned, we can fix it with maven old log api, the new one, java or anything, it is a caller thing - but more than agree we should stop logging lines but think records. Guess I got your mail right and didn't interpret the multiple points I understood. Romain Manni-Bucau @rmannibucau <https://twitter.com/rmannibucau> | Blog <https://rmannibucau.metawerx.net/> | Old Blog <http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> | LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book <https://www.packtpub.com/application-development/java-ee-8-high-performance> Le dim. 3 mars 2024 à 15:59, Martin Desruisseaux < martin.desruisse...@geomatys.com> a écrit : > Maven 4 defines a new interface, `org.apache.maven.api.plugin.Log`, with > the usual debug(…), info(…), warn(…) and error(…) methods in it. Should > we replace that by `java.lang.System.Logger`? (now possible with Java > 17) The latter is also an interface, so we have the same flexibility for > customization. The only drawback I could see is that codes such as > `logger.info("something")` would become > `logger.log(System.Logger.Level.INFO, "something")`, which is more > tedious to write. However, this inconvenience may actually be a good > thing (see below). > > We could keep the Maven `Log` interface as a wrapper around > `System.Logger` for convenience. However, some logging implementations > such as `java.util.logging` use Java reflection for detecting the caller > class and method. If we keep the Maven `Log` as a convenience instead of > direct use of `System.Logger`, I suspect that some logging systems will > think that all logs always come from `org.apache.maven.api.plugin.Log`. > This automatic detection is the reason why I propose a complete > replacement. > > The current logger is used by Maven like below: > > > getLog().info("-------------------------------------------------------------"); > getLog().error("COMPILATION ERROR : "); > > getLog().info("-------------------------------------------------------------"); > getLog().info(something); > > getLog().info("-------------------------------------------------------------"); > > For most logging systems, the above is 5 log records, while actually > there is only 1 log record and the rest is formatting. The fact that > System.Logger is more verbose to use may encourage a better pattern like > below, which results in a single log record: > > getLog().log(System.Logger.Level.ERROR, > """ > ------------------------------------------------------------- > COMPILATION ERROR : > ------------------------------------------------------------- > """ > + something + > """ > ------------------------------------------------------------- > """); > > The previous code snippet was mixing info(…) and error(…) maybe for > coloration. But I see that Maven 4 has a MessageBuilder interface for > this task, so the log record could be rewritten again like below: > > MessageBuilder mb = messageBuilderFactory.builder() > > > .info("-------------------------------------------------------------").newLine() > .error("COMPILATION ERROR : ").newLine() > > > .info("-------------------------------------------------------------").newLine() > .info(something).newLine() > > > .info("-------------------------------------------------------------").newLine(); > getLog().log(System.Logger.Level.ERROR, md.build()); > > Any opinion? > > Martin > >