如何在日志消息本身之前删除附加信息?

Posted

技术标签:

【中文标题】如何在日志消息本身之前删除附加信息?【英文标题】: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 在将消息写入文件时添加。你用的是什么系统日志? 【参考方案1】:

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

IE:

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

%dHH: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。

以上是关于如何在日志消息本身之前删除附加信息?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除GRUB 引导信息?

如何删除SQL SERVER中的日志文件

如何以自定义漂亮的日志格式在每个新行上附加制表符?

在WooCommerce中显示附加信息之前,请检查尺寸,属性和/或重量

如何在camel-ftp启动之前添加日志消息?

如何附加到 AES 加密文件