On Thu, Jun 16, 2016 at 10:39 AM, Gary Gregory <[email protected]> wrote:
> On Wed, Jun 15, 2016 at 10:50 PM, Gary Gregory <[email protected]> > wrote: > >> Hi All, >> >> See color messages in Maven 3.4.0-SNAPSHOT made me think of the following. >> >> Right now, with Jansi on the CP, I can say: >> >> import static org.fusesource.jansi.Ansi.*; >> import static org.fusesource.jansi.Ansi.Color.*; >> ... >> logger.info(ansi().fg(RED).a("Hello").fg(CYAN).a(" World").reset()); >> >> and the right thing happens on the console. >> >> If I also have a file appender, I get the escape codes in the file, which >> I do not think most people would want. >> >> The question is, how can we make it simple for users to have their cake >> and eat it too? >> >> With a special Message implementation? >> >> Thoughts? >> > > One way would be to have the non-a() methods (plus reset()) become no-ops > when not using a console appender. But how? We could have a subclass of > JAnsi's Ansi class that gets used. Anyway, I'm just rambling. > Still rambling, mostly so I have a place to look back for these notes: - nope, the reset() method would need to be noop'd. - Example of a color message: org.apache.logging.log4j.core.appender.ConsoleAppenderJAnsiMessageMain - JAnsi also supports a special syntax, for example: "@|red Hello|@ @|cyan World|@" but if use that like: logger.info("@|red Hello|@ @|cyan World|@"); JAnsi rendering does not kick in unsurprisingly. Maybe the Console appender could make sure the JAnsi renderer is used (optional), so that logger.info(ansi().render("@|red Hello|@ @|green World|@"); can become: logger.info("@|red Hello|@ @|green World|@"); and then we can add a renderJansi option to the console appender but... the decorations still end up in a file appender so we are still in the same pickle. Thinking about a MessageRenderer (String render(String)) interface with two impl: one that calls ansi().render(String) for console appenders (optionally, if renderJansi=true) and another that strips the decorations (but this feels heavy). More rambling: Instead of: logger.info(ansi().fg(RED).a("Hello").fg(CYAN).a(" World").reset()); say: logger.info((Ansi ansi) -> ansi.fg(RED).a("Hello").fg(CYAN).a(" World").reset()); Then we can pass in a custom Ansi subclass that only outputs the string bits, no escape codes. Gary > Gary > > >> Thank you, >> Gary >> -- >> E-Mail: [email protected] | [email protected] >> Java Persistence with Hibernate, Second Edition >> <http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> > > > > -- > E-Mail: [email protected] | [email protected] > Java Persistence with Hibernate, Second Edition > <http://www.manning.com/bauer3/> > JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> > Spring Batch in Action <http://www.manning.com/templier/> > Blog: http://garygregory.wordpress.com > Home: http://garygregory.com/ > Tweet! http://twitter.com/GaryGregory > -- E-Mail: [email protected] | [email protected] Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> Spring Batch in Action <http://www.manning.com/templier/> Blog: http://garygregory.wordpress.com Home: http://garygregory.com/ Tweet! http://twitter.com/GaryGregory
