blob: 2847354d69e5a8bc8d2fc744250e5d592bf7efdb [file] [log] [blame]
/*-
* ============LICENSE_START=======================================================
* OSAM
* ================================================================================
* Copyright (C) 2018 AT&T
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END=========================================================
*/
package org.onap.osam.logging;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.onap.portalsdk.core.logging.aspect.EELFLoggerAdvice;
import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
import org.onap.portalsdk.core.util.SystemProperties;
import org.springframework.beans.factory.annotation.Autowired;
import java.net.InetAddress;
import java.net.UnknownHostException;
import static com.att.eelf.configuration.Configuration.MDC_SERVER_FQDN;
@Aspect
@org.springframework.context.annotation.Configuration
public class VidLoggerAspect {
private String canonicalHostName;
@Autowired
EELFLoggerAdvice advice;
public VidLoggerAspect() {
try {
final InetAddress localHost = InetAddress.getLocalHost();
canonicalHostName = localHost.getCanonicalHostName();
} catch (UnknownHostException e) {
// YOLO
canonicalHostName = null;
}
}
@Pointcut("execution(public * org.onap.osam.controller.*Controller.*(..))")
public void vidControllers() {}
@Around("vidControllers() && (" +
" @within(org.onap.portalsdk.core.logging.aspect.AuditLog)" +
" || @annotation(org.onap.portalsdk.core.logging.aspect.AuditLog)" +
" || @annotation(org.springframework.web.bind.annotation.RequestMapping)" +
")")
public Object logAuditMethodClassAround(ProceedingJoinPoint joinPoint) throws Throwable {
return logAroundMethod(joinPoint, SystemProperties.SecurityEventTypeEnum.INCOMING_REST_MESSAGE);
}
private Object logAroundMethod(ProceedingJoinPoint joinPoint, SystemProperties.SecurityEventTypeEnum securityEventType) throws Throwable {
//Before
Object[] passOnArgs = new Object[] {joinPoint.getSignature().getDeclaringType().getName(),joinPoint.getSignature().getName()};
Object[] returnArgs = advice.before(securityEventType, joinPoint.getArgs(), passOnArgs);
fixServerFqdnInMDC();
//Execute the actual method
Object result;
String restStatus = "COMPLETE";
try {
result = joinPoint.proceed();
} catch(Exception e) {
restStatus = "ERROR";
throw e;
} finally {
fixStatusCodeInMDC(restStatus);
advice.after(securityEventType, restStatus, joinPoint.getArgs(), returnArgs, passOnArgs);
}
return result;
}
// Set the status code into MDC *before* the metrics log is written by advice.after()
private void fixStatusCodeInMDC(String restStatus) {
EELFLoggerDelegate.mdcPut(SystemProperties.STATUS_CODE, restStatus);
}
// Override the non-canonical hostname set by EELFLoggerDelegate::setGlobalLoggingContext()
// that was invoked by advice.before() (and some other SDK cases)
private void fixServerFqdnInMDC() {
if (!StringUtils.isBlank(canonicalHostName)) {
EELFLoggerDelegate.mdcPut(MDC_SERVER_FQDN, canonicalHostName);
}
}
}