> On Dec 24, 2019, at 2:06 PM, Volkan Yazıcı <volkan.yaz...@gmail.com> wrote:
> 
> Indeed ColumnMapping is an alternative approach. I believe due to its
> origin, i.e., RDBMSes, it facilitates a 1-to-1 mapping particularly
> targeted at table column names, e.g.,
> 
>  timestamp -> instant
>  message -> summary
> 
> One can borrow the idea and extend it a little bit to support the
> structured form of a JSON:
> 
>  timestamp.millis -> instant
>  throwable -> error.message
> 
> That said, I believe current JSON-based templating in LogstashLayout
> communicates the intent more concisely (the template is WYSIWYG) and
> allows extra (JSON-specific) flexibility, e.g.,
> 
>  "user": ["${json:mdc:user}", "${json:mdc:fallbackUser}”]
> 

Looking at 
https://github.com/vy/log4j2-logstash-layout/blob/master/layout/src/main/resources/LogstashJsonEventLayoutV1.json
 
<https://github.com/vy/log4j2-logstash-layout/blob/master/layout/src/main/resources/LogstashJsonEventLayoutV1.json>
 makes me think that you could accomplish the same thing with a few 
enhancements to the PatternLayout.  In fact, all the expressions with ${json:…} 
look like they could be a LogEvent Lookup where you want the output to be 
formatted as JSON.  I am not sure why you didn’t implement it that way.

I could also see creating a new pattern converter to cause formatting to be in 
JSON so when any pattern converter is called it knows to output JSON.  So %d  
would result in “timestamp”: “2019-12-25 01:02:03,123”  etc. So a pattern of 
“%json{%d, %p, %c, %C, %M, %L, %m}”  would generate “{“timestamp”: “2019-12-25 
01:02:03,123”, “level”: “debug”, “logger”: “com.mycorp.MyClass”, “class”: 
“com.mycorp.MyClass”, “method”: “doSomething”: “lineNumber”: 123, “message”: 
“Hello, world!”} 

FWIW, I am not necessarily proposing we implement that. I am trying to point 
out that your templating approach doesn’t really seem to be tied to JSON, so 
calling it JsonLogstashLayout seems a bit misleading. I could just as easily 
imagine an XML template with xml resolvers. 

Also, I must admit I probably would have implemented the resolvers differently. 
It seems to me that each “entity" is going to return either a String, a number, 
a Map, or an array.  So I would have just had the resolver return its key and 
its data and left calling the jsonGenerator to the class that calls all the 
resolvers. Then you could have reused the same resolvers to generate XML. At 
least, that is the path I would have tried to go down. Obviously I have only 
glanced at your code so it could be more challenging than it appears.

Anyway, those are just my first random thoughts after looking at what the 
layout does.

Ralph





Reply via email to