I imagine parsing the placeholder is going to be expensive (relatively speaking). It is an extra cost.
I advise devising a new interface that appenders can implement to receive the parsed tokens. If the interface is missing, no parsing in-between is necessary. Otherwise, send the tokens to the appender as a callback for it to make the necessary modifications -- such as setting the color. Cheers, Paul On Thu, Jun 16, 2016 at 1:53 PM, Gary Gregory <[email protected]> wrote: > > On Jun 16, 2016 11:25 AM, "Paul Benedict" <[email protected]> wrote: > > > > Are you asking me for blue sky thinking, perhaps something like this: > > log.info("Hello, {color:green}, how are you?", "Gary"); > > > > For this example, I took the {} placeholder and added some context. > > Ok yes, that's what I was talking about. Also: > > log.info("Hello {color:green Gary}, how are you?"); > > Gary > > > > Cheers, > > Paul > > > > On Thu, Jun 16, 2016 at 1:22 PM, Gary Gregory <[email protected]> > wrote: > >> > >> On Thu, Jun 16, 2016 at 11:04 AM, Paul Benedict <[email protected]> > wrote: > >>> > >>> I think color falls into the category of formatting. By that, I mean > to state that colors shouldn't be hardcoded into messages :-) That should > belong to the actual formatter... template string or appender configuration. > >> > >> > >> What would that look like? I do not see how do to that without creating > a lot of custom code. > >> > >> Gary > >> > >>> > >>> > >>> Cheers, > >>> Paul > >>> > >>> On Thu, Jun 16, 2016 at 12:58 PM, Gary Gregory <[email protected]> > wrote: > >>>> > >>>> 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 > >>>>>> JUnit in Action, Second Edition > >>>>>> Spring Batch in Action > >>>>>> 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 > >>>>> JUnit in Action, Second Edition > >>>>> Spring Batch in Action > >>>>> 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 > >>>> JUnit in Action, Second Edition > >>>> Spring Batch in Action > >>>> 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 > >> JUnit in Action, Second Edition > >> Spring Batch in Action > >> Blog: http://garygregory.wordpress.com > >> Home: http://garygregory.com/ > >> Tweet! http://twitter.com/GaryGregory > > > > >
