日志框架 - 基于spring-boot - 實(shí)現(xiàn)2 - 消息定義及消息日志打印

日志框架系列講解文章
日志框架 - 基于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é)合SpringAOP方式實(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)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,070評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 見你時(shí),一切對(duì)于我來(lái)說(shuō)都是剛剛好 而一切對(duì)于你來(lái)說(shuō)都是不合適 從未發(fā)現(xiàn)與一個(gè)人見面會(huì)如此困難 能見上一面就會(huì)像中了...
    hgfyui閱讀 276評(píng)論 0 0
  • 基本問(wèn)題解釋(網(wǎng)絡(luò)環(huán)境條件正常情況下) 域名和IP的數(shù)量關(guān)系?一個(gè)IP在DNS上可以注冊(cè)多個(gè)域名。 瀏覽器是否通過(guò)...
    he_321閱讀 375評(píng)論 0 3
  • 【姥姥語(yǔ)錄】“打仗不帶翻小腸兒的”(打仗=打架)意思約等于“君子絕交不出惡言”倆人兒好的時(shí)候給的東西不能因?yàn)榇蚣芰?..
    xxyuer閱讀 442評(píng)論 0 0

友情鏈接更多精彩內(nèi)容