I don't see a benefit of calling methods to apply coloring sections over a formatted message that specifies coloring.
Cheers, Paul On Mon, Jun 20, 2016 at 6:14 PM, Remko Popma <[email protected]> wrote: > What if we keep the same or similar syntax but with Log4j2 imports, and we > use it to build a custom Message? > > So, this java code logger.info(ansi().fg(RED).a("Hello").fg(CYAN).a(" > World").reset()); > would result in a JansiMessage containing a "Hello" string associated with > a RED object, and a " World" string associated with the CYAN object. At > this stage, nothing is rendered yet. > > The Console Appender's PatternLayout, when the Jansi option is enabled, > could call JansiMessage.generateJansiFormattedMessage() which contains the > escape codes for the console. > > The File Appender's PatternLayout does not have the Jansi option enabled, > so the normal Message.getFormattedMessage() is called, resulting in the > plain string "Hello World". > > One key consideration is that all the objects used to build the message > should be in the Log4j API namespace to avoid any dependency on Jansi at > the API level. (But things like RED etc can be inner classes of > JansiMessage. Static imports can make this painless to use.) > > > On Tue, Jun 21, 2016 at 3:59 AM, Paul Benedict <[email protected]> > wrote: > >> It's pretty cool. Yes, a generalized syntax is very nice. Do your best to >> make the syntax general -- and if for, for whatever reason, an appender >> needs something more explicit/specific, those options can just be provided >> by the appender's custom parsing. >> >> Cheers, >> Paul >> >> On Mon, Jun 20, 2016 at 1:44 PM, Gary Gregory <[email protected]> >> wrote: >> >>> I think like the idea of having a special syntax for colors, for >>> rendering of styles in general actually, because we could have this >>> implemented for the Jansi+Console appender, for the HTML appender, and you >>> could also imagine an RTF appender. >>> >>> Gary >>> >>> On Thu, Jun 16, 2016 at 12:59 PM, Gary Gregory <[email protected]> >>> wrote: >>> >>>> On Thu, Jun 16, 2016 at 12:48 PM, Paul Benedict <[email protected]> >>>> wrote: >>>> >>>>> I imagine parsing the placeholder is going to be expensive (relatively >>>>> speaking). It is an extra cost. >>>>> >>>> >>>> We already support different ways to paramaterize messages [1]: {}, %s >>>> (and family), java.text.MessageFormat, and so on. Each has its different >>>> overhead. >>>> >>>> This could be a variation of the ParameterizedMessage class for >>>> example. Or maybe an extension of to one or more other message types. >>>> >>>> Gary >>>> >>>> [1] https://logging.apache.org/log4j/2.x/manual/messages.html >>>> >>>> >>>>> 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 >>>>>> > >>>>>> > >>>>>> >>>>> >>>>> >>>> >>>> >>>> -- >>>> 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 >>> >> >> >
