...
There are developer details on using the libraries (pom.xml edits, spring AOP additions) and how to deploy the logdemo pod alongside onap that demos using the libraries
https://wikilf-onap.onapatlassian.orgnet/wiki/pages/viewpage.action?pageId=28378955#ONAPApplicationLoggingSpecificationv116278511#ONAPApplicationLoggingSpecificationv1.2(Casablanca)-DeveloperGuide
The code is ready for use as we finish the library (java is most up to date for now, python is in progress)
...
Until then you can continue to use the same logback.xml used by other components that already log like portal/policy/aai/vid/clamp
https://gerrit.onap.org/r/#/c/62405
Code Block |
---|
language | java |
---|
theme | Midnight |
---|
linenumbers | true |
---|
|
#WIP |
.onap.org/r/#/c/62405
Code Block |
---|
language | java |
---|
theme | Midnight |
---|
linenumbers | true |
---|
|
#20180925
<!-- MDC and MARKER specific for Cassablanca -->
<property name="LogTimestamp" value="%d{"yyyy-MM-dd'T'HH:mm:ss.SSSXXX", UTC}"/>
<property name="Level" value="%.-5level"/>
<property name="Logger" value="%logger"/>
<property name="Mdc" value="%replace(%replace(%mdc){'\t','\\\\t'}){'\n','\\\\n'}"/>
<property name="Message" value="%replace(%replace(%msg){'\t','\\\\t'}){'\n','\\\\n'}"/>
<property name="RootException" value="%replace(%replace(%rootException){'\t', '\\\\t'}){'\n','\\\\n'}"/>
<property name="Marker" value="%replace(%replace(%marker){'\t','\\\\t'}){'\n','\\\\n'}"/>
<property name="Thread" value="%thread"/>
<!-- indexed -->
<!-- for Casablanca we support both position dependent pipe delimited - and position independent KVP MDCs -->
<property name="p_1_LogTimestamp" value="${LogTimestamp}" />
<property name="p_2_EntryTimestamp" value="%X{EntryTimestamp}" />
<property name="p_3_InvokeTimestamp" value="%X{InvokeTimestamp}" />
<property name="p_4_RequestID" value="%X{RequestId}" />
<property name="p_5_InvocationID" value="%X{InvocationId}" />
<property name="p_6_InstanceID" value="%X{InstanceUUID}" /> <!-- previously InstanceUUID -->
<property name="p_7_ServiceInstanceID" value="%X{ServiceInstanceId}" />
<property name="p_8_thread" value="${Thread}" />
<property name="p_9_ServiceName" value="%X{ServiceName}" />
<property name="p_10_PartnerName" value="%X{PartnerName}" />
<property name="p_11_StatusCode" value="%X{StatusCode}" />
<property name="p_12_ResponseCode" value="%X{ResponseCode}" />
<property name="p_13_ResponseDesc" value="%X{ResponseDesc}" />
<property name="p_14_level" value="${Level}" />
<property name="p_15_Severity" value="%X{Severity}" />
<property name="p_16_ServerIPAddress" value="%X{ServerIPAddress}" />
<property name="p_17_ElapsedTime" value="%X{ElapsedTime}" />
<property name="p_18_ServerFQDN" value="%X{ServerFQDN}" />
<property name="p_19_ClientIPAddress" value="%X{ClientIPAddress}" />
<property name="p_20_VirtualServerName" value="%X{VirtualServerName}" />
<property name="p_21_ContextName" value="%X{ContextName}" />
<property name="p_22_TargetEntity" value="%X{TargetEntity}" />
<property name="p_23_TargetServiceName" value="%X{TargetServiceName}" />
<property name="p_24_TargetElement" value="%X{TargetElement}" />
<property name="p_25_User" value="%X{User}" />
<property name="p_26_logger" value="${Logger}" />
<property name="p_27_mdc" value="${Mdc}" />
<property name="p_28_message" value="${Message}" />
<property name="p_29_marker" value="${Marker}" />
<property name="pattern"
value="%nopexception${p_1_LogTimestamp}|${p_2_EntryTimestamp}|${p_3_InvokeTimestamp}|${p_4_RequestID}|${p_5_InvocationID}|${p_6_InstanceID}|${p_7_ServiceInstanceID}|${p_8_thread}|${p_9_ServiceName}|${p_10_PartnerName}|${p_11_StatusCode}|${p_12_ResponseCode}|${p_13_ResponseDesc}|${p_14_level}|${p_15_Severity}|${p_16_ServerIPAddress}|${p_17_ElapsedTime}|${p_18_ServerFQDN}|${p_19_ClientIPAddress}|${p_20_VirtualServerName}|${p_21_ContextName}|${p_22_TargetEntity}|${p_23_TargetServiceName}|${p_24_TargetElement}|${p_25_User}|${p_26_logger}|${p_27_mdc}|${p_28_message}|${p_29_marker}%n" />
|
spring.xml
Code Block |
---|
|
<aop:aspectj-autoproxy />
<beans>
<bean class="org.onap.demo.logging.LoggingAspect" /> <!-- required even though we annotate with @Aspect -->
</beans> |
...
Code Block |
---|
language | java |
---|
theme | Midnight |
---|
|
package org.onap.demo.logging;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.onap.logging.ref.slf4j.ONAPLogAdapter;
import org.slf4j.LoggerFactory;
@Aspect
public class LoggingAspect {
@Before("execution(* org.onap.demo.logging.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
Object servletRequest = args[0];
ONAPLogAdapter.HttpServletRequestAdapter requestAdapter =
new ONAPLogAdapter.HttpServletRequestAdapter((HttpServletRequest)servletRequest);
final ONAPLogAdapter adapter = new ONAPLogAdapter(
LoggerFactory.getLogger(joinPoint.getTarget().getClass()));
try {
adapter.entering(requestAdapter);
} finally {
}
}
@After("execution(* org.onap.demo.logging.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
final ONAPLogAdapter adapter = new ONAPLogAdapter(
LoggerFactory.getLogger(joinPoint.getTarget().getClass()));
adapter.exiting();
}
}
|
Logging Demo REST API
Code Block |
---|
|
curl http://dev.onap.info:30453/logging-demo/rest/health/health |
Logging Results
Use Case: Single REST call - with ENTRY/EXIT Markers around in-method log
The key here is that you get logs for free - the entry/exit lines are generated - the line in the middle is from java application code
Code Block |
---|
|
results - still working on passing in the servlet request
INFO: Reloading Context with name [/logging-demo] is completed
2018-07-09T14:48:01.014Z http-nio-8080-exec-8 INFO org.onap.demo.logging.ApplicationService
InstanceUUID=67bc4b12-56a1-4b62-ab78-0c8ca8834383,
RequestID=023af35a-b281-49c4-bf13-5167b1453780,
ServiceName=/logging-demo/rest/health/health,
InvocationID=94dc9e24-3722-43e5-8995-12f95e153ca3,
InvokeTimestamp=2018-07-09T14:48:01.008Z,
PartnerName=,
ClientIPAddress=0:0:0:0:0:0:0:1,
ServerFQDN=localhost ENTRY
2018-07-09T14:48:01.014Z http-nio-8080-exec-8 INFO org.onap.demo.logging.ApplicationService
InstanceUUID=67bc4b12-56a1-4b62-ab78-0c8ca8834383,
RequestID=023af35a-b281-49c4-bf13-5167b1453780,
ServiceName=/logging-demo/rest/health/health,
InvocationID=94dc9e24-3722-43e5-8995-12f95e153ca3,
InvokeTimestamp=2018-07-09T14:48:01.008Z,
PartnerName=,
ClientIPAddress=0:0:0:0:0:0:0:1,
ServerFQDN=localhost Running /health
2018-07-09T14:48:01.015Z http-nio-8080-exec-8 INFO org.onap.demo.logging.ApplicationService
ResponseCode=,
InstanceUUID=67bc4b12-56a1-4b62-ab78-0c8ca8834383,
RequestID=023af35a-b281-49c4-bf13-5167b1453780,
ServiceName=/logging-demo/rest/health/health,
ResponseDescription=,
InvocationID=94dc9e24-3722-43e5-8995-12f95e153ca3,
Severity=,
InvokeTimestamp=2018-07-09T14:48:01.008Z,
PartnerName=,
ClientIPAddress=0:0:0:0:0:0:0:1,
ServerFQDN=localhost,
StatusCode= EXIT |
...
Code Block |
---|
language | java |
---|
theme | Midnight |
---|
|
Tomcat v8.5 Server at localhost [Apache Tomcat]
org.apache.catalina.startup.Bootstrap at localhost:51622
Daemon Thread [http-nio-8080-exec-1] (Suspended (breakpoint at line 41 in LoggingAspect))
owns: NioEndpoint$NioSocketWrapper (id=147)
LoggingAspect.logBefore(JoinPoint) line: 41
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 498
AspectJMethodBeforeAdvice(AbstractAspectJAdvice).invokeAdviceMethodWithGivenArgs(Object[]) line: 629
AspectJMethodBeforeAdvice(AbstractAspectJAdvice).invokeAdviceMethod(JoinPointMatch, Object, Throwable) line: 611
AspectJMethodBeforeAdvice.before(Method, Object[], Object) line: 43
MethodBeforeAdviceInterceptor.invoke(MethodInvocation) line: 51
JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 213
$Proxy51.health(HttpServletRequest) line: not available
RestHealthServiceImpl.getHealth() line: 48
ServerRuntime$2.run() line: 326
WebComponent.service(URI, URI, HttpServletRequest, HttpServletResponse) line: 427
ServletContainer.service(URI, URI, HttpServletRequest, HttpServletResponse) line: 388
|
Deployment
Deploying demo pod
Helm Deployment
...
Code Block |
---|
|
config:
logstashServiceName: log-ls
logstashPort: 5044 |
ELK Configuration
Logstash
Grok
Jira Legacy |
---|
server | System Jira |
---|
serverId | 4733707d-2057-3a0f-ae5e-4fd8aff50176 |
---|
key | LOG-490 |
---|
|
ElasticSearch
Kibana
Design Issues
DI 8: Log Collection
...