摘要:問題描述監控系統新系統起步,旨在監控原有系統的各種問題。實現思考日志問題與之前的映射問題不同。定義用對該日志對象進行裝飾。然后就可以在相應的方法中添加我們的邏輯,如在的方法中向我們的日志監控服務推送消息。
問題描述 監控系統
新系統起步,旨在監控原有系統的各種問題。主要的一部分,就是監視原有系統的日志。
日志,是Java企業級應用開發必不可少的一部分,市場上有諸多日志框架。我們選用slf4j。
日志有以下級別:
TRACE, DEBUG, INFO, WARN, ERROR
我們期待,當系統運行時打印了WARN或ERROR級別的日志時,向我們的服務器推送消息。使得我們可以分析日志,構造更完整的系統。
實現 思考日志問題與之前的Hibernate映射問題不同。
Hibernate映射問題是默認用這個類,然后我們可以利用Spring Boot為我們提供的配置,當去映射名稱的時候調用我這個類。
我們的日志是這么寫的:
private static final Logger logger = LoggerFactory.getLogger(xxxx.class);
對象都是從LoggerFactory那創建出來的,我們根本沒辦法從配置中下手。
自定義日志新建日志類YunzhiLogger,去實現org.slf4j.Logger接口。
這是Logger接口的源碼,一共有61個方法,我們一一去實現是不現實的,根據面向對象大法,我們應該去找一個合適的父類去繼承,然后重寫不符合我們要求的方法。
package org.slf4j; public interface Logger { final public String ROOT_LOGGER_NAME = "ROOT"; public String getName(); public boolean isTraceEnabled(); public void trace(String msg); public void trace(String format, Object arg); public void trace(String format, Object arg1, Object arg2); public void trace(String format, Object... arguments); public void trace(String msg, Throwable t); public boolean isTraceEnabled(Marker marker); public void trace(Marker marker, String msg); public void trace(Marker marker, String format, Object arg); public void trace(Marker marker, String format, Object arg1, Object arg2); public void trace(Marker marker, String format, Object... argArray); public void trace(Marker marker, String msg, Throwable t); public boolean isDebugEnabled(); public void debug(String msg); public void debug(String format, Object arg); public void debug(String format, Object arg1, Object arg2); public void debug(String format, Object... arguments); public void debug(String msg, Throwable t); public boolean isDebugEnabled(Marker marker); public void debug(Marker marker, String msg); public void debug(Marker marker, String format, Object arg); public void debug(Marker marker, String format, Object arg1, Object arg2); public void debug(Marker marker, String format, Object... arguments); public void debug(Marker marker, String msg, Throwable t); public boolean isInfoEnabled(); public void info(String msg); public void info(String format, Object arg); public void info(String format, Object arg1, Object arg2); public void info(String format, Object... arguments); public void info(String msg, Throwable t); public boolean isInfoEnabled(Marker marker); public void info(Marker marker, String msg); public void info(Marker marker, String format, Object arg); public void info(Marker marker, String format, Object arg1, Object arg2); public void info(Marker marker, String format, Object... arguments); public void info(Marker marker, String msg, Throwable t); public boolean isWarnEnabled(); public void warn(String msg); public void warn(String format, Object arg); public void warn(String format, Object... arguments); public void warn(String format, Object arg1, Object arg2); public void warn(String msg, Throwable t); public boolean isWarnEnabled(Marker marker); public void warn(Marker marker, String msg); public void warn(Marker marker, String format, Object arg); public void warn(Marker marker, String format, Object arg1, Object arg2); public void warn(Marker marker, String format, Object... arguments); public void warn(Marker marker, String msg, Throwable t); public boolean isErrorEnabled(); public void error(String msg); public void error(String format, Object arg); public void error(String format, Object arg1, Object arg2); public void error(String format, Object... arguments); public void error(String msg, Throwable t); public boolean isErrorEnabled(Marker marker); public void error(Marker marker, String msg); public void error(Marker marker, String format, Object arg); public void error(Marker marker, String format, Object arg1, Object arg2); public void error(Marker marker, String format, Object... arguments); public void error(Marker marker, String msg, Throwable t); }找父類
粗略地閱讀了一下LoggerFactory中getLogger的源代碼。
里面有很多的條件,先根據條件獲取ILoggerFactory,該接口一共有三個實現類,實現類中再去定義不同的getLogger方法,不同的工廠獲取出來的日志對象是不同的。
因為對日志框架不是很了解,如果我們隨便找一個類繼承,那slf4j的判斷就失去意義了,所以此種方法行不通。
裝飾器模式我們想到了裝飾器模式。
將一個對象進行裝飾,完善其方法。
先將Logger中的方法都實現掉,然后定義私有變量logger,定義有參構造函數。
定義logger用YunzhiLogger對該日志對象進行裝飾。
private static final Logger logger = new YunzhiLogger(LoggerFactory.getLogger(xxxx.class));
借此,也理解了裝飾器模式的應用場景。原來就想,裝飾器實現的功能用繼承不就能實現嗎?為什么還要去裝飾對象呢?直接繼承父類然后調用super上的方法再加新功能不和這一樣嗎?
現在也明白了,有時候,我們找不到合適的父類(因為創造出的日志對象是根據不同條件new不同的類創造出來的),然后我們又想去給這個對象添加方法,沒辦法,只能修飾對象了。
或者有時候,找到父類,但是父類是final,沒法繼承,才用的裝飾器模式。
裝飾方法首先,調用原logger方法進行默認實現。
package com.mengyunzhi.measurement.log; import org.slf4j.Logger; import org.slf4j.Marker; /** * @author zhangxishuo on 2018/11/15 */ public class YunzhiLogger implements Logger { private Logger logger; public YunzhiLogger(Logger logger) { this.logger = logger; } @Override public String getName() { return this.logger.getName(); } @Override public boolean isTraceEnabled() { return this.logger.isTraceEnabled(); } @Override public void trace(String msg) { this.logger.trace(msg); } @Override public void trace(String format, Object arg) { this.logger.trace(format, arg); } @Override public void trace(String format, Object arg1, Object arg2) { this.logger.trace(format, arg1, arg2); } @Override public void trace(String format, Object... arguments) { this.logger.trace(format, arguments); } @Override public void trace(String msg, Throwable t) { this.logger.trace(msg, t); } @Override public boolean isTraceEnabled(Marker marker) { return this.logger.isTraceEnabled(marker); } @Override public void trace(Marker marker, String msg) { this.logger.trace(marker, msg); } @Override public void trace(Marker marker, String format, Object arg) { this.logger.trace(marker, format, arg); } @Override public void trace(Marker marker, String format, Object arg1, Object arg2) { this.logger.trace(marker, format, arg1, arg2); } @Override public void trace(Marker marker, String format, Object... argArray) { this.logger.trace(marker, format, argArray); } @Override public void trace(Marker marker, String msg, Throwable t) { this.logger.trace(marker, msg, t); } @Override public boolean isDebugEnabled() { return this.logger.isDebugEnabled(); } @Override public void debug(String msg) { this.logger.debug(msg); } @Override public void debug(String format, Object arg) { this.logger.debug(format, arg); } @Override public void debug(String format, Object arg1, Object arg2) { this.logger.debug(format, arg1, arg2); } @Override public void debug(String format, Object... arguments) { this.logger.debug(format, arguments); } @Override public void debug(String msg, Throwable t) { this.logger.debug(msg, t); } @Override public boolean isDebugEnabled(Marker marker) { return this.logger.isDebugEnabled(marker); } @Override public void debug(Marker marker, String msg) { this.logger.debug(marker, msg); } @Override public void debug(Marker marker, String format, Object arg) { this.logger.debug(marker, format, arg); } @Override public void debug(Marker marker, String format, Object arg1, Object arg2) { this.logger.debug(marker, format, arg1, arg2); } @Override public void debug(Marker marker, String format, Object... arguments) { this.logger.debug(marker, format, arguments); } @Override public void debug(Marker marker, String msg, Throwable t) { this.logger.debug(marker, msg, t); } @Override public boolean isInfoEnabled() { return this.logger.isInfoEnabled(); } @Override public void info(String msg) { this.logger.info(msg); } @Override public void info(String format, Object arg) { this.logger.info(format, arg); } @Override public void info(String format, Object arg1, Object arg2) { this.logger.info(format, arg1, arg2); } @Override public void info(String format, Object... arguments) { this.logger.info(format, arguments); } @Override public void info(String msg, Throwable t) { this.logger.info(msg, t); } @Override public boolean isInfoEnabled(Marker marker) { return this.logger.isInfoEnabled(marker); } @Override public void info(Marker marker, String msg) { this.logger.info(marker, msg); } @Override public void info(Marker marker, String format, Object arg) { this.logger.info(marker, format, arg); } @Override public void info(Marker marker, String format, Object arg1, Object arg2) { this.logger.info(marker, format, arg1, arg2); } @Override public void info(Marker marker, String format, Object... arguments) { this.logger.info(marker, format, arguments); } @Override public void info(Marker marker, String msg, Throwable t) { this.logger.info(marker, msg, t); } @Override public boolean isWarnEnabled() { return this.logger.isWarnEnabled(); } @Override public void warn(String msg) { this.logger.warn(msg); } @Override public void warn(String format, Object arg) { this.logger.warn(format, arg); } @Override public void warn(String format, Object... arguments) { this.logger.warn(format, arguments); } @Override public void warn(String format, Object arg1, Object arg2) { this.logger.warn(format, arg1, arg2); } @Override public void warn(String msg, Throwable t) { this.logger.warn(msg, t); } @Override public boolean isWarnEnabled(Marker marker) { return this.logger.isWarnEnabled(marker); } @Override public void warn(Marker marker, String msg) { this.logger.warn(marker, msg); } @Override public void warn(Marker marker, String format, Object arg) { this.logger.warn(marker, format, arg); } @Override public void warn(Marker marker, String format, Object arg1, Object arg2) { this.logger.warn(marker, format, arg1, arg2); } @Override public void warn(Marker marker, String format, Object... arguments) { this.logger.warn(marker, format, arguments); } @Override public void warn(Marker marker, String msg, Throwable t) { this.logger.warn(marker, msg, t); } @Override public boolean isErrorEnabled() { return this.logger.isErrorEnabled(); } @Override public void error(String msg) { this.logger.error(msg); } @Override public void error(String format, Object arg) { this.logger.error(format, arg); } @Override public void error(String format, Object arg1, Object arg2) { this.logger.error(format, arg1, arg2); } @Override public void error(String format, Object... arguments) { this.logger.error(format, arguments); } @Override public void error(String msg, Throwable t) { this.logger.error(msg, t); } @Override public boolean isErrorEnabled(Marker marker) { return this.logger.isErrorEnabled(marker); } @Override public void error(Marker marker, String msg) { this.logger.error(marker, msg); } @Override public void error(Marker marker, String format, Object arg) { this.logger.error(marker, format, arg); } @Override public void error(Marker marker, String format, Object arg1, Object arg2) { this.logger.error(marker, format, arg1, arg2); } @Override public void error(Marker marker, String format, Object... arguments) { this.logger.error(marker, format, arguments); } @Override public void error(Marker marker, String msg, Throwable t) { this.logger.error(marker, msg, t); } }
這是我為裝飾器添加的默認實現,如有錯誤,歡迎批評指正。
然后就可以在相應的方法中添加我們的邏輯,如在error的方法中向我們的日志監控服務推送消息。
總結通過對slf4j源碼的學習大致學習了日志框架slf4j的運行原理。
通過找接口與父類理解了裝飾器模式的應用場景。
本文只是實現了基本的功能,因為error方法與warn方法有很多重載的方法,所以我們期待可以實現對該日志類中所有名為error與warn的方法進行切面處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72208.html
摘要:這篇文章是邊聽尚硅谷的課程邊記的筆記,也是為了之后方便查看,視頻鏈接精彩的故事小張負責一個大型系統的開發,為了監控系統的運行狀況,系統中包含大量的語句,為了更好地管理呢,小張決定寫一個日志框架對日志進行管理,他設想的日志框架應該包含以下幾個 這篇文章是邊聽尚硅谷的課程邊記的筆記,也是為了之后方便查看,視頻鏈接:https://www.bilibili.com/vide... 1. 精彩...
摘要:本文主要介紹如何使用這個可以直接顯示完整的日志框架,希望對大家能有所幫助。當設置為或時,意味關閉記錄。 在常規項目的開發中可能最容易出問題的地方就在于對數據庫的處理了,在大部分的環境下,我們對數據庫的操作都是使用流行的框架,比如 Hibernate 、 MyBatis 等。由于各種原因,我們有時會想知道在這些框架下實際執行的 SQL 究竟是什么。 雖然 Hibernate 可以在配置...
摘要:本文主要介紹如何使用這個可以直接顯示完整的日志框架,希望對大家能有所幫助。當設置為或時,意味關閉記錄。 在常規項目的開發中可能最容易出問題的地方就在于對數據庫的處理了,在大部分的環境下,我們對數據庫的操作都是使用流行的框架,比如 Hibernate 、 MyBatis 等。由于各種原因,我們有時會想知道在這些框架下實際執行的 SQL 究竟是什么。 雖然 Hibernate 可以在配置...
閱讀 2553·2021-11-23 09:51
閱讀 3354·2021-11-22 15:22
閱讀 1868·2021-11-18 13:22
閱讀 2235·2021-09-24 09:48
閱讀 1308·2019-08-29 13:58
閱讀 1297·2019-08-26 13:39
閱讀 2445·2019-08-26 10:48
閱讀 3029·2019-08-26 10:21