Examples
Markers
Markers unambiguously assign semantics to individual log messages. They allow messages that have a specific meaning to be cheaply and easily identified in logger output, without inherently unreliable (and more costly, and less easily enforced) schemes like scanning for magic strings in the text of each log message.
ONAP logging requires the emission of Markers reporting entry, exit and invocation as the execution of requests pass between ONAP components. This information is used to generate a call graph.
ONAP components are also free to use Markers for their own purposes. Any Markers that are logged will be automatically indexed by Logstash.
Markers differ from MDCs in two important ways:
They have a name, but no value. They are a tag - like a label.
They are specified explicitly on invocation. They are not ThreadLocal, and they do not propagate.
EELF's implementation can be modified to emit Markers, but its public APIs do not allow them to be passed in by callers.
see code on reference folder in git clone ssh://michaelobrien@gerrit.onap.org:29418/logging-analytics
Examples
Marker formatting is using tabs - LOG-553: Entry/exit marker formatting delimiters - logback.xml uses tabs currentlyClosed - see https://git.onap.org/logging-analytics/tree/reference/logging-slf4j/src/test/resources/logback.xml#n9
Note there are 3 tabs (see p_mak in logback.xml) delimiting the MARKERS (ENTRY and EXIT) at the end of each line
<property name="p_mak" value="%replace(%replace(%marker){'\t', '\\\\t'}){'\n','\\\\n'}"/>
2018-07-05T20:21:34.794Z http-nio-8080-exec-2 INFO org.onap.demo.logging.ApplicationService InstanceID=ede7dd52-91e8-45ce-9406-fbafd17a7d4c, RequestID=f9d8bb0f-4b4b-4700-9853-d3b79d861c5b, ServiceName=/logging-demo/rest/health/health, InvocationID=8f4c1f1d-5b32-4981-b658-e5992f28e6c8, InvokeTimestamp=2018-07-05T20:21:26.617Z, PartnerName=, ClientIPAddress=0:0:0:0:0:0:0:1, ServerFQDN=localhost ENTRY
2018-07-05T20:22:09.268Z http-nio-8080-exec-2 INFO org.onap.demo.logging.ApplicationService ResponseCode=, InstanceID=ede7dd52-91e8-45ce-9406-fbafd17a7d4c, RequestID=f9d8bb0f-4b4b-4700-9853-d3b79d861c5b, ServiceName=/logging-demo/rest/health/health, ResponseDescription=, InvocationID=8f4c1f1d-5b32-4981-b658-e5992f28e6c8, Severity=, InvokeTimestamp=2018-07-05T20:21:26.617Z, PartnerName=, ClientIPAddress=0:0:0:0:0:0:0:1, ServerFQDN=localhost, StatusCode= EXIT
Logging
Via SLF4J:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
// ...
final Logger logger = LoggerFactory.getLogger(this.getClass());
final Marker marker = MarkerFactory.getMarker("MY_MARKER");
logger.warn(marker, "This warning has a 'MY_MARKER' annotation.");
EELF does not allow Markers to be set directly. See notes on the InvocationID MDC.
Serializing
Marker names also need to be escaped, though they're much less likely to contain problematic characters than MDC values.
Escaping in Logback configuration can be achieved with:
%replace(%replace(%marker){'\t','\\\\t'}){'\n','\\\\n'}
Marker - ENTRY
TODO: add table detailing which log files each marker is a part of - from a use case perspective
This should be reported as early in invocation as possible, immediately after setting the RequestID and InvocationID MDCs.
It can be automatically set by EELF, and written to the AUDIT log.
It must be manually set otherwise. Candidate for framework
EELF:
EELF
SLF4J:
SLF4J
Marker - EXIT
This should be reported as late in invocation as possible, immediately before unsetting the RequestID and InvocationID MDCs.
It can be automatically reported by EELF, and written to the METRICS log.
It must be manually set otherwise.
EELF:
EELF
SLF4J:
SLF4J
Marker - INVOKE
This should be reported by the caller of another ONAP component via REST, including a newly allocated InvocationID, which will be passed to the caller.
SLF4J:
SLF4J
EELF examples of INVOCATION_ID reporting, without changing published APIs.
Marker - INVOKE-RETURN
This should be reported by the caller of another ONAP component via REST on return.
InvokeTimestamp context dependent MDC will be reported here.
SLF4J:
SLF4J
Marker - INVOKE-SYNCHRONOUS
This should accompany INVOKE when the invocation is synchronous.
SLF4J:
SLF4J
EELF example of SYNCHRONOUS reporting, without changing published APIs.
Errorcodes
Errorcodes are reported as MDCs.
TODO: add to table
Exceptions should be accompanied by an errrorcode. Typically this is achieved by incorporating errorcodes into your exception hierarchy and error handling. ONAP components generally do not share this kind of code, though EELF defines a marker interface (meaning it has no methods) EELFResolvableErrorEnum.
A common convention is for errorcodes to have two components:
A prefix, which identifies the origin of the error.
A suffix, which identifies the kind of error.
Suffixes may be numeric or text. They may also be common to more than one component.