SpringBoot日志打印的配置

126 阅读1分钟

记录一下项目在使用的日志打印功能

@Order(1)
@Aspect
@Component
@Slf4j
public class LogPrintClass {
    // 记录错误日志的service,//可以无也可以有 
    @Autowired
    private ErrorRecordService errorRecordService;
​
    // 添加需要切入的切入点,根据需要进行编写
    @Around("execution(* com.ucmed.unified.controller..*(..))")
    public Object interceptor(ProceedingJoinPoint joinPoint) {
    // 该id用于追踪日志使用 可以浏览器的请求头看到X-Request-Id的字段
        String logId = UUID.randomUUID().toString().replace("-", "");
        ThreadContext.put("logId", logId);
        try {
            // 打印接口地址信息
            // 这个RequestContextHolder是Springmvc提供来获得请求的东西
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            log.info("接口地址:{} {}", request.getMethod(), request.getRequestURI());
            HttpServletResponse response = ((ServletRequestAttributes) requestAttributes).getResponse();
            if (response != null) {
                response.setHeader("X-Request-Id", requestId);
            }
        } catch (Exception e) {
            log.error("非Http请求");
        }
        Object res;
        JSONObject params = new JSONObject();
        // 打印接口方法信息
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        log.info("接口名称:{}::{}", joinPoint.getTarget().getClass().getName(), method.getName());
        try {
            String[] names = signature.getParameterNames();
            Object[] values = joinPoint.getArgs();
            if (values != null && names != null) {
                int length = Math.min(names.length, values.length);
                for (int i = 0; i < length; i++) {
                    if (!(values[i] instanceof javax.servlet.http.HttpServletRequest)
                            && !(values[i] instanceof javax.servlet.http.HttpServletResponse)
                            && !(values[i] instanceof org.springframework.web.multipart.commons.CommonsMultipartFile)
                            && !(values[i] instanceof org.springframework.web.multipart.MultipartFile)
                            && !(values[i] instanceof org.springframework.validation.BeanPropertyBindingResult)) {
                        params.put(names[i], values[i]);
                    }
                }
            }
            log.info("接口入参: " + params);
            res = joinPoint.proceed();
            if (log.isDebugEnabled()) {
                log.debug("接口返回:" + JSON.toJSONString(res));
            }
        }catch (Throwable throwable) {
            res = ResultBean.error(throwable.getMessage());
            ErrorRecord errorRecord = new ErrorRecord();
            errorRecord.setErrorMsg(throwable.getMessage() + "; " + getStackMsg(throwable)).setMethodName(method.getName()).setParameter(params.toString());
            errorRecordService.addErrorRecord(errorRecord);
            log.error("LogPrintClass 出错,信息如下:", throwable);
        }
        return res;
    }
​
    private static String getStackMsg(Throwable e) {
        StringBuffer sb = new StringBuffer();
        StackTraceElement[] stackArray = e.getStackTrace();
        for (int i = 0; i < stackArray.length; i++) {
            StackTraceElement element = stackArray[i];
            sb.append(element.toString() + "\n");
        }
        return sb.toString();
    }
}
​

日志配置文件的编写

我们使用的是logback

<configuration>
    <!--定义日志文件的存储地址logback.path在配置文件中定义 --> 
    <springProperty scope="context" name="LOG_HOME" source="logback.path"/>
    <!-- 日志的打印配置 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%magenta(%X{logId}) %cyan(%d{yyyy-MM-dd HH:mm:ss.SSS}) %highlight(%-5level) %yellow(%logger{50}):%green(%L) - %blue(%msg%n)"/>
​
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<!--            <pattern>%X{logId} - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
​
    <!-- 按照每天生成日志文件 -->
    <appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_HOME}/unified_hlwyy.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
<!--            <FileNamePattern>${LOG_HOME}/unified_hlwyy.log.%d{yyyy-MM-dd}.log</FileNamePattern>-->
            <FileNamePattern>${LOG_HOME}/unified_hlwyy-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>180</MaxHistory>
            <!-- 超过500MB自动归档 -->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>500MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%X{logId} - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
<!--    <logger name="com.ucmed.unified" level="DEBUG" dditivity="false">-->
<!--        <appender-ref ref="LOGFILE"/>-->
<!--    </logger>-->
    <!-- 日志输出级别 -->
    <springProfile name="dev,local,jdftest">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
​
    <springProfile name="!dev">
        <root level="INFO">
            <appender-ref ref="LOGFILE"/>
        </root>
    </springProfile>
</configuration>

\