com.vsct.supervision.notification.log.LoggingAspect.java Source code

Java tutorial

Introduction

Here is the source code for com.vsct.supervision.notification.log.LoggingAspect.java

Source

/*
 * This file is part of the Cerebro distribution.
 * (https://github.com/voyages-sncf-technologies/cerebro)
 * Copyright (C) 2017 VSCT.
 *
 * Cerebro is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, version 3 of the License.
 *
 * Cerebro is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package com.vsct.supervision.notification.log;

import java.lang.reflect.Method;

import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.boot.logging.LogLevel;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LoggingAspect {

    @Around(value = "@within(com.vsct.supervision.notification.log.Loggable) || @annotation(com.vsct.supervision.notification.log.Loggable)")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        final MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        final Method method = signature.getMethod();
        final Class clazz = signature.getClass();
        final Loggable loggableMethod = method.getAnnotation(Loggable.class);

        final Loggable loggableClass = proceedingJoinPoint.getTarget().getClass().getAnnotation(Loggable.class);

        //get current log level
        final LogLevel logLevel = loggableMethod != null ? loggableMethod.value() : loggableClass.value();

        final String service = StringUtils.isNotBlank(loggableClass.service()) ? loggableClass.service()
                : clazz.getName();
        final String methodName = StringUtils.isNotBlank(loggableClass.method()) ? loggableClass.method()
                : method.getName();

        final String star = "**********";
        //before
        LogWriter.write(proceedingJoinPoint.getTarget().getClass(), logLevel,
                star + service + "." + methodName + "() start execution" + star);

        //show traceParams
        final boolean showParams = loggableMethod != null ? loggableMethod.traceParams()
                : loggableClass.traceParams();
        if (showParams) {

            if (proceedingJoinPoint.getArgs() != null && proceedingJoinPoint.getArgs().length > 0) {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < proceedingJoinPoint.getArgs().length; i++) {
                    sb.append(method.getParameterTypes()[i].getName() + ":" + proceedingJoinPoint.getArgs()[i]);
                    if (i < proceedingJoinPoint.getArgs().length - 1)
                        sb.append(", ");
                }

                LogWriter.write(proceedingJoinPoint.getTarget().getClass(), logLevel,
                        service + "." + methodName + "() args " + sb);
            }

        }

        final long startTime = System.currentTimeMillis();
        //start method execution
        final Object result = proceedingJoinPoint.proceed();

        final long endTime = System.currentTimeMillis();

        //show results
        if (result != null) {
            boolean showResults = loggableMethod != null ? loggableMethod.traceResult()
                    : loggableClass.traceResult();
            if (showResults) {
                LogWriter.write(proceedingJoinPoint.getTarget().getClass(), logLevel,
                        service + "." + methodName + "() Result : " + result);
            }
        }

        //show after
        LogWriter.write(proceedingJoinPoint.getTarget().getClass(), logLevel, star + service + "." + methodName
                + "() finished execution and takes " + (endTime - startTime) + " millis time to execute " + star);

        return result;
    }

}