如何在 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"
我正在使用 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"