动态设置log4j的日志级别

效果图:

效果图

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.util.*,org.apache.log4j.*,org.dom4j.*,org.dom4j.io.*"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
%>
<html>
<head>
<title>重新配置log4j</title>
<link href="${pageContext.request.contextPath}/css/styleqxgl.css" rel="stylesheet" type="text/css">
</head>
<body>
<font class="titleHead">
动态的修改日志级别,可以动态的起作用!
</font>
<%
String renovateParam = request.getParameter("renovateParam");

%>
<form name="myform" method="post" action="<s:url value="/log4jConfigNew.jsp" />">
<input type="hidden" name="renovateParam" value="true">
<table border="1" bordercolor="#7595ea" cellpadding="2" style="border-collapse: collapse " >
<tr bgcolor="eaf1ff"><td>包</td><td>日志级别</td></tr>
<%
try{
String location = config.getServletContext().getInitParameter("log4jConfigLocation");
out.println("location="+location+"<br><br>");

if (!org.springframework.util.ResourceUtils.isUrl(location)) {
// Resolve system property placeholders before resolving real path.
location = org.springframework.util.SystemPropertyUtils.resolvePlaceholders(location);
location = org.springframework.web.util.WebUtils.getRealPath(config.getServletContext(), location);
}
java.net.URL url = org.springframework.util.ResourceUtils.getURL(location);

SAXReader reader = new SAXReader();

Document doc = reader.read(url);

Element root = doc.getRootElement();

Iterator<Element> itr = root.elements("logger").iterator();

while (itr.hasNext()) {
Element category = itr.next();

String name = category.attributeValue("name");
Logger logger = Logger.getLogger(name);
String level = logger.getLevel().toString();
%>


<tr><td>
<input type="hidden" name="logger" value="<%=name %>"><%=name %>
</td>
<td>
<select name="level">
<%
if (level.equals("OFF")){
%>
<option name="OFF" selected >OFF</option>
<%
}else{
%>
<option name="OFF" >OFF</option>
<%
}
%>
<%
if (level.equals("FATAL")){
%>
<option name="FATAL" selected >FATAL</option>
<%
}else{
%>
<option name="FATAL">FATAL</option>
<%
}
%>
<%
if (level.equals("ERROR")){
%>
<option name="ERROR" selected >ERROR</option>
<%
}else{
%>
<option name="ERROR">ERROR</option>
<%
}
%>
<%
if (level.equals("WARN")){
%>
<option name="WARN" selected >WARN</option>
<%
}else{
%>
<option name="WARN">WARN</option>
<%
}
%>
<%
if (level.equals("INFO")){
%>
<option name="INFO" selected >INFO</option>
<%
}else{
%>
<option name="INFO">INFO</option>
<%
}
%>
<%
if (level.equals("DEBUG")){
%>
<option name="DEBUG" selected >DEBUG</option>
<%
}else{
%>
<option name="DEBUG">DEBUG</option>
<%
}
%>
<%
if (level.equals("ALL")){
%>
<option name="ALL" selected >ALL</option>
<%
}else{
%>
<option name="ALL">ALL</option>
<%
}
%>
</select>
</td>
</tr>

<%
}

}catch(Exception e){
out.println("获取log4j配置失败!"+e.getMessage());

}
%>
</table>
<input type="submit" class="button11" value="重新配置日志" >
</form>
<%
if("true".equals(renovateParam)){
try{
String[] loggers = request.getParameterValues("logger");
String[] levels = request.getParameterValues("level");
int LEN = loggers.length;
for(int i=0;i<LEN;i++){
Logger logger = Logger.getLogger(loggers[i]);
logger.setLevel(Level.toLevel(levels[i]));
}
out.println("log4j重新配置成功!<br>");
out.println("时间:"+com.work.util.DateUtil.getCurrentDateTime());
}catch(Exception e){
out.println("log4j配置失败!"+e.getMessage());

}
}
%>

<hr>

</body>
</html>

