在log4j中我使用syslog来记录消息
log4j.appender.SYSLOG.layout.ConversionPattern=%m%n
现在我更新到了log4j2。问题是syslog现在只包含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);
}