本文共 1940 字,大约阅读时间需要 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)@Documentedpublic @interface MessageToLog { String value() default ""; String addition() default "";}
然后定义切面与相应的操作,对使用了@MessageToLog的函数的返加回值进行额外操作,写入报文日志。代码如下。
/** * 针对MessageToLog注解的切面 */@Aspectpublic 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); }}
至此,消息日志打印功能已经实现。
转载地址:http://mshna.baihongyu.com/