1. 程式人生 > >動態調整(springMVC+slf4j)log等級(DEBUG/INFO/WARN/ERROR)

動態調整(springMVC+slf4j)log等級(DEBUG/INFO/WARN/ERROR)

1、logback.xml

<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- APP NAME -->
    <property name="APP_NAME" value="template" />
    <!-- 日誌ROOT DIR -->
    <property name="LOG_ROOT_DIR" value="Logs/${APP_NAME}"/>
    <!--  格式化輸出。
       %d/date{HH:mm:ss.SSS}:輸出日誌的列印日誌,模式語法與java.text.SimpleDateFormat 相容
       %-5p/le/level:級別從左顯示5個字元寬度
       %t/thread	輸出產生日誌的執行緒名。
       %logger{36} 表示logger名字最長36個字元 為0表示只輸入logger最右邊點符號之後的字串
       %F java原始檔名 *.java
       %L 行
       %m/msg/message:日誌內容
       %n:換行符 -->
    <property name="ENCODER_PATTERN" value="%d{[yyyy-MM-dd HH:mm:ss]}[%level][%logger{1}:%L] %msg%n" />
    <property name="ENCODING" value="UTF-8"/>

    <contextName>${APP_NAME}</contextName>
    <jmxConfigurator />

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <resetJUL>true</resetJUL>
    </contextListener>

    <!-- 輸出到控制檯 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="${ENCODING}">
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- appender 是<configuration>的子節點,是負責寫日誌的元件。有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名 -->
    <appender name="TEMPLATE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案 -->
        <file>${LOG_ROOT_DIR}/template.log</file>
        <encoding>${ENCODING}</encoding>

        <append>true</append> <!--true:日誌被追加到檔案結尾,false:清空現存檔案,預設是true-->
        <encoder> <!-- 對記錄事件進行格式化 -->
            <pattern>${ENCODER_PATTERN}</pattern>
        </encoder>
        <!--
        過濾器,執行一個過濾器會有返回個列舉值,即DENY,NEUTRAL,ACCEPT其中之一。
        返回DENY,日誌將立即被拋棄不再經過其他過濾器;
        返回NEUTRAL,有序列表裡的下個過濾器過接著處理日誌;
        返回ACCEPT,日誌會被立即處理,不再經過剩餘過濾器。
        -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>       <!--用於配置符合過濾條件的操作-->
            <onMismatch>DENY</onMismatch>   <!--用於配置不符合過濾條件的操作-->
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_ROOT_DIR}/template_%d{yyyy-MM-dd}.log.gz</fileNamePattern><!-- 壓縮後的檔名設定 -->
        </rollingPolicy>
        <!--日誌檔案最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!--日誌非同步到資料庫 -->
    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <!--日誌非同步到資料庫 -->
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
            <!--連線池 -->
            <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
                <driverClass>com.mysql.jdbc.Driver</driverClass>
                <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
                <user>root</user>
                <password>root</password>
            </dataSource>
        </connectionSource>
    </appender>

    <!-- 郵件傳送相關 -->
    <property name="smtpHost" value="smtp.exmail.qq.com"/>
    <property name="username" value="
[email protected]
"/> <property name="smtpPort" value="25"/> <property name="password" value="xx"/> <property name="SSL" value="false"/> <property name="email_to" value="[email protected]"/> <property name="email_from" value="[email protected]"/> <property name="email_subject" value="【Error:${APP_NAME}】%logger{20}:%L"/> <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"> <smtpHost>${smtpHost}</smtpHost> <smtpPort>${smtpPort}</smtpPort> <username>${username}</username> <password>${password}</password> <SSL>${SSL}</SSL> <asynchronousSending>false</asynchronousSending> <to>${email_to}</to> <from>${email_from}</from> <subject>${email_subject}</subject> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%d{[yyyy-MM-dd HH:mm:ss]}[%level][%logger:%L] %msg</pattern> </layout> <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>NEUTRAL</onMismatch> </filter> </appender> <!-- 郵件傳送相關 --> <root level="DEBUG"> <appender-ref ref="TEMPLATE_FILE"/> <appender-ref ref="console"/> <!--<appender-ref ref="DB"/> <appender-ref ref="EMAIL"/>--> </root> <!-- 配置獨立包 --> <logger name="com.alibaba.dubbo" level="WARN"> <appender-ref ref="ERROR_FILE"/> <appender-ref ref="console"/> </logger> </configuration>

2、Controller

import com.saohuobang.payment.service.JMXConfigService;
import javax.annotation.Resource;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 作者 yaohua.liu
 * 日期 2015-11-24 11:32
 * 說明 日誌等級動態控制介面
 */
@RequestMapping(value = "/log")
@Controller
public class JMXConfigController extends BackdoorController{

