首页 / 知识

关于java:Log4j:为什么无论配置如何,root logger都会收集所有日志类型?

2023-04-16 19:21:00

关于java:Log4j:为什么无论配置如何,root logger都会收集所有日志类型?

Log4j: Why is the root logger collecting all log types regardless the configuration?

我有一个问题,即使我在根标记中将级别指定为ERROR,指定的附加程序也会将所有级别(调试,信息,警告)记录到文件中,而不管设置如何。 我不是log4j专家,所以不胜感激。

以下是有关该主题的更多信息:

  • 我已经检查了log4j.properties的类路径(没有),除了log4j.xml

这是log4j.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM"log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>


    <!-- ============================== -->
    <!-- Append messages to the console -->
    <!-- ============================== -->


   
        <param name="Target" value="System.out" />

        <layout class="org.apache.log4j.PatternLayout">
            <!-- The default pattern: Date Priority [Category] Message
 -->
            <param name="ConversionPattern" value="[AC - %5p] [%d{ISO8601}] [%t] [%c{1} - %L] %m%n" />
        </layout>
    </appender>

   
        <param name="File" value="./logs/server.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="2" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

   
        <param name="File" value="./logs/payload.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

   
        <param name="File" value="./logs/error.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="10" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[AC - %-5p] {%d{dd.MM.yyyy - HH.mm.ss}} %m%n" />
        </layout>
    </appender>

    <appender name="traceLog"
        class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="./logs/trace.log" />
        <param name="MaxFileSize" value="1000KB" />
        <param name="MaxBackupIndex" value="20" />

        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="[AccessControl - %-5p] {%t: %d{dd.MM.yyyy - HH.mm.ss,SSS}} %m%n" />
        </layout>
    </appender>

   
        <param name="remoteHost" value="localhost" />
        <param name="port" value="4445" />
        <param name="locationInfo" value="true" />
    </appender>

    <logger name="TraceLogger">
        <level value="trace" /> <!-- Set level to trace to activate tracing -->
             
    </logger>

    <logger name="org.springframework.ws.server.endpoint.interceptor">
        <level value="DEBUG" />
       
    </logger>

    <root>
        <level value="error" />
       
    </root>

</log4j:configuration>

如果我用另一个记录器替换根,那么什么都不会记录到指定的附加程序。

1
2
3
4
<logger name="com.mydomain.logic">
    <level value="error" />
   
</logger>

...并且感谢你们到目前为止的提示:-)


根记录器位于记录器层次结构的顶部。它在三种方式上是例外的:

  • 它一直存在,
  • 其级别不能设置为null
  • 无法通过名称检索。

rootLogger是所有添加程序的父亲。给定记录器的每个启用的日志记录请求都将转发给该记录器中的所有附加程序以及层次结构中较高的附加程序(包括rootLogger)

例如,如果将console附加程序添加到root logger,则所有已启用的日志记录请求将至少在控制台上打印。如果另外将文件追加程序添加到记录器中,例如L,则对LL's子级启用的记录请求将打印在文件和console上。通过将可加性标志设置为false,可以覆盖此默认行为,以便不再增加附加器累积。

从log4j手册

总结一下:

如果不想将日志记录事件传播给父级记录器(例如rootLogger),则在这些记录器中将可加性标志添加为false。在您的情况下:

1
2
3
4
5
<logger name="org.springframework.ws.server.endpoint.interceptor"
        additivity="false">
        <level value="DEBUG" />
       
</logger>

在标准的log4j配置样式(我更喜欢XML)中:

1
2
log4j.logger.org.springframework.ws.server.endpoint.interceptor = INFO, payloadAppender
log4j.additivity.org.springframework.ws.server.endpoint.interceptor = false

希望这可以帮助。


使用-Dlog4j.debug运行程序,以便标准输出获取有关如何配置log4j的信息-我怀疑它没有按照您认为的方式进行配置。


补充一下James A. N. Stauffer和cynicalman所说的-我敢打赌,您的类路径上还有另一个log4j.xml / log4j.properties,而不是您希望使用的那个,它导致log4j自行配置。

-Dlog4j.debug是解决任何log4j问题的绝对杀手级方法。


两件事情:检查可加性,并确定是否希望由更详细的日志记录级别捕获的日志事件传播到根记录器。

其次,检查根记录器的级别。此外,您还可以在附加程序本身上添加过滤,但是通常不需要这样做。


如果您使用的是log4j.properties文件,则通常希望该文件位于类路径的根目录中,因此请确保该文件位于该目录中。


这是正确的行为。根记录器类似于默认行为。因此,如果您未指定任何记录器,它将采用根记录器级别作为默认级别,但这并不意味着根记录器级别是所有日志的级别。

使用'TraceLogger'记录器或'org.springframework.ws.server.endpoint.interceptor'记录器记录的任何代码都将分别使用TRACE和DEBUG级别记录消息,而其他任何代码将使用root记录器来使用级别记录消息,即在您的情况下为ERROR。

因此,如果您使用除root以外的其他记录器,则根日志级别将被该记录器的日志级别覆盖。要获得所需的输出,请将其他两个日志级别更改为ERROR。

我希望这是有帮助的。


日志配置类型附加

最新内容

相关内容

猜你喜欢