動態調整(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+slf4j)log等級(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網站瀏覽時,看到一篇關於
自定義view——心電圖(根據點(x為時間)還原波形,根據當前顯示影象的最大值動態調整波形,動態增減資料)
import android.content.Context; import android.graphics.Canvas;
三分鐘學會用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類型可以接收任意類型和表達