    @Resource
    private JMXConfigService JMXConfigService;

    @RequestMapping(value = "/startJMXConfig.api")
    @ResponseBody
    public Object startJMXConfig(@RequestParam(required = false) String port) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException {
        String result = JMXConfigService.startJMXConfig(port);
        return result;
    }

    @RequestMapping(value = "/stopJMXConfig.api")
    @ResponseBody
    public Object stopJMXConfig() throws Exception {
        String result = JMXConfigService.stopJMXConfig();
        return result;
    }
}

3、Service

import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;

/**
 * 作者 yaohua.liu
 * 日期 2015-11-25 13:50
 * 說明 ...
 */

public interface JMXConfigService {

    public String startJMXConfig(String port) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException;
    public String stopJMXConfig() throws Exception;
}

4、impl實現

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.jmx.JMXConfigurator;
import com.google.common.base.Strings;
import com.saohuobang.payment.service.JMXConfigService;
import com.sun.jdmk.comm.HtmlAdaptorServer;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * 作者 yaohua.liu
 * 日期 2015-11-25 14:23
 * 說明 ...
 */
@Service
public class JMXConfigServiceImpl implements JMXConfigService {

    private Logger logger = LoggerFactory.getLogger(JMXConfigService.class);

    public final String DOMAIN_NAME = "logback_jmx";
    public final String RELOAD_CONFIG_NAME = "reloadConfig";
    public final String CONNECTOR_NAME = "htmlConnector";
    private MBeanServer mBeanServer;
    private JMXConfigurator reloadConfig;
    private HtmlAdaptorServer connector;
    public LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
    private int defaultPort = 10110;

    @Override
    public String startJMXConfig(String portStr) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException {
        mBeanServer = MBeanServerFactory.createMBeanServer(DOMAIN_NAME);

        int port = 0;
        try {
            if (Strings.isNullOrEmpty(portStr)) {
                port = defaultPort;
            } else {
                port = Integer.parseInt(portStr);
            }
        } catch (Exception e) {
            logger.error("格式化JMX埠:{}失敗,使用預設埠:{}", portStr, defaultPort);
            port = defaultPort;
        }
        // 註冊服務
        ObjectName on = new ObjectName(DOMAIN_NAME + ":name=" + RELOAD_CONFIG_NAME);
        reloadConfig = new JMXConfigurator(loggerContext, mBeanServer, on);
        mBeanServer.registerMBean(reloadConfig, new ObjectName(DOMAIN_NAME + ":name=" + RELOAD_CONFIG_NAME));
        // 註冊連線
        connector = new HtmlAdaptorServer();
        connector.setPort(port);
        mBeanServer.registerMBean(connector, new ObjectName(DOMAIN_NAME + ":name=" + CONNECTOR_NAME));

        connector.start();

        return DOMAIN_NAME + ":" + port;
    }

    @Override
    public String stopJMXConfig() throws Exception {
        if (connector != null && connector.isActive()) {
            connector.stop();
        }

        mBeanServer = null;
        reloadConfig = null;
        connector = null;

        return "stop success!";
    }
}


5、訪問:http://127.0.0.1:10001/log/startJMXConfig.api

返回:logback_jmx:10110,說明開通的埠為10110

頁可以在請求時指定埠:http://127.0.0.1:10001/log/startJMXConfig.api?port=101010

6、開啟地址:http://127.0.0.1:10110/

7、點選name=reloadConfig,跳轉到:http://127.0.0.1:10110/ViewObjectRes//logback_jmx%3Aname%3DreloadConfig,滾動條拉到最下面,顯示及操作如下:

本文已同步更新到公眾號,溝通交流請關注公眾號。

相關推薦

動態調整springMVC+slf4jlog等級DEBUG/INFO/WARN/ERROR

1、logback.xml <pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- APP NA

Android - Log等級: Verbose,Debug,Info,Warn,Error - ALOGV,ALOGD,ALOGI,ALOGW,ALOGE

Android - Log的等級: Verbose,Debug,Info,Warn,Error - ALOGV,ALOGD,ALOGI,ALOGW,ALOGE 2016年11月27日 15:18:51 ztguang 閱讀數:4848   http://bl

undo空間管理可以收縮undo log回滾日誌物理檔案空間

1. 背景 InnoDB儲存引擎中,undo在完成事務回滾和MVCC之後,就可以purge掉了,但undo在事務執行過程中,進行的空間分配如何回收,就變成了一個問題。 我們親歷使用者的小例項,因為一個大事務,導致ibdata file到800G大小。 我們先大致看下Inn

優雅的實現Activiti動態調整流程自由跳轉、前進、後退、分裂、前加簽、後加籤等,含範例程式碼!

