For my money, I also do not see the point of declaring IOException in the
API and then changing one kind of IOException to a ParseException.
I would just rewrite the class like this:
class AbstractJacksonLogEventParser implements TextLogEventParser {
final ObjectReader objectReader;
AbstractJacksonLogEventParser(ObjectReader objectReader) {
this.objectReader = objectReader;
}
@Override
public LogEvent parseFrom(InputStream input) throws IOException,
ParseException {
return objectReader.readValue(input);
}
@Override
public LogEvent parseFrom(Reader input) throws IOException,
ParseException {
return objectReader.readValue(input);
}
@Override
public LogEvent parseFrom(String input) throws ParseException {
try {
return objectReader.readValue(input);
} catch (IOException e) {
throw new ParseException(e);
}
}
@Override
public LogEvent parseFrom(byte[] input) throws ParseException {
try {
return objectReader.readValue(input);
} catch (IOException e) {
throw new ParseException(e);
}
}
@Override
public LogEvent parseFrom(byte[] input, int offset, int length) throws
ParseException {
try {
return objectReader.readValue(input, offset, length);
} catch (IOException e) {
throw new ParseException(e);
}
}
}
The other other question is whether all APIs should declare IOException and
ParseException.
Gary
On Sat, Jul 22, 2017 at 1:48 PM, <[email protected]> wrote:
> Repository: logging-log4j2
> Updated Branches:
> refs/heads/LOG4J2-1986 [created] c4814a873
>
>
> LOG4J2-1986 Public API for parsing the output from
> JsonLayout/XmlLayout/YamlLayout
> into a LogEvent
>
>
> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/
> commit/c4814a87
> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/c4814a87
> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/c4814a87
>
> Branch: refs/heads/LOG4J2-1986
> Commit: c4814a8730eb24bdf89cf23c89b4a957b8418ba5
> Parents: eea873e
> Author: Mikael Ståldal <[email protected]>
> Authored: Sat Jul 22 22:48:24 2017 +0200
> Committer: Mikael Ståldal <[email protected]>
> Committed: Sat Jul 22 22:48:24 2017 +0200
>
> ----------------------------------------------------------------------
> .../parser/AbstractJacksonLogEventParser.java | 85 +++++++++++++++
> .../log4j/core/parser/JsonLogEventParser.java | 32 ++++++
> .../log4j/core/parser/LogEventParser.java | 64 ++++++++++++
> .../log4j/core/parser/ParseException.java | 34 ++++++
> .../log4j/core/parser/TextLogEventParser.java | 50 +++++++++
> .../log4j/core/parser/XmlLogEventParser.java | 32 ++++++
> .../log4j/core/parser/YamlLogEventParser.java | 33 ++++++
> .../logging/log4j/core/parser/package-info.java | 20 ++++
> .../core/parser/JsonLogEventParserTest.java | 103 +++++++++++++++++++
> src/changes/changes.xml | 3 +
> 10 files changed, 456 insertions(+)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/
> AbstractJacksonLogEventParser.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/AbstractJacksonLogEventParser.java b/log4j-core/src/main/java/
> org/apache/logging/log4j/core/parser/AbstractJacksonLogEventParser.java
> new file mode 100644
> index 0000000..8b00e57
> --- /dev/null
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/
> AbstractJacksonLogEventParser.java
> @@ -0,0 +1,85 @@
> +/*
> + * 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.parser;
> +
> +import com.fasterxml.jackson.core.JsonProcessingException;
> +import com.fasterxml.jackson.databind.ObjectReader;
> +import org.apache.logging.log4j.core.LogEvent;
> +import org.apache.logging.log4j.core.impl.Log4jLogEvent;
> +import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
> +
> +import java.io.IOException;
> +import java.io.InputStream;
> +import java.io.Reader;
> +
> +class AbstractJacksonLogEventParser implements TextLogEventParser {
> + final ObjectReader objectReader;
> +
> + AbstractJacksonLogEventParser(ObjectReader objectReader) {
> + this.objectReader = objectReader;
> + }
> +
> + @Override
> + public LogEvent parseFrom(InputStream input) throws IOException,
> ParseException {
> + try {
> + return objectReader.readValue(input);
> + } catch (JsonProcessingException e) {
> + throw new ParseException(e);
> + }
> + }
> +
> + @Override
> + public LogEvent parseFrom(Reader input) throws IOException,
> ParseException {
> + try {
> + return objectReader.readValue(input);
> + } catch (JsonProcessingException e) {
> + throw new ParseException(e);
> + }
> + }
> +
> + @Override
> + public LogEvent parseFrom(String input) throws ParseException {
> + try {
> + return objectReader.readValue(input);
> + } catch (JsonProcessingException e) {
> + throw new ParseException(e);
> + } catch (IOException e) {
> + throw new RuntimeException(e);
> + }
> + }
> +
> + @Override
> + public LogEvent parseFrom(byte[] input) throws ParseException {
> + try {
> + return objectReader.readValue(input);
> + } catch (JsonProcessingException e) {
> + throw new ParseException(e);
> + } catch (IOException e) {
> + throw new RuntimeException(e);
> + }
> + }
> +
> + @Override
> + public LogEvent parseFrom(byte[] input, int offset, int length)
> throws ParseException {
> + try {
> + return objectReader.readValue(input, offset, length);
> + } catch (JsonProcessingException e) {
> + throw new ParseException(e);
> + } catch (IOException e) {
> + throw new RuntimeException(e);
> + }
> + }
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/
> JsonLogEventParser.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/JsonLogEventParser.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/JsonLogEventParser.java
> new file mode 100644
> index 0000000..218de0b
> --- /dev/null
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/JsonLogEventParser.java
> @@ -0,0 +1,32 @@
> +/*
> + * 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.parser;
> +
> +import org.apache.logging.log4j.core.LogEvent;
> +import org.apache.logging.log4j.core.impl.Log4jLogEvent;
> +import org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper;
> +
> +/**
> + * Parse the output from JsonLayout layout into instances of {@link
> LogEvent}.
> + */
> +public class JsonLogEventParser extends AbstractJacksonLogEventParser {
> +
> + public JsonLogEventParser() {
> + super(new Log4jJsonObjectMapper().readerFor(Log4jLogEvent.class)
> );
> + }
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/main/java/org/apache/logging/log4j/
> core/parser/LogEventParser.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/LogEventParser.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/LogEventParser.java
> new file mode 100644
> index 0000000..88e84fb
> --- /dev/null
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/LogEventParser.java
> @@ -0,0 +1,64 @@
> +/*
> + * 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.parser;
> +
> +import org.apache.logging.log4j.core.LogEvent;
> +
> +import java.io.IOException;
> +import java.io.InputStream;
> +
> +/**
> + * Parse the output from a layout into instances of {@link LogEvent}.
> + */
> +public interface LogEventParser {
> +
> + /**
> + * Parse from an InputStream. The input stream may contain multiple
> log events.
> + * This method will read one log event and leave the stream open and
> positioned to read the
> + * next log event.
> + *
> + * @param input the input stream
> + *
> + * @return the parsed LogEvent, or {@literal null} of end of input is
> reached.
> + * @throws IOException if unable to read from the input
> + * @throws ParseException if the input is malformed and cannot be
> parsed as a LogEvent
> + */
> + LogEvent parseFrom(InputStream input) throws IOException,
> ParseException;
> +
> + /**
> + * Parse from a byte array, which is expected to contain exactly one
> log event.
> + *
> + * @param input the byte array
> + *
> + * @return the parsed LogEvent, never {@literal null}.
> + * @throws ParseException if the input is malformed and cannot be
> parsed as a LogEvent
> + */
> + LogEvent parseFrom(byte[] input) throws ParseException;
> +
> + /**
> + * Parse from a specified range of a byte array. The specified range
> is expected to contain
> + * exactly one log event.
> + *
> + * @param input the byte array
> + * @param offset the initial offset
> + * @param length the length
> + *
> + * @return the parsed LogEvent, never {@literal null}.
> + * @throws ParseException if the input is malformed and cannot be
> parsed as a LogEvent
> + */
> + LogEvent parseFrom(byte[] input, int offset, int length) throws
> ParseException;
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/main/java/org/apache/logging/log4j/
> core/parser/ParseException.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/ParseException.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/ParseException.java
> new file mode 100644
> index 0000000..8f5fa54
> --- /dev/null
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/ParseException.java
> @@ -0,0 +1,34 @@
> +/*
> + * 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.parser;
> +
> +/**
> + * Thrown when the input cannot be parsed.
> + */
> +public class ParseException extends Exception {
> + public ParseException(String message) {
> + super(message);
> + }
> +
> + public ParseException(String message, Throwable cause) {
> + super(message, cause);
> + }
> +
> + public ParseException(Throwable cause) {
> + super(cause);
> + }
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/
> TextLogEventParser.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/TextLogEventParser.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/TextLogEventParser.java
> new file mode 100644
> index 0000000..3428024
> --- /dev/null
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/TextLogEventParser.java
> @@ -0,0 +1,50 @@
> +/*
> + * 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.parser;
> +
> +import org.apache.logging.log4j.core.LogEvent;
> +
> +import java.io.IOException;
> +import java.io.Reader;
> +
> +/**
> + * Parse the output from a text based layout into instances of {@link
> LogEvent}.
> + */
> +public interface TextLogEventParser extends LogEventParser {
> + /**
> + * Parse from a Reader. The reader may contain multiple log events.
> + * This method will read one log event and leave the reader open and
> positioned to read the
> + * next log event.
> + *
> + * @param input the reader
> + *
> + * @return the parsed LogEvent, or {@literal null} of end of input is
> reached.
> + * @throws IOException if unable to read from the input
> + * @throws ParseException if the input is malformed and cannot be
> parsed as a LogEvent
> + */
> + LogEvent parseFrom(Reader input) throws IOException, ParseException;
> +
> + /**
> + * Parse from a String, which is expected to contain exactly one log
> event.
> + *
> + * @param input the string
> + *
> + * @return the parsed LogEvent
> + * @throws ParseException if the input is malformed and cannot be
> parsed as a LogEvent
> + */
> + LogEvent parseFrom(String input) throws ParseException;
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/main/java/org/apache/logging/log4j/
> core/parser/XmlLogEventParser.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/XmlLogEventParser.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/XmlLogEventParser.java
> new file mode 100644
> index 0000000..597e70b
> --- /dev/null
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/XmlLogEventParser.java
> @@ -0,0 +1,32 @@
> +/*
> + * 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.parser;
> +
> +import org.apache.logging.log4j.core.LogEvent;
> +import org.apache.logging.log4j.core.impl.Log4jLogEvent;
> +import org.apache.logging.log4j.core.jackson.Log4jXmlObjectMapper;
> +
> +/**
> + * Parse the output from XmlLayout layout into instances of {@link
> LogEvent}.
> + */
> +public class XmlLogEventParser extends AbstractJacksonLogEventParser {
> +
> + public XmlLogEventParser() {
> + super(new Log4jXmlObjectMapper().readerFor(Log4jLogEvent.class));
> + }
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/
> YamlLogEventParser.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/YamlLogEventParser.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/YamlLogEventParser.java
> new file mode 100644
> index 0000000..59b3463
> --- /dev/null
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/YamlLogEventParser.java
> @@ -0,0 +1,33 @@
> +/*
> + * 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.parser;
> +
> +import org.apache.logging.log4j.core.LogEvent;
> +import org.apache.logging.log4j.core.impl.Log4jLogEvent;
> +import org.apache.logging.log4j.core.jackson.Log4jXmlObjectMapper;
> +import org.apache.logging.log4j.core.jackson.Log4jYamlObjectMapper;
> +
> +/**
> + * Parse the output from YamlLayout layout into instances of {@link
> LogEvent}.
> + */
> +public class YamlLogEventParser extends AbstractJacksonLogEventParser {
> +
> + public YamlLogEventParser() {
> + super(new Log4jYamlObjectMapper().readerFor(Log4jLogEvent.class)
> );
> + }
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/main/java/org/apache/logging/log4j/
> core/parser/package-info.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/parser/package-info.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/package-info.java
> new file mode 100644
> index 0000000..3506570
> --- /dev/null
> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/
> parser/package-info.java
> @@ -0,0 +1,20 @@
> +/*
> + * 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.
> + */
> +/**
> + * Parsers for the output of various layouts.
> + */
> +package org.apache.logging.log4j.core.parser;
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/log4j-core/src/test/java/org/apache/logging/log4j/core/parser/
> JsonLogEventParserTest.java
> ----------------------------------------------------------------------
> diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/
> parser/JsonLogEventParserTest.java b/log4j-core/src/test/java/
> org/apache/logging/log4j/core/parser/JsonLogEventParserTest.java
> new file mode 100644
> index 0000000..5684602
> --- /dev/null
> +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/
> parser/JsonLogEventParserTest.java
> @@ -0,0 +1,103 @@
> +/*
> + * 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.parser;
> +
> +import org.apache.logging.log4j.core.LogEvent;
> +import org.junit.Before;
> +import org.junit.Test;
> +
> +import static org.junit.Assert.assertEquals;
> +import static org.junit.Assert.assertNotNull;
> +
> +public class JsonLogEventParserTest {
> +
> + private JsonLogEventParser parser;
> +
> + private static final String JSON = "{\n" +
> + " \"timeMillis\" : 1493121664118,\n" +
> + " \"thread\" : \"main\",\n" +
> + " \"level\" : \"INFO\",\n" +
> + " \"loggerName\" : \"HelloWorld\",\n" +
> + " \"marker\" : {\n" +
> + " \"name\" : \"child\",\n" +
> + " \"parents\" : [ {\n" +
> + " \"name\" : \"parent\",\n" +
> + " \"parents\" : [ {\n" +
> + " \"name\" : \"grandparent\"\n" +
> + " } ]\n" +
> + " } ]\n" +
> + " },\n" +
> + " \"message\" : \"Hello, world!\",\n" +
> + " \"thrown\" : {\n" +
> + " \"commonElementCount\" : 0,\n" +
> + " \"name\" : \"java.lang.RuntimeException\",\n" +
> + " \"extendedStackTrace\" : [ {\n" +
> + " \"class\" : \"logtest.Main\",\n" +
> + " \"method\" : \"main\",\n" +
> + " \"file\" : \"Main.java\",\n" +
> + " \"line\" : 29,\n" +
> + " \"exact\" : true,\n" +
> + " \"location\" : \"classes/\",\n" +
> + " \"version\" : \"?\"\n" +
> + " } ]\n" +
> + " },\n" +
> + " \"contextStack\" : [ \"one\", \"two\" ],\n" +
> + " \"endOfBatch\" : false,\n" +
> + " \"loggerFqcn\" :
> \"org.apache.logging.log4j.spi.AbstractLogger\",\n"
> +
> + " \"contextMap\" : {\n" +
> + " \"bar\" : \"BAR\",\n" +
> + " \"foo\" : \"FOO\"\n" +
> + " },\n" +
> + " \"threadId\" : 1,\n" +
> + " \"threadPriority\" : 5,\n" +
> + " \"source\" : {\n" +
> + " \"class\" : \"logtest.Main\",\n" +
> + " \"method\" : \"main\",\n" +
> + " \"file\" : \"Main.java\",\n" +
> + " \"line\" : 29\n" +
> + " }\n" +
> + "}";
> +
> + @Before
> + public void setup() {
> + parser = new JsonLogEventParser();
> + }
> +
> + @Test
> + public void testString() throws ParseException {
> + LogEvent logEvent = parser.parseFrom(JSON);
> + assertNotNull(logEvent);
> + assertEquals("HelloWorld", logEvent.getLoggerName());
> + // TODO assert more here
> + }
> +
> + @Test(expected = ParseException.class)
> + public void testStringEmpty() throws ParseException {
> + parser.parseFrom("");
> + }
> +
> + @Test(expected = ParseException.class)
> + public void testStringInvalidJson() throws ParseException {
> + parser.parseFrom("foobar");
> + }
> +
> + @Test(expected = ParseException.class)
> + public void testStringInvalidProperty() throws ParseException {
> + parser.parseFrom("{\"foo\":\"bar\"}");
> + }
> +
> +}
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/
> c4814a87/src/changes/changes.xml
> ----------------------------------------------------------------------
> diff --git a/src/changes/changes.xml b/src/changes/changes.xml
> index 074e31c..522f49b 100644
> --- a/src/changes/changes.xml
> +++ b/src/changes/changes.xml
> @@ -31,6 +31,9 @@
> - "remove" - Removed
> -->
> <release version="2.9.0" date="2017-MM-DD" description="GA Release
> 2.9.0">
> + <action issue="LOG4J2-1986" dev="mikes" type="add">
> + Public API for parsing the output from
> JsonLayout/XmlLayout/YamlLayout
> into a LogEvent.
> + </action>
> <action issue="LOG4J2-1984" dev="rgoers" type="update">
> Allow maxLength of StructuredData to be specified by the user.
> </action>
>
>