【问题标题】:How to remove the additional info before the logging message itself?如何在日志消息本身之前删除附加信息?
【发布时间】:2021-02-14 09:22:11
【问题描述】:

我正在使用 Apache Log4j 记录器 (import org.apache.logging.log4j.core.Logger) 以 JSON 格式将消息发送到系统日志服务器。

我发送的消息是这样的:

{"id":"1"}

但是,在我收到的 syslog 服务器中:
Feb 14 10:33:27 localhost {"id":"1"}

如何在消息本身之前删除此附加信息(Feb 14 10:33:27 localhost)?

我的记录器配置

private Logger configureLogger(String appenderName, String loggerName, SyslogAppender syslogAppender) {
    try {
        if (syslogAppender != null) {
            syslogAppender.start();
            getConfig().addAppender(syslogAppender);
            AppenderRef[] refs = new AppenderRef[]{AppenderRef.createAppenderRef(appenderName, null, null)};
            LoggerConfig loggerConfig = LoggerConfig.createLogger("false", Level.DEBUG, loggerName,
                    "true", refs, null, getConfig(), null);
            loggerConfig.addAppender(syslogAppender, null, null);
            getConfig().removeLogger(loggerName);
            getConfig().addLogger(loggerName, loggerConfig);
            getContext().updateLoggers();
            return getContext().getLogger(loggerName);
        }
    } catch (IllegalStateException e) {
        LOGGER.error("An error occurred while configuring syslog settings");
        LOGGER.trace("Exception: ", e);
        throw e;
    }
    return null;
}

这是我的 SyslogAppender 配置

private SyslogAppender createSyslogAppender(ReportingSendProtocolType protocol, ReportingFacilityType reportingFacilityType, String host, int port, boolean ignoreExceptions, String appenderName, Configuration config) {
    return SyslogAppender.createAppender(host,
            port,
            protocol.name(),
            null,
            0,
            0,
            true,
            appenderName,
            true,
            ignoreExceptions,
            Facility.toFacility(reportingFacilityType.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[]{},
            true); //false
}

【问题讨论】:

  • 时间戳和主机名通常由 syslogd 在将消息写入文件时添加。你用的是什么系统日志?

标签: java logging log4j2 syslog


【解决方案1】:

您只需要配置 PatternLayout 它就是消息格式。

IE:

此模式将向您显示时间戳和类(由“t”表示)

%d{HH:mm:ss.SSS} [%t]

如果您只想显示消息,则模式如下:

%msg%n

有关模式的更多信息:https://logging.apache.org/log4j/2.x/manual/configuration.html

为了添加到您的代码中,您在这里有一个示例:

    PatternLayout layout= PatternLayout.createLayout(PATTERN, null, null, Charset.defaultCharset(),false,false,null,null);
        Appender appender=ConsoleAppender.createAppender(layout, null, null, "CONSOLE_APPENDER", null, null);
        appender.start();
    getConfig().addAppender(appender);

希望有用

【讨论】:

  • 我在问题中添加了 SyslogAppender 配置。我应该把模式 %msg%n 放在哪里?
  • 在文档中logging.apache.org/log4j/log4j-2.0-beta7/log4j-core/apidocs/org/… italic_format - 如果设置为“RFC5424”,则数据将按照 RFC 5424 进行格式化。否则,它将被格式化为 BSD Syslog 记录。_italic 设置系统日志的标准输出
  • 正如@DevJV 所说,SyslogAppender 使用RFC 5424 中描述的特定布局。与ConsoleAppender 不同,这是无法更改的。日志文件中显示的具体格式取决于 Syslogd 配置。例如。 Systemd-journald 可以将消息格式化为 JSON。
  • 所以这意味着如果我使用 SyslogAppender,我无法删除这些附加信息,对吗?
  • 不,这只是意味着 Log4j 不负责格式化,您应该查看您的 syslogd 文档。例如。对于 RSyslogd 检查the template configuration
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多