动态调整(springMVC+slf4j)log等级(DEBUG/INFO/WARN/ERROR)

 

1、logback.xml


    
    
    
    
    
    
    

    ${APP_NAME}
    

    
        true
    

    
    
        
            ${ENCODER_PATTERN}
        
    

    
    
        ${LOG_ROOT_DIR}/template.log
        ${ENCODING}

        true 
         
            ${ENCODER_PATTERN}
        
        
        
            ERROR
            ACCEPT       
            DENY   
        
        
            ${LOG_ROOT_DIR}/template_%d{yyyy-MM-dd}.log.gz
        
        
        
            10MB
        
    

    
    
        
        
            
            
                com.mysql.jdbc.Driver
                jdbc:mysql://127.0.0.1:3306/databaseName
                root
                root
            
        
    

    
    
    
    
    
    
    
    
    

    
        ${smtpHost}
        ${smtpPort}
        ${username}
        ${password}
        ${SSL}
        false
        ${email_to}
        ${email_from}
        ${email_subject}
        
            %d{[yyyy-MM-dd HH:mm:ss]}[%level][%logger:%L] %msg
        
        
            ERROR
            ACCEPT
            NEUTRAL
        
    
    

    
        
        
        
    

    
    
        
        
    

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/
动态调整(springMVC+slf4j)log等级(DEBUG/INFO/WARN/ERROR)_第1张图片

7、点击name=reloadConfig,跳转到:http://127.0.0.1:10110/ViewObjectRes//logback_jmx%3Aname%3DreloadConfig,滚动条拉到最下面,显示及操作如下:

动态调整(springMVC+slf4j)log等级(DEBUG/INFO/WARN/ERROR)_第2张图片

 

本文已同步更新到公众号,沟通交流请关注公众号。

 

 

你可能感兴趣的:(Java,进阶)