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
>

Reply via email to