最近對Activiti做了一些深入的研究,對Activiti的流程機制有了些理解,對動態調整流程也有了一些實踐方法。現在好好總結一下,一來是對這段時間自己辛苦探索的一個記錄,二來也是為後來者指指路~~~如下內容準備採用QA的方式寫,很多問題都是當初自己極疑惑的問題,希望能為大

SpringMVC動態切換多個數據源解決方案自測可用

SpringMVC動態切換多個數據源解決方案 1.資料來源配置 <!-- 事務 --> <bean id="transactionManager"

C#建立高質量清晰縮圖——動態調整大小

System.Drawing.Rectangle rectDestination = new System.Drawing.Rectangle(0, 0, thumbWidth, thumbHeight); gr.DrawI

SpringMVC預設首頁設定包括靜態和動態

在SpringMVC中一些坑,我就分享一下正確的設定和自己掉的坑 配置靜態頁面預設首頁。 這個相對比較簡單,但是還是需要注意一些東西 web.xml裡面填寫如下 <welcome-file-list> <welcome-file&g

Maven多模組專案動態打包SpringMVC資料來源動態配置

開發工具:Intellij IDEA。 專案框架:SpringMvc 技術:Maven Profile 專案目錄: manager是聚合工程,剩下的manager-*是模組,其中manager-web打包方式是war。 動態釋出配置在manager-web中進行,不涉及其

MFC控件自適應大小EASYSIZE動態調整控件位置、大小

ESS ott .cpp title 指定 () baidu ali 同時 MFC控件自適應大小(EASYSIZE動態調整控件位置、大小) 轉自 https://www.cplusplus.me/1178.html 近日在code project網站瀏覽時,看到一篇關於

三分鐘學會用SpringMVC搭建最小系統超詳細

springmvc+mybatis dubbo+zookeeper restful redis分布式緩存 kafka 前言做 Java Web 開發的你,一定聽說過SpringMVC的大名,作為現在運用最廣泛的Java框架,它到目前為止依然保持著強大的活力和廣泛的用戶群。本文介紹如何用ecli

SpringMVC的攔截器Interceptor和過濾器Filter的區別與聯系

get err 實例 分享 切面 簡介 () lee XML 一 簡介 (1)過濾器: 依賴於servlet容器。在實現上基於函數回調,可以對幾乎所有請求進行過濾,但是缺點是一個過濾器實例只能在容器初始化時調用一次。使用過濾器的目的是用來做一些過濾操作,獲取我們想要獲取

SpringMVC詳細示例實戰教程較全開發教程

服務 出現 匹配 internal int 頁面 pty ava 代碼 SpringMVC學習筆記---- 一、SpringMVC基礎入門,創建一個HelloWorld程序 1.首先,導入SpringMVC需要的jar包。 2.添加Web.xml配置文件中關於Spring

springMVC --全局異常處理兩種方式

nal font method mil -h util 一個 fail space 首先看springMVC的配置文件: <!-- 全局異常配置 start --> <bean id="exceptionResolv

在一串字符串中找到與正則表達式匹配的字符串?例如:export_20170717_out.log 找到20170717

group blog public fin ati logs regex att sys 如題:提取字符串:export_20170717_out.log    對應的日期:20170717 package dodo; import java.util.regex.

SpringMVC配置數據驗證

empty 年齡 val require 正則表達 日期類型 getc 打印 all 1、pom.xml中追加hibernate-validator 2、在dto類的域上追加JSR-303的註解 public class DataS { @Pattern(r

SpringMVC源代碼學習FrameworkServlet內處理請求的流程

重新 tex events ... resp star 方便 沒有 isp 以下內容基於書:《看透SpringMVC-源代碼分析與實踐》基本照搬。。。用於自己查閱備忘。 先看一眼DispatcherServlet繼承樹 我們知道servlet處理方法都是通過HttpSer

ZooKeeper動態增加Server動態增加節點的研究待實踐

leader linux nod 部署 them user ase 通過 增加節點 說明:是動態增加Server,不是動態增加連接到ZK Server的Client。 場景如下(轉自外文): 1、在t=t_1->[peer-1(Leader),peer-2],pe

springmvc和mybatis面試題含答案

理解 頁面 發送請求 緩存 固定 sql tor 組件 poj 轉載:http://blog.csdn.net/xinghuo0007/article/details/53463897 Spring MVC Framework有這樣一些特點: 1。它是基於組件技術的.全部的

布爾類型、操作符別名、C++函數、動態內存分配newdelete、引用day02

color 返回 void double 強制 也會 了解 關系 指針 六 C++的布爾類型 1 bool類型是C++中基本類型,專門表示邏輯值:true/false 2 bool在內存上占一個字節:1表示true,0表示false 3 bool類型可以接收任意類型和表達