java - Log4j logger 只使用 root appender
问题描述
我的记录器仅在根记录器 ServerAppenderV2 上记录消息,日志文件生成正确,当我使用更改级别以在根中调试时,我可以在根中定义的两个附加器中看到日志,但文件附加器 FileAppender 和 PerfAppender 中仍然没有日志。
对于以下代码:
import logging.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestLog {
private static final Logger logger= Logger.getLogger(TestLog.class);
public static void main(String [] args){
logger.perf("hello from debug",null,null,null,null);
logger.log(Traces.43E, "info", 12);
logger.debug("hello from debug",null);
}
}
这是我的 Logger 类和标记:
public class Logger {
private static final String ID_TRACE = "IdTrace";
private static final Marker MARKER_PERF = MarkerFactory.getMarker("perf");
private static final Marker V2 = MarkerFactory.getMarker("V2");
private Logger delegate;
public void debug(String message, Object... objects) {
delegate.debug(message, objects);
}
public void log(Traces trace, Object... params) {
Marker marker=V2;
MDC.clear();
MDC.put(ID_TRACE, trace.getId());
switch(trace.getLevel()) {
case DEBUG:
this.delegate.debug(marker, trace.getMessage(), params);
break;
case INFO:
this.delegate.info(marker, trace.getMessage(), params);
break;
case WARNING:
this.delegate.warn(marker, trace.getMessage(), params);
break;
default:
this.delegate.error(marker, trace.getMessage(), params);
}
}
public void perf(String msg, Object... params) {
this.delegate.info(MARKER_PERF, msg, params);
}
}
这是我的配置 Log4j2.xml:
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss,SSS} %5p --- [%15.15t] %-40.40c{1.} : %m%n%ex
</Property>
<Property name="PERF_LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss,SSS};%5p;%t;%m;%n
</Property>
</Properties>
<Appenders>
<RollingFile name="ServerAppender" fileName="logs\\server.log"
filePattern="logs\\server-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<RollingFile name="ServerAppenderV2" fileName="logs\\serverV2.log"
filePattern="logs/serverV2-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<RollingFile name="FileAppender" fileName="logs\\appli.log"
filePattern="logs\\appli-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
<RollingFile name="PerfAppender" fileName="logs\\perf.log"
filePattern="logs\\perf-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>${PERF_LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<AsyncLogger name="logging" level="info" additivity="false">
<AppenderRef ref="FileAppender">
<MarkerFilter marker="perf" onMatch="DENY" onMismatch="ACCEPT"/>
</AppenderRef>
<AppenderRef ref="PerfAppender">
<MarkerFilter marker="perf" onMatch="ACCEPT" onMismatch="DENY"/>
</AppenderRef>
</AsyncLogger>
<Root level="info">
<AppenderRef ref="ServerAppender" >
<MarkerFilter marker="V2" onMatch="DENY" onMismatch="ACCEPT"/>
</AppenderRef>
<AppenderRef ref="ServerAppenderV2">
<MarkerFilter marker="V2" onMatch="ACCEPT" onMismatch="DENY"/>
</AppenderRef>
</Root>
</Loggers>
</Configuration>
解决方案
这是因为您将记录器name
称为“记录”的配置。
<AsyncLogger name="logging" level="info" additivity="false">
// configurations
</AsyncLogger>
但是在访问时您正在使用它。
private static final Logger logger= Logger.getLogger(TestLog.class);
package
这将使用和解析记录器名称className
。
使用您当前的配置,您应该logger
像这样访问。
private static final Logger logger= Logger.getLogger("logging");
或者,您可以像这样配置。假设如果你TestLog.class
在 package 中org.random.service
,你的配置应该是这样的。
<AsyncLogger name="org.random.service.TestLog" level="info" additivity="false">
// configurations
</AsyncLogger>
要启用完整的包,您可以className
从记录器名称中删除。
<AsyncLogger name="org.random.service" level="info" additivity="false">
// configurations
</AsyncLogger>
推荐阅读
- php - php mail() 函数在本地无法在 wamp 上运行?
- excel - 在 Excel 中启用标题过滤器和排序的单元格更改事件时锁定特定列
- amazon-web-services - 生成 lwa 刷新令牌在卖家中央仪表板中不起作用
- gradle - 在 gitlab 中使用 gradle 的 Spotbugs (findsecbug)
- python-3.x - 在 POST 函数中实现线程
- c# - 使用单个绑定文本框更改多个数据表条目
- sql - 从 CockroachDB 中删除交错表时有哪些潜在问题?
- python - 我希望它检测到我何时关闭另一个菜单并重新打开此 tkinter 菜单。(python)
- ansible - 从存储在 Ansible 寄存器中的 JSON 类内容中提取键值对
- reactjs - Typescript,Next js 的 getStaticProps 错误