All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.logging.log4j.core.layout.SyslogLayout Maven / Gradle / Ivy

There is a newer version: 3.0.0-beta2
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache license, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the license for the specific language governing permissions and
 * limitations under the license.
 */
package org.apache.logging.log4j.core.layout;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.logging.log4j.core.Layout;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.Node;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
import org.apache.logging.log4j.core.net.Facility;
import org.apache.logging.log4j.core.net.Priority;
import org.apache.logging.log4j.core.util.NetUtils;
import org.apache.logging.log4j.util.Chars;

/**
 * Formats a log event as a BSD Log record.
 */
@Plugin(name = "SyslogLayout", category = Node.CATEGORY, elementType = Layout.ELEMENT_TYPE, printObject = true)
public final class SyslogLayout extends AbstractStringLayout {

    /**
     * Builds a SyslogLayout.
     * 

The main arguments are

*
    *
  • facility: The Facility is used to try to classify the message.
  • *
  • includeNewLine: If true a newline will be appended to the result.
  • *
  • escapeNL: Pattern to use for replacing newlines.
  • *
  • charset: The character set.
  • *
* @param the builder type */ public static class Builder> extends AbstractStringLayout.Builder implements org.apache.logging.log4j.core.util.Builder { public Builder() { setCharset(StandardCharsets.UTF_8); } @PluginBuilderAttribute private Facility facility = Facility.LOCAL0; @PluginBuilderAttribute("newLine") private boolean includeNewLine; @PluginBuilderAttribute("newLineEscape") private String escapeNL; @Override public SyslogLayout build() { return new SyslogLayout(facility, includeNewLine, escapeNL, getCharset()); } public Facility getFacility() { return facility; } public boolean isIncludeNewLine() { return includeNewLine; } public String getEscapeNL() { return escapeNL; } public B setFacility(final Facility facility) { this.facility = facility; return asBuilder(); } public B setIncludeNewLine(final boolean includeNewLine) { this.includeNewLine = includeNewLine; return asBuilder(); } public B setEscapeNL(final String escapeNL) { this.escapeNL = escapeNL; return asBuilder(); } } @PluginBuilderFactory public static > B newBuilder() { return new Builder().asBuilder(); } /** * Match newlines in a platform-independent manner. */ public static final Pattern NEWLINE_PATTERN = Pattern.compile("\\r?\\n"); private final Facility facility; private final boolean includeNewLine; private final String escapeNewLine; /** * Date format used if header = true. */ private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd HH:mm:ss", Locale.ENGLISH); /** * Host name used to identify messages from this appender. */ private final String localHostname = NetUtils.getLocalHostname(); protected SyslogLayout(final Facility facility, final boolean includeNL, final String escapeNL, final Charset charset) { super(charset); this.facility = facility; this.includeNewLine = includeNL; this.escapeNewLine = escapeNL == null ? null : Matcher.quoteReplacement(escapeNL); } /** * Formats a {@link org.apache.logging.log4j.core.LogEvent} in conformance with the BSD Log record format. * * @param event The LogEvent * @return the event formatted as a String. */ @Override public String toSerializable(final LogEvent event) { final StringBuilder buf = getStringBuilder(); buf.append('<'); buf.append(Priority.getPriority(facility, event.getLevel())); buf.append('>'); addDate(event.getTimeMillis(), buf); buf.append(Chars.SPACE); buf.append(localHostname); buf.append(Chars.SPACE); String message = event.getMessage().getFormattedMessage(); if (null != escapeNewLine) { message = NEWLINE_PATTERN.matcher(message).replaceAll(escapeNewLine); } buf.append(message); if (includeNewLine) { buf.append('\n'); } return buf.toString(); } private synchronized void addDate(final long timestamp, final StringBuilder buf) { final int index = buf.length() + 4; buf.append(dateFormat.format(new Date(timestamp))); // RFC 3164 says leading space, not leading zero on days 1-9 if (buf.charAt(index) == '0') { buf.setCharAt(index, Chars.SPACE); } } /** * Gets this SyslogLayout's content format. Specified by: *
    *
  • Key: "structured" Value: "false"
  • *
  • Key: "dateFormat" Value: "MMM dd HH:mm:ss"
  • *
  • Key: "format" Value: "<LEVEL>TIMESTAMP PROP(HOSTNAME) MESSAGE"
  • *
  • Key: "formatType" Value: "logfilepatternreceiver" (format uses the keywords supported by * LogFilePatternReceiver)
  • *
* * @return Map of content format keys supporting SyslogLayout */ @Override public Map getContentFormat() { final Map result = new HashMap<>(); result.put("structured", "false"); result.put("formatType", "logfilepatternreceiver"); result.put("dateFormat", dateFormat.toPattern()); result.put("format", "TIMESTAMP PROP(HOSTNAME) MESSAGE"); return result; } /** * Creates a SyslogLayout. * * @param facility The Facility is used to try to classify the message. * @param includeNewLine If true a newline will be appended to the result. * @param escapeNL Pattern to use for replacing newlines. * @param charset The character set. * @return A SyslogLayout. * @deprecated Use {@link #newBuilder()}. */ @Deprecated public static SyslogLayout createLayout(final Facility facility, final boolean includeNewLine, final String escapeNL, final Charset charset) { return new SyslogLayout(facility, includeNewLine, escapeNL, charset); } /** * Gets the facility. * * @return the facility */ public Facility getFacility() { return facility; } }