log4j 2 如何为控制台输出添加多种颜色

50

你好,我刚下载并配置了log4j-2。我目前卡在给SlowConsole控制台附加器应用颜色代码上。我的控制台附加器如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
        </Console>
        <Console name="SlowConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level %logger{36}.%M() @%L - %msg%n}{FATAL=red, ERROR=red, WARN=yellow, INFO=black, DEBUG=green, TRACE=blue}"/>
        </Console>
        <File name="File" fileName="C:\log\out.txt">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <logger name="org.abc.ea.web" level="ALL" additivity="false">
            <!--Log4j for the WEB MODULE -->
            <appender-ref ref="SlowConsole"/>
        </logger>
        <logger name="org.abc.ea.ejb" level="ALL" additivity="false">
            <!--Log4j for the EJB MODULE -->
            <appender-ref ref="SlowConsole"/>
        </logger>
        <Root level="ERROR">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File" />
        </Root>
    </Loggers>
</Configuration>

我有两个问题:

  1. 我是log4j的新手,这是编写xml配置文件的正确方式吗?

  2. 如何为每个日志级别添加两个颜色代码?

    例如:DEBUG=green->将输出浅绿色字体,但我需要它是dimbold


如果您能为文档提供一个补丁,那就太好了!我们非常感谢您的帮助! - Remko Popma
8个回答

71

我想我找到了解决方案。我下载了log4j2-core-sources.jar并跟踪了源代码。你可以按照如下方式编写:

<Console name="SlowConsole" target="SYSTEM_OUT">
     <PatternLayout disableAnsi="false"  pattern="%highlight{%d{HH:mm:ss.SSS} %-5level %logger{36}.%M() @%L - %msg%n}{FATAL=red blink, ERROR=red, WARN=yellow bold, INFO=black, DEBUG=green bold, TRACE=blue}"/>
</Console>

我认为log4j2的文档和示例可能需要更新。


1
找到了一个手册 https://logging.apache.org/log4j/2.x/manual/layouts.html,搜索 highlight{pattern}{style} - Harmeet Singh
@HarmeetSingh 是的,这个答案现在有点过时了。 - Govinnage Rasika Perera
3
我需要将 disableAnsi="false" 进行翻译,但不改变原意,使其更加通俗易懂。结果为:我还需要执行 disableAnsi="false"。 - Kalpesh Soni
只是为了补充@KalpeshSoni的答案。disableAnsi="false"放在<PatternLayout/>中,紧挨着pattern="" - Mario Codes
2
添加了 disableAnsi="false"。 - Kalpesh Soni
显示剩余3条评论

50

要实现一个与Spring Boot默认的logback控制台输出非常相似的log4j2彩色输出:

    <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
        <PatternLayout pattern="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} %highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=red blink, ERROR=red, WARN=yellow bold, INFO=green, DEBUG=green bold, TRACE=blue} %style{${sys:PID}}{magenta} [%15.15t] %style{%-40.40C{1.}}{cyan} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    </Console>

控制台截图


2
应用自定义日志配置后,正是我想要的! - Frankie Drake
2
我收到了“在转换模式的第209个位置开始,无法识别的转换说明符[wEx]”的错误信息。有人知道发生了什么吗? - ycomp
是的,它看起来就像原始的Logback Spring记录器。这正是我要寻找的。但是在PatternLayout标记中不使用disableAnsi="false"属性它无法工作。谢谢! - Rustam Shafigullin
8
@ycomp 我已经修改了这个模式,并且您提到的问题也得到了解决... 请尝试使用以下模式:<PatternLayout disableAnsi="false" pattern="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} %highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=red blink, ERROR=red, WARN=yellow bold, INFO=green, DEBUG=green bold, TRACE=blue} %style{}{magenta} [%M] %style{%40C}{cyan} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%xEx}" />(本翻译仅供参考,如果需要准确理解,请以原文为准) - BlueDev

8

