如何在 Java 中使用 log4j SyslogAppender 时从 syslog 消息中删除 Header

How to remove the Header from syslog message while using log4j SyslogAppender in Java

我正在使用 log4j 版本 2.17.1 的 SyslogAppender(包 org.apache.logging。log4j.core.appender)来发送系统日志消息。

消息以下一种格式发送:

Mar 23 17:32:24 se-demo {"id": 1,"type": "test-type","severity": "test-severity","severityScore": 50,"securityEventTimestamp": 10101,"msg": "test-description","cat": "test-category","url": "test-url","dstIps": "test-destinationIps","dstHosts": "test-destinationHosts","destinationAccount": "test-destinationAccount","destination": "test-destination","destinationType": "test-destinationType","accessedTables": "test-.accessedTables","numOfAccessedObjects": "test-numOfAccessedObjects","srcUsers": "test-sourceUsers","srcIps": "test-sourceIps","srcHosts": "test-sourceHosts","sourceApps": "test-sourceApps","userAction": "test-userAction","clusterNames": "test-clusterNames","clusterMemberNames": "test-clusterMemberNames","actionType": "test-statusType"}

我想删除消息的 header(删除“Mar 23 17:32:24 se-demo”)并只发送消息本身。

我的 appender 是用 java 代码构建的:

 private SyslogAppender createSyslogAppender(SyslogSendProtocolType protocol, SyslogFacilityType syslogFacilityType, String host, int port, boolean ignoreExceptions, String appenderName, Configuration config) {
        return SyslogAppender.createAppender(
                host,
                port,
                protocol.name(),
                null,
                5000,
                2000,
                true,
                appenderName,
                true,
                ignoreExceptions,
                Facility.toFacility(syslogFacilityType.name()),
                null,
                Rfc5424Layout.DEFAULT_ENTERPRISE_NUMBER,
                true,
                null,
                null,
                null,
                true,
                null,
                appenderName,
                null,
                null,
                null,
                null,
                null,
                null,
                config,
                Charset.forName("UTF-8"),
                null,
                new LoggerFields[]{},
                true);
    }

我还附上了上面构造函数的打印屏幕,因此您可以了解每个成员的描述

我在该 appender 上找不到任何可以配置是否删除 header 的方法。 有什么想法吗?

备注:超过 30 个参数的工厂方法已被弃用,原因是:现在大多数 Log4j2 组件都有使代码更清晰的构建器。

您可以轻松地从 Log4j2 发送的 Syslog 消息中删除 header,方法是替换附加程序的布局:

final Layout layout = PatternLayout.createDefaultLayout(config);
SyslogAppender.newSyslogAppenderBuilder()//
        .setConfiguration(config)
        .setLayout(layout)
        .build();

但是我不会推荐这条路径:你只会丢失信息,系统日志服务器只会重新创建丢失的 header。

一个更合适的解决方案是相反的方向:

  • 您的 Syslog appender 使用旧的 BSD syslog 格式。将格式更改为 RFC5424,将允许您发送由所有现代 Syslog 服务器明确解释的消息:

    SyslogAppender.newSyslogAppenderBuilder()
            .setConfiguration(config)
            .setName(appenderName)
            .setFormat("RFC5424")
            .setAppName("myApp")
            .build();
    
  • 将您的系统日志服务器配置为仅保存消息部分。对于 RSyslog,这可以使用:

    $template PlainMessageFormat,"%msg%\n"
    
    :programname, startswith, "myApp" {
        action(type="omfile" file="/var/log/test.log" Template="PlainMessageFormat")
        stop
    }
    

    如果您使用的是 RSylog 8.3.0 或更高版本,您还可以将整个消息转储为 JSON:

    $template JsonMessageFormat,"%jsonmesg%\n"