java - 使用 log4j2 的多线程的不同日志文件

标签 java logging configuration log4j log4j2

我正在运行一个 Java 应用程序,我在其中调用多个线程,每个线程都有一些唯一的名称。现在我想为每个日志文件创建多个日志文件,日志文件的名称应该与线程名称相同。这可能使用 log4j2.请帮我写log4j2配置文件。

提前谢谢你。

最佳答案

我同意 RoutingAppender 是可行的方法。我最初将路由附加程序与 ${ctx:threadName} 查找结合使用,其中“ctx”使用 ThreadContext。我发现我必须在代码中加入这样一行:

ThreadContext.put("threadName", Thread.currentThread().getName());

虽然该代码有效,但它在代码设计中不可扩展。如果我要向代码库添加一个新的 java.lang.Runnable,我还必须包括该行。

相反,解决方案似乎是实现“org.apache.logging.log4j.core.lookup.StrLookup”并使用 PluginManager 注册 @Plugin像这样:

类:ThreadLookup

package my.logging.package    
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;

@Plugin(name = "thread", category = StrLookup.CATEGORY)
public class ThreadLookup implements StrLookup {

@Override
public String lookup(String key) {
    return Thread.currentThread().getName();
}

@Override
public String lookup(LogEvent event, String key) {
    return event.getThreadName() == null ? Thread.currentThread().getName()
            : event.getThreadName();
}

}    

Configuration:log4j2.xml(Configurationpackages 属性将@Plugin 注册到PluginManager)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" packages="my.logging.package">
    <Appenders>
        <Routing name="Routing">
            <Routes pattern="$${thread:threadName}">
                <Route>
                    <RollingFile name="logFile-${thread:threadName}"
                    fileName="logs/concurrent-${thread:threadName}.log" filePattern="logs/concurrent-${thread:threadName}-%d{MM-dd-yyyy}-%i.log">
                    <PatternLayout pattern="%d %-5p [%t] %C{2} - %m%n" />
                    <Policies>
                        <SizeBasedTriggeringPolicy size="50 MB" />
                    </Policies>
                    <DefaultRolloverStrategy max="100" />
                </RollingFile>
            </Route>
        </Routes>
    </Routing>
    <Async name="async" bufferSize="1000" includeLocation="true">
        <AppenderRef ref="Routing" />
    </Async>
</Appenders>
<Loggers>
    <Root level="info">
        <AppenderRef ref="async" />
    </Root>
</Loggers>

关于java - 使用 log4j2 的多线程的不同日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19976211/

相关文章:

java - int[][] 不知怎的没有重新初始化

java - 如何在当前的Rest API中实现spring Hateoas?

python - 重构 python 模块配置以避免相对导入

java - 无法加载类 com.microsoft.sqlserver.jdbc.SQLServerDriver?

python - 扭曲的插件日志记录

java.util.logging 消息模板问题

go - 如何测试从自定义配置构建的 zap Logger 的日志记录?

java - Spring注解属性设置与方法调用

java - IBM AS4 客户端 (com.ibm.b2b.as4.client) - 如何设置代理主机?

java - 方法函数的数组