当前位置: 首页 > 面试题库 >

log4j2-Syslog附加程序和PatternLayout

夏谦
2023-03-14
问题内容

我需要将事件记录到系统日志中。我使用lo4j2和syslog附加程序。我的appender阻止log4j2.xml如下所示:

<appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <Syslog name="syslog" host="localhost" port="514" protocol="UDP" charset="ISO-8859-1">
        </Syslog>
        <RollingFile name="AppLog" fileName="/var/log/app.log"
                     filePattern="/var/log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
        </RollingFile>          
    </appenders>

如您所见,我有一个带有特定PatternLayout的Console附加程序和RollingFile附加程序。我想对Syslog附加程序使用相同的PatternLayout。但是,系统日志中的日志消息似乎总是使用预定义的布局。我尝试执行以下操作:

<Syslog name="syslog" host="localhost" port="514" protocol="UDP" charset="ISO-8859-1">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Syslog>

但这没有任何作用。syslog消息仍具有相同的预定格式。

如何确定进入系统日志的日志消息的格式?


问题答案:

由于这提到log4j2
bug报告
,log4j2开发商编码的SyslogAppender作为SocketAppender硬连线到SyslogLayout

因为它旨在符合原始syslog格式或RFC5424。因此,不允许使用其他布局。

不幸的是,他们没有意识到RFC 5424规范并未对日志中包含的消息实施任何特定的格式,在Log4j2实现中只是%m日志的一部分。

为了解决此问题,一种解决方案(在同一错误报告中建议)是使用SocketAppender内部的PatternLayout重现syslog格式,如下所示

<Socket name="SYSLOG" host="localhost" port="514" protocol="UDP">
  <PatternLayout
    pattern="&lt;1&gt;%d{MMM dd HH:mm:ss} ${hostName} appName: {
      &quot;host&quot;:&quot;${hostName}&quot;,
      &quot;thread&quot;:&quot;%t&quot;,
      &quot;level&quot;:&quot;%p&quot;,
      &quot;logger&quot;:&quot;%c{1}&quot;,
      &quot;line&quot;:%L,
      &quot;message&quot;:&quot;%enc{%m}&quot;,
      &quot;exception&quot;:&quot;%exception&quot;
      }%n"
  />
</Socket>

这将通过UDP将格式正确的RFC5424日志写入本地514端口。以下是示例日志输出:

Sep 14 10:40:50 app-hostname app-name: { "host":"host-name-01", "thread":"http-nio-8080-exec-4", "level":"DEBUG", "logger":"ExecuteTimeInterceptor", "line":52, "message":"GET &#x2F;health 200 served in 3", "exception":"" }


 类似资料:
  • 我有一个类,我在其中获取我的所有属性,并在日志记录之前隐藏它们的密码。 我已经迁移到log4j2,并希望测试这个类,检查log4j2的输出。它目前使用log4j并且可以工作,但是当我迁移到log4j2时,我得到了 但是,还有其他与这个mock的交互:mockappender.getName();->在org.apache.logging.log4j.core.config.AbstractConf

  • 我需要将事件记录到系统日志中。我使用lo4j2和syslog appender。我的附加程序在如下所示: 如您所见,我有一个控制台appender和一个具有特定PatternLayout的RollingFile appender。我想对Syslog appender使用相同的PatternLayout。然而,似乎总是在syslog中使用预定义的消息布局。我试着做到以下几点: 但这没有任何效果。系统

  • 当我尝试向远程Linux syslog写入一些消息时,我使用log4j2和appender syslog和format=rfc5424以及bsd.,我的配置文件如下: 当我运行一个测试程序时,我总是得到如下错误:原因:java.lang.IllegalArgumentException:在org.apache.logging.log4j.message.structuredDataid没有提供结构

  • 问题内容: 我在log4j2中创建了一个自定义附加程序。使用自定义追加程序时,出现以下错误:“ ERROR试图追加到未启动的追加程序”。任何帮助表示赞赏。 问题答案: Log4j 2将检查每个日志事件附加器是否处于可用状态。您看到的错误是Log4j检测到尚未准备好使用附加程序。 一些附加器需要进行准备才能使用。在生命周期的方法是其中追加程序可以做初始化的地方。Log4j不会将事件路由到未处于STA

  • 我有一个非常基本(几乎是教科书)的Log4J2示例,使用最新的(2.14.1): (取自官方appender文档): 程序,: <代码>pom。xml: 当我运行它时,我确实在中获得了预期的ERROR日志行;但是Java进程挂起(在完成后不会关闭)。线程转储显示(除了Java的本机线程之外)一个非守护进程异步附加线程,它仍然保持(很可能是挂起的原因)。 删除异步附加器(并直接附加到MyFile)会