使用TeamCity服务消息附加程序将log4j迁移到log4j2

时间:2019-01-15 13:36:57

标签: java teamcity log4j2

我们正在从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的blockOpenblockClose消息,就像:

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生效的任何建议?

0 个答案:

没有答案