如何在log4j2中扩展syslogAppender

时间:2015-12-01 11:58:04

标签: java log4j2

在log4j中我使用syslog来记录消息

log4j.appender.SYSLOG.layout.ConversionPattern=%m%n

现在我更新到了log4j2。问题是syslog现在只包含2个布局,我不能使用一些自定义来记录消息,所以我需要覆盖它。我该怎么开始?

2 个答案:

答案 0 :(得分:0)

如果您想要自定义布局,请使用SocketAppender。

答案 1 :(得分:0)

好吧我扩展了syslogappender并创建了静态方法,我将layout添加为参数

@PluginFactory
public static PatternSyslogAppender createAppender(
        // @formatter:off
        @PluginAttribute("host") final String host,
        @PluginAttribute(value = "port", defaultInt = 0) final int port,
        @PluginAttribute("protocol") final String protocolStr,
        @PluginElement("SSL") final SslConfiguration sslConfig,
        @PluginAttribute(value = "connectTimeoutMillis", defaultInt = 0) final int connectTimeoutMillis,
        @PluginAliases("reconnectionDelay")// deprecated
        @PluginAttribute(value = "reconnectionDelayMillis", defaultInt = 0) final int reconnectionDelayMillis,
        @PluginAttribute(value = "immediateFail", defaultBoolean = true) final boolean immediateFail,
        @PluginAttribute("name") final String name,
        @PluginAttribute(value = "immediateFlush", defaultBoolean = true) final boolean immediateFlush,
        @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) final boolean ignoreExceptions,
        @PluginAttribute(value = "facility", defaultString = "LOCAL0") final Facility facility,
        @PluginAttribute("id") final String id,
        @PluginAttribute(value = "enterpriseNumber", defaultInt = Rfc5424Layout.DEFAULT_ENTERPRISE_NUMBER) final int enterpriseNumber,
        @PluginAttribute(value = "includeMdc", defaultBoolean = true) final boolean includeMdc,
        @PluginAttribute("mdcId") final String mdcId, @PluginAttribute("mdcPrefix") final String mdcPrefix,
        @PluginAttribute("eventPrefix") final String eventPrefix,
        @PluginAttribute(value = "newLine", defaultBoolean = false) final boolean newLine,
        @PluginAttribute("newLineEscape") final String escapeNL, @PluginAttribute("appName") final String appName,
        @PluginAttribute("messageId") final String msgId, @PluginAttribute("mdcExcludes") final String excludes,
        @PluginAttribute("mdcIncludes") final String includes,
        @PluginAttribute("mdcRequired") final String required, @PluginAttribute("format") final String format,
        @PluginElement("Filter") final Filter filter, @PluginConfiguration final Configuration config,
        @PluginAttribute(value = "charset", defaultString = "UTF-8") final Charset charsetName,
        @PluginAttribute("exceptionPattern") final String exceptionPattern,
        @PluginElement("LoggerFields") final LoggerFields[] loggerFields,
        @PluginAttribute(value = "advertise", defaultBoolean = false) final boolean advertise,
        @PluginElement("Layout") Layout<? extends Serializable> layout)

{
    // @formatter:on

    // TODO: add Protocol to TypeConverters
    final Protocol protocol = EnglishEnums.valueOf(Protocol.class, protocolStr);
    final boolean useTlsMessageFormat = sslConfig != null || protocol == Protocol.SSL;

    if (layout == null) {
        layout = PatternLayout.createDefaultLayout();
    }

    if (RFC5424.equalsIgnoreCase(format)) {
        Rfc5424Layout.createLayout(facility, id, enterpriseNumber, includeMdc, mdcId, mdcPrefix, eventPrefix,
                newLine, escapeNL, appName, msgId, excludes, includes, required, exceptionPattern,
                useTlsMessageFormat, loggerFields, config);
    } else if (layout == null) {
        SyslogLayout.createLayout(facility, newLine, escapeNL, charsetName);
    }

    if (name == null) {
        LOGGER.error("No name provided for SyslogAppender");
        return null;
    }
    final AbstractSocketManager manager = createSocketManager(name, protocol, host, port, connectTimeoutMillis,
            sslConfig, reconnectionDelayMillis, immediateFail, layout);

    return new PatternSyslogAppender(name, layout, filter, ignoreExceptions, immediateFlush, manager,
            advertise ? config.getAdvertiser() : null);
}