<think>我们正在讨论Log4j动态调整日志级别的方法。根据引用内容,Log4j支持动态调整日志级别,这可以在不重启应用的情况下改变日志输出详细程度。引用[1]提到Log4j提供了动态调整日志级别的功能,引用[2]则展示了在SpringBoot环境中使用LoggingSystem进行class级别调整的代码示例。注意:Log4j有多个版本,包括Log4j1.x和Log4j2.x,以及与其他日志框架(如SLF4J)的整合。这里主要讨论Log4j1.x,因为引用[2]中使用了`org.apache.log4j.LogManager`。动态调整日志级别的方法通常有以下几种:1.使用JMX:Log4j1.x支持通过JMXMBean动态修改日志级别。2.编程方式:通过代码获取Logger并设置级别。3.外部配置文件:通过修改外部配置文件并配合监视器(如log4j的PropertyConfigurator)实现动态加载。下面分别说明:###方法1:使用JMX(无需代码侵入)在Log4j1.x中,可以通过JMX动态调整日志级别。需要确保Log4j的JMX支持已启用(默认情况下,Log4j1.2.15及以上版本支持JMX)。步骤:-启动JVM时添加参数:`-Dlog4j.jmx.enable=true`-使用JConsole或其他JMX客户端连接至应用,找到Log4j的MBean(通常在`org.apache.log4j`下),然后修改相应logger的级别。###方法2:编程方式(代码调整)在代码中直接获取Logger对象并设置级别。例如:```javaimportorg.apache.log4j.Level;importorg.apache.log4j.LogManager;importorg.apache.log4j.Logger;//获取Logger(这里以类名为例)Loggerlogger=LogManager.getLogger("com.example.MyClass");//设置日志级别为DEBUGlogger.setLevel(Level.DEBUG);```但是,这种方法通常需要有一个触发机制(如通过API接口、管理后台等)来执行这段代码。在SpringBoot中,如果使用Log4j,也可以借助SpringBoot的`LoggingSystem`(如引用[2]所示):```javaimportorg.springframework.boot.logging.LoggingSystem;importorg.apache.log4j.LogManager;importorg.springframework.beans.factory.annotation.Autowired;@AutowiredprivateLoggingSystemloggingSystem;//设置特定logger的级别org.apache.log4j.Loggerlogger=LogManager.getLogger("com.example.MyClass");loggingSystem.setLogLevel(logger.getName(),LogLevel.DEBUG);```注意:`LoggingSystem`是SpringBoot提供的统一接口,它封装了底层日志框架的设置。###方法3:修改配置文件并重新加载可以编写一个监听程序,当配置文件发生变化时,重新加载配置。使用`PropertyConfigurator`:```javaimportorg.apache.log4j.PropertyConfigurator;//指定配置文件路径Stringlog4jConfigFile="path/to/log4j.properties";PropertyConfigurator.configureAndWatch(log4jConfigFile,5000);//每5秒检查一次文件变化```这样,当修改`log4j.properties`文件中的日志级别并保存后,Log4j会自动重新加载配置。###注意事项-动态调整日志级别可能会对性能产生影响,特别是在高频率调整或大量Logger的情况下。-在生产环境中,建议通过受控的方式(如管理界面、API)进行调整,并记录调整操作。根据实际需求选择合适的方法。如果应用已经集成了SpringBoot,使用`LoggingSystem`可能是最便捷的方式。§§相关问题§§1.Log4j1.x和Log4j2.x在动态调整日志级别上有何不同?2.如何通过RESTAPI实现Log4j动态日志级别调整?3.动态调整日志级别对应用性能有哪些影响?</think>### Log4j动态调整日志级别方法解析 在Log4j动态调整日志级别主要有以下三种实现方式,可在不重启应用的情况下实时修改日志输出粒度: #### 1. **编程式设置(核心方法)** ```java import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; // 获取目标Logger Logger logger = LogManager.getLogger("com.example.MyClass"); // 动态设置日志级别 logger.setLevel(Level.DEBUG); // 设为DEBUG级别 logger.setLevel(Level.ERROR); // 设为ERROR级别 ``` **特点**: - 精确控制特定类/包的日志级别 - 即时生效,无需配置文件修改 - 需通过管理接口触发(如API端点、管理后台)[^1] #### 2. **JMX远程管理** ```java // 启动时启用JMX支持(添加JVM参数) -Dlog4j.jmx.enable=true ``` **操作流程**: 1. 使用JConsole连接应用 2. 定位MBean:`org.apache.log4j:type=LoggerContext,name=default` 3. 修改目标logger的`level`属性值(如DEBUG/INFO) **优势**: - 图形化操作,无需代码修改 - 支持生产环境远程管理[^1] #### 3. **配置文件热更新** ```properties # log4j.properties 配置 log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.logger.com.example=DEBUG # 初始级别 ``` ```java // 启用配置文件监听 PropertyConfigurator.configureAndWatch("log4j.properties", 5000); // 5秒检测间隔 ``` **效果**: 修改配置文件中的日志级别后,Log4j会在指定时间内自动重载配置。 --- ### 最佳实践建议 1. **级别范围控制** ```java // 设置包路径的日志级别 LogManager.getLogger("com.example.service").setLevel(Level.WARN); ``` 2. **Spring Boot集成** ```java @Autowired private LoggingSystem loggingSystem; // 动态修改Spring管理的logger loggingSystem.setLogLevel("com.example", LogLevel.DEBUG); ``` 3. **安全注意事项** - 动态修改接口需添加权限验证 - 生产环境推荐使用JMX+SSL安全通道 - 避免高频修改影响性能[^2] > **性能影响**:动态调整不会阻塞业务线程,但DEBUG级别日志可能增加20%-30%CPU开销(需根据业务流量评估)[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值