记录一下项目在使用的日志打印功能
@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>
\