Github user bbende commented on a diff in the pull request: https://github.com/apache/nifi/pull/2805#discussion_r196908047 --- Diff: nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ParseSyslog5424.java --- @@ -0,0 +1,174 @@ +/* + * 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.nifi.processors.standard; + +import com.github.palindromicity.syslog.NilPolicy; +import org.apache.nifi.annotation.behavior.EventDriven; +import org.apache.nifi.annotation.behavior.InputRequirement; +import org.apache.nifi.annotation.behavior.InputRequirement.Requirement; +import org.apache.nifi.annotation.behavior.SideEffectFree; +import org.apache.nifi.annotation.behavior.SupportsBatching; +import org.apache.nifi.annotation.behavior.WritesAttribute; +import org.apache.nifi.annotation.behavior.WritesAttributes; +import org.apache.nifi.annotation.documentation.CapabilityDescription; +import org.apache.nifi.annotation.documentation.SeeAlso; +import org.apache.nifi.annotation.documentation.Tags; +import org.apache.nifi.components.AllowableValue; +import org.apache.nifi.components.PropertyDescriptor; +import org.apache.nifi.expression.ExpressionLanguageScope; +import org.apache.nifi.flowfile.FlowFile; +import org.apache.nifi.processor.AbstractProcessor; +import org.apache.nifi.processor.ProcessContext; +import org.apache.nifi.processor.ProcessSession; +import org.apache.nifi.processor.Relationship; +import org.apache.nifi.processor.exception.ProcessException; +import org.apache.nifi.processor.io.InputStreamCallback; +import org.apache.nifi.processor.util.StandardValidators; +import org.apache.nifi.processors.standard.syslog.StrictSyslog5424Parser; +import org.apache.nifi.processors.standard.syslog.Syslog5424Event; +import org.apache.nifi.stream.io.StreamUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + + +@EventDriven +@SideEffectFree +@SupportsBatching +@InputRequirement(Requirement.INPUT_REQUIRED) +@Tags({"logs", "syslog", "syslog5424", "attributes", "system", "event", "message"}) +@CapabilityDescription("Attempts to parse the contents of a well formed Syslog message in accordance to RFC5424 " + + "format and adds attributes to the FlowFile for each of the parts of the Syslog message, including Structured Data." + + "Structured Data will be written to attributes as on attribute per item id + parameter "+ + "see https://tools.ietf.org/html/rfc5424." + + "Note: ParseSyslog5424 follows the specification more closely than ParseSyslog. If your Syslog producer " + + "does not follow the spec closely, with regards to using '-' for missing header entries for example, those logs " + + "will fail with this parser, where they would not fail with ParseSyslog.") +@WritesAttributes({@WritesAttribute(attribute = "syslog.priority", description = "The priority of the Syslog message."), + @WritesAttribute(attribute = "syslog.severity", description = "The severity of the Syslog message derived from the priority."), + @WritesAttribute(attribute = "syslog.facility", description = "The facility of the Syslog message derived from the priority."), + @WritesAttribute(attribute = "syslog.version", description = "The optional version from the Syslog message."), + @WritesAttribute(attribute = "syslog.timestamp", description = "The timestamp of the Syslog message."), + @WritesAttribute(attribute = "syslog.hostname", description = "The hostname or IP address of the Syslog message."), + @WritesAttribute(attribute = "syslog.appname", description = "The appname of the Syslog message."), + @WritesAttribute(attribute = "syslog.procid", description = "The procid of the Syslog message."), + @WritesAttribute(attribute = "syslog.messageid", description = "The messageid the Syslog message."), + @WritesAttribute(attribute = "syslog.structuredData", description = "Multiple entries per structuredData of the Syslog message."), + @WritesAttribute(attribute = "syslog.sender", description = "The hostname of the Syslog server that sent the message."), + @WritesAttribute(attribute = "syslog.body", description = "The body of the Syslog message, everything after the hostname.")}) +@SeeAlso({ListenSyslog.class, ParseSyslog.class, PutSyslog.class}) +public class ParseSyslog5424 extends AbstractProcessor { + + public static final AllowableValue OMIT = new AllowableValue(NilPolicy.OMIT.name(),NilPolicy.OMIT.name(),"The missing field will not have an attribute added."); + public static final AllowableValue NULL = new AllowableValue(NilPolicy.NULL.name(),NilPolicy.NULL.name(),"The missing field will have an empty attribute added."); + public static final AllowableValue DASH = new AllowableValue(NilPolicy.DASH.name(),NilPolicy.DASH.name(),"The missing field will have an attribute added with the value of '-'."); + + public static final PropertyDescriptor CHARSET = new PropertyDescriptor.Builder() + .name("Character Set") + .description("Specifies which character set of the Syslog messages") + .required(true) + .defaultValue("UTF-8") + .addValidator(StandardValidators.CHARACTER_SET_VALIDATOR) + .build(); + + public static final PropertyDescriptor NIL_POLICY = new PropertyDescriptor.Builder() + .name("nil_policy") + .displayName("NIL Policy") + .description("Defines how NIL values are handled for header fields.") + .addValidator(StandardValidators.NON_BLANK_VALIDATOR) + .allowableValues(OMIT,NULL,DASH) + .required(true) + .expressionLanguageSupported(ExpressionLanguageScope.NONE) + .defaultValue(NULL.getValue()) + .build(); + + static final Relationship REL_FAILURE = new Relationship.Builder() + .name("failure") + .description("Any FlowFile that could not be parsed as a Syslog message will be transferred to this Relationship without any attributes being added") + .build(); + static final Relationship REL_SUCCESS = new Relationship.Builder() + .name("success") + .description("Any FlowFile that is successfully parsed as a Syslog message will be to this Relationship.") + .build(); + + private StrictSyslog5424Parser parser; --- End diff -- Since this gets initialized in onTrigger which can be called by multiple different threads, it is generally a good idea to mark it as volatile
---