Log4j线程名称混乱

时间:2018-03-15 10:59:14

标签: java java-8 log4j

以下是我们生产中的应用程序日志的一部分。我们正在使用 log4j

配置:

<Console name="console" target="SYSTEM_OUT">
    <PatternLayout
        pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>


[INFO ] 2018-03-10 15:47:16.905 [WebContainer : 23] Logger -
[INFO ] 2018-03-10 15:47:16.905 [WebContainer : 23] Logger -
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger - 
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger - 
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger - 
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger - 
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger - 
[INFO ] 2018-03-10 15:49:27.320 [WebContainer : 19] Logger - 
[INFO ] 2018-03-10 15:54:23.703 [WebContainer : 23] Logger - 
[INFO ] 2018-03-10 15:54:23.703 [WebContainer : 23] Logger - 
[INFO ] 2018-03-10 15:54:23.703 [WebContainer : 23] Logger - 
[INFO ] 2018-03-10 15:54:23.703 [WebContainer : 23] Logger - 

从那里你可以看到有一个线程名称&#34; WebContainer:19&#34;和#34; WebContainer:23&#34;。我们对线程名称感到困惑。具有相同的线程名称是否意味着它们来自同一个请求?我们可以说15:54:23.703发生在2018-03-10 15:47:16.905之后并且属于同一个请求?

这些线程名称是否只是同一个类的一个进程组?并且上面的所有行都可以属于同一个请求,但只是在请求中执行的不同类的不同线程名称?

请赐教。

2 个答案:

答案 0 :(得分:1)

每个web容器通常都有一个线程池。所有这些线程都会继续侦听套接字上的传入TCP连接并接受它们。一旦被接受,就可以从新建立的TCP连接中读取数据,解析并转换为HTTP请求。

你在这些日志中看到的“WebContainer:19”和“WebContainer:23”是两个这样的线程,属于webcontainer线程池。是的,他们是不同的。

每当每个线程都有机会执行时,它就会显示在日志中,因此您正在观察这些日志语句中的随机化。

为了优雅地处理线程的这种随机性,并使应用程序正常运行,多线程概念是构建此类应用程序的必要条件。

答案 1 :(得分:0)

WebContainer:23是主题A. WebContainer:19是Thread B

A和B两个请求由WebContainer处理。