当使用Eclipse控制台时,看到红色的错误和其他所有日志都是黑色的非常好。您可以使用过滤器来实现此目的:

<Appenders>
    <Console name="ConsoleStdOut" target="SYSTEM_OUT">
        <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="ACCEPT"/>
        <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
    </Console>
    <Console name="ConsoleStdErr" target="SYSTEM_ERR">
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
    </Console>
</Appenders>
<Loggers>
    <Root level="info">
        <AppenderRef ref="ConsoleStdOut" />
        <AppenderRef ref="ConsoleStdErr" />
    </Root>
</Loggers>

5
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout
                    pattern="%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

这在我的Spring Boot应用中有效。

但我不确定它是否适用于没有Spring Boot的情况。


5

Spring Boot 风格:

<Properties>
  <Property name="LOG_PATTERN">
    %d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=green, TRACE=green} %style{${sys:PID}}{magenta} --- [%15.15t] %style{%-40.40c{1.}}{cyan} : %m%n%ex
  </Property>
</Properties>

<Appenders>
  <Console name="Console" target="SYSTEM_OUT">
    <PatternLayout pattern="${LOG_PATTERN}"/>
  </Console>
</Appenders>

4

如果有人想要使用log4j2.properties文件来实现相同的功能。适用于log4j2 2.17.1及以上版本。

status = warn

# Name of the configuration
name = ConsoleAndRollingLogFileAppenderConfigDemo

# Console appender configuration
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.disableAnsi=false
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=green, TRACE=green} %style{%pid}{magenta} --- [%15.15t] %style{%-40.40c{1.}}{cyan} : %m%n%ex

# Log files location
property.basePath = src/main/resources

# RollingFileAppender name, pattern, path and rollover policy
appender.rolling.type = RollingFile
appender.rolling.name = fileLogger
appender.rolling.fileName= ${basePath}/app.log
appender.rolling.filePattern= ${basePath}/app_%d{yyyyMMdd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=green, TRACE=green} %style{%pid}{magenta} --- [%15.15t] %style{%-40.40c{1.}}{cyan} : %m%n%ex
appender.rolling.policies.type = Policies

# RollingFileAppender rotation policy
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size = 100MB
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 30
appender.rolling.policies.time.modulate = true
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.delete.type = Delete
appender.rolling.strategy.delete.basePath = ${basePath}
appender.rolling.strategy.delete.maxDepth = 10
appender.rolling.strategy.delete.ifLastModified.type = IfLastModified

# Delete all files older than 30 days
appender.rolling.strategy.delete.ifLastModified.age = 60d

# Root logger level
rootLogger.level = debug

# Configure root logger
rootLogger.appenderRef.stdout.ref = consoleLogger
rootLogger.appenderRef.rolling.ref = fileLogger

1

谢谢@Homayoun!我的第二个问题还没有解决。我正在使用consoleAppender。我希望我的日志可以在netbeans、eclipse或任何STD_OUT上查看。所以HTMLLayout行不通,对吧? - Govinnage Rasika Perera
这取决于您的stdout查看器...例如,Eclipse的stdout(输出)对于加粗等操作没有任何意义。 - Farvardin

1

在log4j2 2.18.0中,对高亮和生成的ANSI代码进行了显著改进:

  • 4 bit color support was added. Before 2.18.0 it was possible to use WARN=bright blue but generated ANSI code anyway used only 3 bit color palette and set font weight as bold. Now it is possible to use all 16 colors and besides to change font weight. For this purpose it is necessary to use bright_ prefix. For example WARN=bright_blue or with font weight WARN=bright_blue bold. For details see this issue

  • true color support was added. For example, WARN=#00ff00. At the same time it is possible to change both foreground and background color. For details see this issue. For example:

    %highlight{%d [%t] %-5level: %msg%n%throwable}{FATAL=white, ERROR=red, WARN=bg_#5792e6 fg_#eef26b bold, INFO=black, DEBUG=#3fe0a8, TRACE=blue}
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接