Java 如何知道在不依赖异常的情况下使用log4j是否正确发送了syslog消息
我使用log4j向syslog服务器发送syslog消息 如果syslog消息没有正确发送(例如syslog服务关闭),则会引发异常,这非常好,因为我有指示 我有这样一个例子:我通过TCP发送syslog消息,syslog服务器上的防火墙阻止了我,但没有引发异常 我想知道什么时候会有这样的消息被阻止 是否有必要知道消息是否在不依赖异常的情况下正确发送 也许有一个不同的框架来发送syslog消息,可以为我提供所需的信息 如果有帮助,您可以在下面找到我的当前代码Java 如何知道在不依赖异常的情况下使用log4j是否正确发送了syslog消息,java,logging,log4j2,syslog,Java,Logging,Log4j2,Syslog,我使用log4j向syslog服务器发送syslog消息 如果syslog消息没有正确发送(例如syslog服务关闭),则会引发异常,这非常好,因为我有指示 我有这样一个例子:我通过TCP发送syslog消息,syslog服务器上的防火墙阻止了我,但没有引发异常 我想知道什么时候会有这样的消息被阻止 是否有必要知道消息是否在不依赖异常的情况下正确发送 也许有一个不同的框架来发送syslog消息,可以为我提供所需的信息 如果有帮助,您可以在下面找到我的当前代码 private Logger con
private Logger configureSyslog(SyslogSendProtocolType protocol, SyslogFacilityType syslogFacilityType, String host, int port, boolean ignoreExceptions, String appenderName, String loggerName) {
try {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
SyslogAppender itpSyslogAppender = SyslogAppender.createAppender(host,
port,
protocol.name(),
null,
0,
0,
true,
appenderName,
true,
ignoreExceptions,
Facility.toFacility(syslogFacilityType.name()),
null,
Rfc5424Layout.DEFAULT_ENTERPRISE_NUMBER,
true,
null,
null,
null,
true,
null,
null,
null,
null,
null,
null,
null,
null,
config,
Charset.forName("UTF-8"),
null,
new LoggerFields[]{},
false);
itpSyslogAppender.start();
config.addAppender(itpSyslogAppender);
AppenderRef[] refs = new AppenderRef[]{AppenderRef.createAppenderRef(appenderName, null, null)};
LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.DEBUG, loggerName,
"true", refs, null, config, null);
loggerConfig.addAppender(itpSyslogAppender, null, null);
config.removeLogger(loggerName);
config.addLogger(loggerName, loggerConfig);
ctx.updateLoggers();
return ctx.getLogger(loggerName);
} catch (IllegalStateException e) {
LOGGER.error("An error occurred while configuring syslog settings");
LOGGER.trace("Exception: ", e);
throw e;
}
}
public synchronized void sendSyslog(String msg, SyslogSendLevelType level) {
System.out.println("sending syslog");
Logger sysLogger = configureSyslog(protocol, syslogFacilityType, host, port, false, SYSLOG_APPENDER_NAME, ITP_LOGGER_NAME);
try {
sysLogger.log(levelsMapping.get(level), msg);
} catch (Exception e) {
System.out.println("syslog message cannot be sent");
}
}
SyslogAppender扩展了SocketAppender,因此两者都只使用TCP。首先,您有操作系统缓冲区,其中发送的消息可能驻留在客户机中,直到在应用程序移动很久之后刷新缓冲区为止。然后,防火墙可能会收到消息,并简单地丢弃它,或者它可能会确认它,在这种情况下,您永远不会知道它没有收到。即使没有防火墙,也不能保证接收应用程序没有崩溃,操作系统还没有关闭套接字。简言之,只有要求应用程序确认每条消息的协议才能向客户端提供消息已被接收的保证。Syslog不是那个协议