日志框架系列讲解文章
日志框架 - 基于spring-boot - 使用入门
日志框架 - 基于spring-boot - 设计
日志框架 - 基于spring-boot - 实现1 - 配置文件
日志框架 - 基于spring-boot - 实现2 - 消息定义及消息日志打印
日志框架 - 基于spring-boot - 实现3 - 关键字与三种消息解析器
日志框架 - 基于spring-boot - 实现4 - HTTP请求拦截
日志框架 - 基于spring-boot - 实现5 - 线程切换
日志框架 - 基于spring-boot - 实现6 - 自动装配
上一篇我们讲了日志框架实现的第一部分:配置文件
本篇讲日志框架实现的第二部分:消息定义及消息日志打印
消息定义
对于设计中提及的核心概念消息,代码中定义如下。
/**
* 消息
*/
public class Message {
private Object content;
private MessageType type;
public Object getContent() {
return content;
}
public void setContent(Object content) {
this.content = content;
}
public MessageType getType() {
return type;
}
public void setType(MessageType type) {
this.type = type;
}
}
/**
* 消息类型
*/
public enum MessageType {
XML, JSON, KEY_VALUE, TEXT, NONE
}
消息日志的打印
在设计中讲到:提供一个@MessageToLog注解,在函数上使用,将函数的返回值视作消息(Message),打印到消息日志中。
消息日志的打印功能,主要由@MessageToLog注解结合Spring的AOP方式实现。@MessageToLog注解定义如下。
/**
* 在方法使用本注解,返回值会被视为报文记录到报文日志中。
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MessageToLog {
String value() default "";
String addition() default "";
}
然后定义切面与相应的操作,对使用了@MessageToLog的函数的返加回值进行额外操作,写入报文日志。代码如下。
/**
* 针对MessageToLog注解的切面
*/
@Aspect
public class MessageToLogAspect {
private static Logger logger =
LoggerFactory.getLogger(MessageToLogAspect.class);
private ObjectMapper mapper = new ObjectMapper();
@AfterReturning(
value = "@annotation(annotation)",
returning = "message")
public void doMessageToLog(MessageToLog annotation, Object message) {
String messageText;
if (message instanceof String) {
messageText = ((String) message).replaceAll("\n|\r|\t", "");
} else if (message instanceof Document) {
messageText = ((Document) message).asXML();
} else {
try {
messageText = mapper.writeValueAsString(message);
} catch (JsonProcessingException e) {
messageText = "";
}
}
String additionStr = annotation.addition();
logger.info("{} {}", additionStr, messageText);
}
}
至此,消息日志打印功能已经实现。