rgoers edited a comment on pull request #770:
URL: https://github.com/apache/logging-log4j2/pull/770#issuecomment-1072974525


   Ok. So your big mistake here is trying to do this with the SLF4J API. It 
wasn't designed to support structured event logging. I fought for that years 
ago and gave up and that was one of the reasons I created Log4j 2. You really 
want to use a MapMessage or extend it. I have teams that are doing exactly this 
to capture data to display in Kibana dashboards. WE still use Markers, but the 
Marker simply identifies it a) as an event and b) the type of event. The second 
could have been captured in the event itself. 
   
   This is the code that logs generates the event.
   
   ```
       public void recordInbound(Inbound in, Vendors vendor) {
           InboundLogEntry inboundLogEntry = new InboundLogEntry();
           inboundLogEntry.setVendor(vendor.name());
           inboundLogEntry.setInbound(true);
           inboundLogEntry.setDestination(in.getDestination());
           inboundLogEntry.setRefId(in.getId());
           inboundLogEntry.setMediaUrls(in.getMediaUrls());
           inboundLogEntry.setSource(in.getSource());
           inbound.ogEntry.setMessageId(in.getMessageId());
           inboundLogEntry.logEvent();
       }
   ```
   and here is the logEvent method.
   ```
       public void logEvent() {
           StackTraceElement element = StackLocatorUtil.getStackTraceElement(2);
           
LOGGER.atInfo().withLocation(element).withMarker(INBOUND_EVENT).log(this);
       }
   ```
   Note that a detached marker is not required as all the variable data is in 
the event.
   
   Finally, in the logging configuration we use JsonTemplateLayout and include 
in the template
   ```
     "event.action": {
       "$resolver": "marker",
       "field": "name"
     },
     "event.data": {
       "$resolver": "map",
       "stringified": true
     },
   ```
   So the Marker will be logged as the event.action field and all the data will 
be included as attributes under event.data - such as event.data.vendor, 
event.data.destination, etc.
   
   So this is exactly why I am not in favor of merging this PR as the Log4j API 
is much richer than SLF4J. You do not need to convert your whole application to 
use SLF4J but you should modify anything generating structured events.
   
   I should also mention that @jvz looked into structured event logging with 
SLF4J and found a framework that does it, but it is a complete hack to get 
around the limitations of SLF4J.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@logging.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to