Why wouldn’t you just do:
%m{ansi}
%m{html}
%m{styled}
Ralph
> On Jun 25, 2016, at 3:09 PM, Gary Gregory <[email protected]> wrote:
>
> Rambling thoughts:
>
> I use the term message as the message string from the log event (probably
> after parameters has been processed.)
>
> - Add to PatternLayout a %ansiMessage, use that instead of %m and the layout
> will rewrite the message as an ANSI message. Use that on a file layout and
> you get ANSI codes in your file.
> - Add to PatternLayout a %htmlMessage, use that instead of %m and the layout
> will rewrite the message as an HTML fragment. The produced HTML would not be
> a whole HTML document, just a fragment that fits in an HTML page/
>
> More general:
>
> Add to PatternLayout a %styledMessage, use that instead of %m and:
> - A console appends rewrites the message as an ANSI message.
> - An HTML layout rewrites the message as an HTML fragment.
>
> The message syntax is TDB.
>
> My focus in on the console appender but thinking about HTML as well helps
> consider a more general solution (I hope).
>
> Gary
>
>
>
> On Sat, Jun 25, 2016 at 2:51 PM, Paul Benedict <[email protected]
> <mailto:[email protected]>> wrote:
> Do you guys have a policy like HTML for ignoring unknown tags/styles when
> parsing a message? So if a message is, for example, "Hey {%s color:red}", and
> the formatter doesn't support colors, it completely ignores the "color:red"
> token? I am implying a backward and forward compatibility.
>
> Cheers,
> Paul
>
> On Sat, Jun 25, 2016 at 2:16 PM, Gary Gregory <[email protected]
> <mailto:[email protected]>> wrote:
> I meant something like (b). I used the word "render" to try to convey a
> different concept form "formatting" a message with its parameter. An appender
> knows how to render a formatted message on itself.
>
> The question is how to get no styles on certain appenders and layouts seem to
> be one good place to do it if I set up that layout for just the one appender
> that needs it.
>
> Gary
>
> ?
>
> Every appender accepts a Layout for rendering and they all use one. A File
> appender can use a Pattern layout, a JSON layout, etc. So it is incorrect to
> say any appender wants no rendering.
>
> I think what you are really wanting is a way to either a) enhance the
> Message.getFormattedMessage() to process the styles in accordance with the
> Appender type or b) have the Appender process the styles after
> getFormattedMessage() is called. Architecturally, I like the idea of having
> the Message handle it but it may be harder to implement.
>
> Ralph
>
>
>> On Jun 24, 2016, at 12:22 PM, Gary Gregory <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> Since an HTML layout and a Console JAnsi layout need different
>> interpretation of the message string, why not allow each appender to do its
>> own rendering? Also, you want no rendering for other appenders like file,
>> JMS, and so on.
>>
>> Gary
>>
>> On Jun 24, 2016 11:07 AM, "Ralph Goers" <[email protected]
>> <mailto:[email protected]>> wrote:
>> Yes. Of course the converter would need to be aware what the target is,
>> which I am not sure is currently available. In this case I would think you
>> would want to just enhance the %m converter to support these new plugins,
>> rather than creating a new message converter.
>>
>> If you didn’t want to have the output formatted differently depending on the
>> target I could see having the formatting being done in the Message.
>>
>> Ralph
>>
>>> On Jun 24, 2016, at 10:37 AM, Gary Gregory <[email protected]
>>> <mailto:[email protected]>> wrote:
>>>
>>> Thank you for the feedback.
>>>
>>> I can see that I could invent a new kind of %m converter that parses the
>>> message and does the coloring. I could have an ANSI kind of %m, an HTML %m,
>>> and so on.
>>>
>>> Gary
>>>
>>> On Jun 24, 2016 10:00 AM, "Ralph Goers" <[email protected]
>>> <mailto:[email protected]>> wrote:
>>>
>>> I am not sure I get this idea at all. First, I would expect that “styles”
>>> would be plugins much as converters are for the PatternLayout. But it isn’t
>>> clear to me at all why I would want or require a StyledMessage to do that.
>>> If you want to support “styles” then implement the support in the
>>> appropriate layouts. The message should just contain the information the
>>> styles need to render them.
>>>
>>> Also, is StyledMessage an Interface? If it is a class is it a
>>> ParameterizedMessage, SimpleMessage, etc, or are you planning on having a
>>> “Styled” version of each Message type. I am not in favor of that at all.
>>>
>>> I am also not sure how this handles the issue you mentioned at the start of
>>> this thread - that the color codes written to files don’t cause the colors
>>> to show up and only render properly on the console.
>>>
>>> Ralph
>>>
>>>> On Jun 24, 2016, at 8:43 AM, Gary Gregory <[email protected]
>>>> <mailto:[email protected]>> wrote:
>>>>
>>>> Another question is what should the syntax be for a StyledMessage? The
>>>> same as for a pattern layout
>>>> (https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
>>>> <https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout>)?
>>>> Something else? Could it be simpler and still allow for parameters and
>>>> escaping?
>>>>
>>>> SyledMessageFactory factory = SyledMessageFactory.load( ...styles... );
>>>> item = "pants";
>>>> // Using pattern layout kind of format with parameter markers.
>>>> logger.error("Your {} are on {fire!}{criticalMassStyle},
>>>> {notifying}{peacfulStyle}{}", item);
>>>> logger.error("Your %s are on {fire!}{criticalMassStyle},
>>>> {notifying}{peacfulStyle}%s", item);
>>>>
>>>> Gary
>>>>
>>>> On Tue, Jun 21, 2016 at 6:39 PM, Remko Popma <[email protected]
>>>> <mailto:[email protected]>> wrote:
>>>> 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]
>>>> <mailto:[email protected]>> wrote:
>>>> On Mon, Jun 20, 2016 at 4: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
>>>> <http://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] <>>
>>>> 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
>>>> <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 <http://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 <http://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
>>>> >>>>>> <http://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 <http://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 <http://logger.info/>(ansi().render("@|red Hello|@
>>>> >>>> @|green World|@");
>>>> >>>>
>>>> >>>> can become:
>>>> >>>>
>>>> >>>> logger.info <http://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
>>>> >>>> <http://logger.info/>(ansi().fg(RED).a("Hello").fg(CYAN).a("
>>>> >>>> World").reset());
>>>> >>>>
>>>> >>>> say:
>>>> >>>>
>>>> >>>> logger.info <http://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
>>>> >>>>>> <http://garygregory.wordpress.com/>
>>>> >>>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> >>>>>> Tweet! http://twitter.com/GaryGregory
>>>> >>>>>> <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
>>>> >>>>> <http://garygregory.wordpress.com/>
>>>> >>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> >>>>> Tweet! http://twitter.com/GaryGregory
>>>> >>>>> <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
>>>> >>>> <http://garygregory.wordpress.com/>
>>>> >>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> >>>> Tweet! http://twitter.com/GaryGregory <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
>>>> >> <http://garygregory.wordpress.com/>
>>>> >> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> >> Tweet! http://twitter.com/GaryGregory <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 <http://garygregory.wordpress.com/>
>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> Tweet! http://twitter.com/GaryGregory <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 <http://garygregory.wordpress.com/>
>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> Tweet! http://twitter.com/GaryGregory <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 <http://garygregory.wordpress.com/>
>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>>>>
>>>>
>>>> --
>>>> E-Mail: [email protected] <mailto:[email protected]> |
>>>> [email protected] <mailto:[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 <http://garygregory.wordpress.com/>
>>>> Home: http://garygregory.com/ <http://garygregory.com/>
>>>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>>
>
>
>
>
>
> --
> E-Mail: [email protected] <mailto:[email protected]> |
> [email protected] <mailto:[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 <http://garygregory.wordpress.com/>
> Home: http://garygregory.com/ <http://garygregory.com/>
> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>