我们正在从log4j迁移到log4j2,以实现持续集成框架。因为我们的代码库是Java,所以我们使用的testNg在TeamCity上没有本机运行程序,因此为了能够很好地折叠设置代码,测试及其步骤,我们添加了TeamCityLogger
。该记录器负责在需要的地方添加TeamCity service messages。这些消息需要与普通日志行不同的格式。我们也不想在本地运行测试时看到它们。为此,我们曾经有以下log4j.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org.apache.logging.log4j/xml/doc-files/log4j.dtd">
<log4j:configuration>
<appender name="console" class="org.apache.logging.log4j.ConsoleAppender">
<layout class="org.apache.logging.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{ABSOLUTE}][%t] %-5p %c{1}(%L) - %m%n"/>
</layout>
<filter class="org.apache.logging.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="ERROR" />
</filter>
</appender>
<appender name="teamcity" class="org.apache.logging.log4j.ConsoleAppender">
<layout class="org.apache.logging.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n%n"/>
</layout>
<filter class="org.apache.logging.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="DEBUG" />
<param name="levelMax" value="DEBUG" />
</filter>
<filter class="org.apache.logging.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="##teamcity" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.logging.log4j.varia.DenyAllFilter"/>
</appender>
<appender name="file" class="org.apache.logging.log4j.FileAppender">
<param name="File" value="log4j.log"/>
<param name="Append" value="false"/>
<param name="ImmediateFlush" value="true"/>
<layout class="org.apache.logging.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{ABSOLUTE}] %m%n"/>
</layout>
</appender>
<root>
<priority value ="debug" />
<appender-ref ref="console" />
<appender-ref ref="teamcity" />
<appender-ref ref="file" />
</root>
</log4j:configuration>
我们的TeamCityLogger
很简单:
public class TeamcityLogger {
public static Logger _logger = LogManager.getLogger("TeamcityLogger");
public static void tc_openBlock(String blockLabel){
String escapedLabel = tc_escaped(blockLabel);
_logger.debug(String.format("##teamcity[blockOpened name='<%s>']", escapedLabel));
}
public static void tc_closeBlock(String blockLabel){
String escapedLabel = tc_escaped(blockLabel);
_logger.debug(String.format("##teamcity[blockClosed name='<%s>']", escapedLabel));
}
}
根据JetBrains的指南,其中tc_escaped
对提供的字符串进行简单的转义。
围绕我们想要折叠的代码,我们添加了TeamCity的blockOpen
和blockClose
消息,就像:
public class SomeClass {
private static Logger _logger = LogManager.getLogger(SomeClass.class.getSimpleName());
public void MethodToFold(){
TeamcityLogger.tc_openBlock("FoldMe");
_logger.info("I'm doing something");
_logger.info("I'm doing something else");
TeamcityLogger.tc_closeBlock("FoldMe");
}
}
这将创建一个漂亮的控制台日志
[12:56:55,977][main] INFO SomeClass(17) - I'm doing something
[12:56:55,995][main] INFO SomeClass(18) - I'm doing something else
在TeamCity上运行后,构建日志如下:
[19:51:04] : [Step 3/3] <FoldMe>
[19:51:04] : [<FoldMe>]
[19:51:04] : [<FoldMe>] [12:56:55,977][main] INFO SomeClass(17) - I'm doing something
[19:51:04] : [<FoldMe>] [12:56:55,995][main] INFO SomeClass(18) - I'm doing something else
[19:51:05] : [Step 3/3]
我们的新log4j2.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console">
<PatternLayout pattern="[%d{ABSOLUTE}][%t] %-5level %c{1}(%L) - %highlight{%m%n}"/>
</Console>
<Console name="teamcity">
<PatternLayout pattern="%m%n%n"/>
<Filters>
<RegexFilter regex="##teamcity" onMatch="ACCEPT" onMismatch="DENY"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
</Console>
<File name="file" immediateFlush="true" fileName="log4j.log" append="false">
<PatternLayout pattern="[%d{ABSOLUTE}] %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="console"/>
<AppenderRef ref="teamcity"/>
<AppenderRef ref="file"/>
</Root>
</Loggers>
</Configuration>
在控制台上看起来不错,但在TeamCity上,下载的构建日志如下
[13:06:04] : [Step 3/3] [13:06:04,089][main] INFO SomeClass(17) - [32mI'm doing something
[13:06:04] : [Step 3/3] [m[13:06:04,178][main] INFO SomeClass(18) - [32mI'm doing something else
这意味着我们不再可以折叠。
使用额外的记录器参考
修改配置<Loggers>
<Logger name="TeamcityLogger">
<AppenderRef ref="teamcity"/>
</Logger>
<Root level="info">
<AppenderRef ref="console"/>
<AppenderRef ref="teamcity"/>
<AppenderRef ref="file"/>
</Root>
</Loggers>
添加一条额外的日志行:
[13:19:12,281][main] DEBUG TeamcityLogger(17) -
进入TeamCity日志。
我还尝试将根日志级别设置为调试并将<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
添加到控制台附加程序,但这又消除了我的折叠。
关于如何使xml生效的任何建议?