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
> >
> >
>

Reply via email to