当前位置: 首页 > 知识库问答 >
问题:

log4j2-Syslog appender和Pattern Layout

充子航
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>

如您所见,我有一个控制台appender和一个具有特定PatternLayout的RollingFile appender。我想对Syslog appender使用相同的PatternLayout。然而,似乎总是在syslog中使用预定义的消息布局。我试着做到以下几点:

<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>

但这没有任何效果。系统日志消息仍然具有相同的预定义格式。

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

共有3个答案

宿淳
2023-03-14

您可以使用LoggerFields标记向RFC5424格式的SyslogAppender消息添加其他元素,如下所示:

<LoggerFields>
  <KeyValuePair key="thread" value="%t"/>
  <KeyValuePair key="priority" value="%p"/>
  <KeyValuePair key="category" value="%c"/>
  <KeyValuePair key="exception" value="%ex"/>
</LoggerFields>

然后,我使用rsyslog的RFC5424解析模块mmpstrucdata将这些提取出来,以创建json树。访问它们的rsyslog.conf模板如下:

template(name="jsondump" type="string" string="'%$!rfc5424-sd!mdc@18060!thread%', '%$!rfc5424-sd!mdc@18060!priority%', '%$!rfc5424-sd!mdc@18060!category%', '%$!rfc5424-sd!mdc@18060!exception%'")

我只是想做同样的事,我想分享一下对我有用的东西山姆

何峰
2023-03-14

我不相信您可以在基本Syslog appender上使用模式

从文件中可以看出

msgstr"Sy口号Appender是一个SocketAppender,它以符合BSD Syslog格式或RFC 5424的格式将其输出写入主机和端口指定的远程目标http://logging.apache.org/log4j/2.x/manual/appenders.html#SyslogAppender

但是,它允许您指定“format=RFC 5424”

如果你用RFC 5424

然后可以在loggerFields参数中放置PatterLayout。看见http://logging.apache.org/log4j/2.x/manual/layouts.html#RFC5424Layout

希望有帮助!

林泰平
2023-03-14

正如在这个log4j2错误报告中提到的,log4j2的开发人员将系统脚本编码为一个硬连接到系统脚本布局的SocketAppender

因为它旨在符合原始的syslog格式或RFC 5424。不允许其他布局。

遗憾的是,他们没有意识到RFC 5424规范没有对日志中包含的消息强制执行任何特定格式,而在Log4j2实现中,只有日志的%m部分。

为了解决这个问题,一个解决方案(在同一个bug报告中建议)是使用SocketAppender中的PatternLayout复制系统日志格式,如下所示

<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":"" }
 类似资料:
  • 问题内容: 我有一个使用log4j SyslogAppender(facility = USER)的Java应用程序,我可以在端口514上使用tcpdump看到我的应用程序正在将预期的日志消息作为数据报发送,并且netstat告诉我syslogd(红色帽子)正在运行并且正在监听0.0 .0.0:514,但我看不到/ var / log / messages中发生任何日志记录。 在我的syslog.

  • 我无法让Log4j2在日志文件上写入Spring和Spring Security日志消息(后者我绝对需要解决一个问题)。我在这里和其他地方读了很多(当然,就像在Spring参考中),但我无法使我找到的解决方案适用于我的案例。 需要注意的是,在下面的两个解决方案中,地雷日志记录消息和hibernate消息都正确地写入了文件。该问题只影响Spring消息。 据我所知,Spring使用jcl(commo

  • 我目前正在尝试用log4j/slf4j和java 11构建一个应用程序,但在运行时我面临这个问题: 此问题的根源代码是我的记录器的初始化: 我依赖于: org.apache.logging.log4j: log4j-api: 2.11.1 org.apache.logging.log4j: log4j-core: 2.11.1 org.apache.logging.log4j: log4j-slf

  • 我们使用spring boot 2.1.5和starter parent作为pom依赖项。 Spring启动使用默认的日志回馈进行日志记录,我们尚未显式切换到Log4j2或更改任何配置。下面是我们的项目依赖关系树。 我们的项目中有很多lombok@log4j2注释。但是,我们在依赖关系树中发现我们没有任何log4j2-core jar依赖项(发现它容易受到最近log4j问题的影响)。 lombok

  • 问题内容: 我需要将事件记录到系统日志中。我使用lo4j2和syslog附加程序。我的appender阻止如下所示: 如您所见,我有一个带有特定PatternLayout的Console附加程序和RollingFile附加程序。我想对Syslog附加程序使用相同的PatternLayout。但是,系统日志中的日志消息似乎总是使用预定义的布局。我尝试执行以下操作: 但这没有任何作用。syslog消息

  • 问题内容: 我已将应用程序迁移到log4j 2,并通过log4j2.xml对其进行了配置 但是,我正在使用的某些库取决于log4j1。如果我使用以下命令运行该应用程序: log4j 1抱怨找不到配置文件。我正在使用log4j 2,log4j-1.2-api-2.0-rc1.jar提供的log4j 1.x桥。是否可以使用单个log4j2.xml进行配置? 我尝试过的替代方法是同时配置log4j和lo