After thinking about it some more, I agree with you guys that the string syntax seems like a better idea.
On Wednesday, 22 June 2016, Gary Gregory <[email protected]> wrote: > On Mon, Jun 20, 2016 at 4:14 PM, Remko Popma <[email protected] > <javascript:_e(%7B%7D,'cvml','[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. >> > > I would prefer to avoid a vendor specific message class and name. I think > the Maven folks are experiencing growing pains now that they have enabled > color within Maven messages. I think a StyledMessage would be the way to go. > > When a StyledMessage goes to a Console appender, JAnsi is used, when it > does to an HTML appender, HTML is used. Whether you build a StyledMessage > with a fluent API, a string syntax or both is another matter, but the > string syntax seems simplest. > > Gary > > >> 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] >> <javascript:_e(%7B%7D,'cvml','[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] >>> <javascript:_e(%7B%7D,'cvml','[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] >>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >>>> >>>>> On Thu, Jun 16, 2016 at 12:48 PM, Paul Benedict <[email protected] >>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >>>>>> >>>>>>> >>>>>>> On Jun 16, 2016 11:25 AM, "Paul Benedict" <[email protected] >>>>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >>>>>>> >> >>>>>>> >> On Thu, Jun 16, 2016 at 11:04 AM, Paul Benedict < >>>>>>> [email protected] >>>>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >>>>>>> >>>> >>>>>>> >>>> On Thu, Jun 16, 2016 at 10:39 AM, Gary Gregory < >>>>>>> [email protected] >>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >>>>>>> >>>>> >>>>>>> >>>>> On Wed, Jun 15, 2016 at 10:50 PM, Gary Gregory < >>>>>>> [email protected] >>>>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');> | >>>>>>> [email protected] >>>>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');> | >>>>>>> [email protected] >>>>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');> | >>>>>>> [email protected] >>>>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');> | >>>>>>> [email protected] >>>>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>>> <javascript:_e(%7B%7D,'cvml','[email protected]');> | >>>>> [email protected] >>>>> <javascript:_e(%7B%7D,'cvml','[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] >>>> <javascript:_e(%7B%7D,'cvml','[email protected]');> | >>>> [email protected] >>>> <javascript:_e(%7B%7D,'cvml','[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] > <javascript:_e(%7B%7D,'cvml','[email protected]');> | [email protected] > <javascript:_e(%7B%7D,'cvml','[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 >
