通过url来设置log4j的记录级别

本文介绍了一个Spring Boot应用中动态调整Log4j日志级别和Appender阈值的方法。通过创建一个控制器,利用HTTP请求参数设置指定logger和appender的日志级别,实现了运行时的日志配置调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接看代码。

import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping(value = "/log4j")
public class Log4jController {

    private Map<String, Logger> log4jLoggers = new HashMap<>();

    private Map<String, AppenderSkeleton> log4jAppenders = new HashMap<>();

    @PostConstruct
    public void init() {
        loadLog4j();
    }

    private void loadLog4j() {
        Enumeration<?> loggers = LogManager.getLoggerRepository().getCurrentLoggers();//获取所有logger
        while (loggers.hasMoreElements()) {
            Object elem = loggers.nextElement();
            if (elem instanceof org.apache.log4j.Logger) {
                org.apache.log4j.Logger log4j = (org.apache.log4j.Logger) elem;
                log4jLoggers.put(log4j.getName(), log4j);
                Enumeration<?> allAppenders = log4j.getAllAppenders();//获取logger相关的appender
                while (allAppenders.hasMoreElements()) {
                    Object apd = allAppenders.nextElement();
                    if (apd instanceof AppenderSkeleton) {
                        AppenderSkeleton appender = (AppenderSkeleton) apd;
                        log4jAppenders.put(appender.getName(), appender);
                    }
                }
            }
        }
    }

    @RequestMapping(value = "/setLoggerLevel")
    @ResponseBody
    public String setLoggerLevel(HttpServletRequest request) {
        String logName = request.getParameter("name");
        String levelStr = request.getParameter("level");
        Level level = Level.toLevel(levelStr, null);

        org.apache.log4j.Logger log4j = log4jLoggers.get(logName);
        if (log4j == null) {
            return "没有相应的logger[" + logName + "]存在";
        }

        if (level == null) {
            return "没有相应的日志级别[" + levelStr + "]存在";
        }

        log4j.setLevel(level);
        return "将日志logger[" + logName + "]设置为" + level.toString() + "模式";
    }

    @RequestMapping(value = "/setAppenderLevel")
    @ResponseBody
    public String setAppenderLevel(HttpServletRequest request) {
        String appenderName = request.getParameter("name");
        String levelStr = request.getParameter("level");
        Level level = Level.toLevel(levelStr, null);

        Response response = new Response();
        AppenderSkeleton appender = log4jAppenders.get(appenderName);
        if (appender == null) {
            return "没有相应的appender[" + appenderName + "]存在";
        }

        if (level == null) {
            return "没有相应的日志级别[" + levelStr + "]存在";
        }

        appender.setThreshold(level);
        return "将日志appender[" + appenderName + "]设置为" + level.toString() + "模式";
    }
}

 

转载于:https://my.oschina.net/linchuhao23/blog/2248901

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值