因此,我希望以编程方式创建单独的appender和单独的logger,以便每个appender只附加到它自己的线程,然后在一个线程中创建的logger只在该线程中创建appender。
请让我知道如何一步步实现。
首先,这感觉像是一个XY问题,特别是因为您没有提供任何理由来说明为什么要使用编程解决方案。
可以在一个线程一个线程的基础上实现单独的日志文件,而不需要以编程方式创建记录器和附加器。由于我相信这是一个更优化的解决方案,我将提供一个演示如何可以这样做。
解释
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Routing name="MyRoutingAppender">
<Routes pattern="$${ctx:threadName}">
<Route>
<File
fileName="logs/${ctx:threadName}/log.txt"
name="appender-${ctx:threadName}">
<PatternLayout>
<Pattern>[%date{ISO8601}][%-5level][%t] %m%n</Pattern>
</PatternLayout>
</File>
</Route>
</Routes>
</Routing>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="[%date{ISO8601}][%-5level][%t] %m%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="Thread" level="TRACE" additivity="false">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="MyRoutingAppender" />
</Logger>
<Root level="WARN">
<AppenderRef ref="STDOUT" />
</Root>
</Loggers>
</Configuration>
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class MultiThreadLog4j2SepFilesMain {
//Create a lock to use for synchronizing the getting of the logger
private static final Object lock = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable(){
public void run() {
//Set up the context before getting logger
ThreadContext.put("threadName", Thread.currentThread().getName());
//Get the logger for this thread
Logger log = null;
synchronized(lock){
log = LogManager.getLogger(Thread.currentThread().getName());
}
//Generate some logs
log.info("here's the first thread");
//Wait a while so that threads interleave
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Generate more logs
log.debug("some debug in first thread");
log.info("finishing first thread");
}}, "Thread.1"); //Use a name that will allow us to use Thread.getName when getting the logger inside the thread
Thread t2 = new Thread(new Runnable(){
public void run() {
//Set up the context before getting logger
ThreadContext.put("threadName", Thread.currentThread().getName());
//Get logger for this thread
Logger log = null;
synchronized(lock){
log = LogManager.getLogger(Thread.currentThread().getName());
}
//Generate some logs
log.info("here's the second thread");
log.debug("some debug in second thread");
}}, "Thread.2"); //Use a name that will allow us to use Thread.getName when getting the logger inside the thread
//Start both threads
t1.start();
t2.start();
}
}
我试图创建一个完全独立的第二个上下文/配置/记录器-而不是现有配置/上下文中的记录器。日志消息将发送到STDOUT。 当前代码 上面的.error()调用转到标准输出。请注意,我尝试使用reconfigure()而不是initialize(),但这会打乱我的原始配置。 当我打印出来时,记录器似乎是错误的,它们的名称和上下文似乎是正确的,但处于错误级别。还有一些事情要做,不要做附加物。 从生成器生成
据我所知,log4j2中的RollingFileAppender不会在指定的时间(比方说-在一小时结束时)回滚,而是在超过时间阈值后到达的第一个日志事件时回滚。 有没有一种方法可以触发一个事件,一方面会导致文件滚动,另一方面不会附加到日志中(或者会附加一些无关紧要的东西,比如空字符串)?
我正在使用log4j2 v2.17.2,需要在运行时以编程方式添加记录器/附加器。我正在创建LoggerConfig,如下所示:https://logging . Apache . org/log4j/2 . x/manual/custom config . html部分:初始化后以编程方式修改当前配置 包括此片段: 当使用:LoggerConfig.createLogger(..)(现在我用构建
我正在处理一个使用log4j2(使用log4j2.xml初始化参数)并加载记录器的应用程序。当应用程序运行时,我需要以编程方式重写一些参数,例如更改日志级别和滚动文件附加器属性。我可以使用以下方法更改日志级别: 现在我尝试使用RollingFile appender的属性来解决同样的问题。然而,我仍然停留在如何修改现有的RollingFile appender的属性上