美文网首页
日志框架 - 基于spring-boot - 实现2 - 消息定

日志框架 - 基于spring-boot - 实现2 - 消息定

作者: 船前几度寄芳心 | 来源:发表于2018-04-28 00:05 被阅读0次

    日志框架系列讲解文章
    日志框架 - 基于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注解结合SpringAOP方式实现。@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);
        }
    }
    

    至此,消息日志打印功能已经实现。

    相关文章

      网友评论

          本文标题:日志框架 - 基于spring-boot - 实现2 - 消息定

          本文链接:https://www.haomeiwen.com/subject/uxfwlftx.html