日志框架系列講解文章
日志框架 - 基于spring-boot - 使用入門
日志框架 - 基于spring-boot - 設(shè)計(jì)
日志框架 - 基于spring-boot - 實(shí)現(xiàn)1 - 配置文件
日志框架 - 基于spring-boot - 實(shí)現(xiàn)2 - 消息定義及消息日志打印
日志框架 - 基于spring-boot - 實(shí)現(xiàn)3 - 關(guān)鍵字與三種消息解析器
日志框架 - 基于spring-boot - 實(shí)現(xiàn)4 - HTTP請(qǐng)求攔截
日志框架 - 基于spring-boot - 實(shí)現(xiàn)5 - 線程切換
日志框架 - 基于spring-boot - 實(shí)現(xiàn)6 - 自動(dòng)裝配
上一篇我們講了日志框架實(shí)現(xiàn)的第一部分:配置文件
本篇講日志框架實(shí)現(xiàn)的第二部分:消息定義及消息日志打印
消息定義
對(duì)于設(shè)計(jì)中提及的核心概念消息,代碼中定義如下。
/**
* 消息
*/
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
}
消息日志的打印
在設(shè)計(jì)中講到:提供一個(gè)@MessageToLog注解,在函數(shù)上使用,將函數(shù)的返回值視作消息(Message),打印到消息日志中。
消息日志的打印功能,主要由@MessageToLog注解結(jié)合Spring的AOP方式實(shí)現(xiàn)。@MessageToLog注解定義如下。
/**
* 在方法使用本注解,返回值會(huì)被視為報(bào)文記錄到報(bào)文日志中。
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MessageToLog {
String value() default "";
String addition() default "";
}
然后定義切面與相應(yīng)的操作,對(duì)使用了@MessageToLog的函數(shù)的返加回值進(jìn)行額外操作,寫入報(bào)文日志。代碼如下。
/**
* 針對(duì)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);
}
}
至此,消息日志打印功能已經(jīng)實(shí)現(xiàn)。