Hi All, Just like anything in log4j-core, we try not break binary compatibility when we can but we do not bend over backwards like we do for log4j-api.
This class is public probably because Jackson requires it to be, otherwise I would have made it package private. The fact that we use Jackson for JSON IO is an implementation detail IMO, not an extension point. If anyone wants to hard-code a reference to log4j-core's guts then I think its fair to day that this comes with caveats. Gary On Sat, Jul 22, 2017 at 7:27 AM, Jörn Huxhorn <jhuxh...@googlemail.com> wrote: > Well… it says > > /** > * A Jackson JSON {@link ObjectMapper} initialized for Log4j. > * <p> > * <em>Consider this class private.</em> > * </p> > */ > > so I wanted to holler about how to continue. > > I’ll give it a shot. > > > On 22. July 2017 at 15:06:28, Mikael Ståldal (mi...@apache.org) wrote: > > Would it work to use > > org.apache.logging.log4j.core.jackson.Log4jJsonObjectMapper, which is > > public? > > > > See here how it is used: > > > > https://github.com/apache/logging-log4j-tools/blob/ > master/log4j-server/src/main/java/org/apache/logging/log4j/server/ > JsonInputStreamLogEventBridge.java > > > > > > On 2017-07-22 13:47, Jörn Huxhorn wrote: > > > It seems like I don’t get access to the log4j2 ObjectMapper or Jackson > Module used for > > JSON serialization, i.e. I can’t do something like this: > > > new JacksonFactory.JSON(encodeThreadContextAsList, includeStacktrace, > false) > > > > > > It would make sense to reuse your ObjectMapper/Module in my code > instead of reimplementing > > them to prevent future compatibility issues down the road. > > > > > > > > > On 19. July 2017 at 23:04:26, Jörn Huxhorn (jhuxh...@googlemail.com) > wrote: > > >> I’ll give this a shot over the next view days. > > >> > > >> Thanks! > > >> > > >> > > >> On 19. July 2017 at 21:33:49, Mikael Ståldal (mi...@apache.org) > wrote: > > >>> JsonLayout (and XmlLayout and YamlLayout) now supports 0-byte > > >>> termination of log events. Will be part of the upcoming 2.9 release. > > >>> > > >>> > > >>> On 2017-07-18 11:48, Jörn Huxhorn wrote: > > >>>> A general event header and footer would probably be overkill. > > >>>> > > >>>> I’m using the following interface in Lilith: > > >>>> > > >>>> public interface WriteByteStrategy { > > >>>> void writeBytes(DataOutputStream dataOutputStream, byte[] bytes) > > >>>> throws IOException; > > >>>> } > > >>>> > > >>>> One implementation writes an int with the length of bytes before > “bytes", the other > > >>> implementation writes a 0-byte after “bytes". > > >>>> > > >>>> The problem with that approach is that it requires the intermediate > “bytes” array > > >> and > > >>> is thus probably incompatible with your zero garbage approach. > > >>>> > > >>>> I didn’t try end-of-line (\r\n) mainly because I first wanted to > discuss this with > > >> you. > > >>> I would also have to implement a new receiver type whereas I could > just reuse an existing > > >>> one in case of 0-byte termination. > > >>>> > > >>>> I’d prefer using 0-byte termination since it would be less fragile > than end-of-line. > > >>> The end-of-line approach would break if compact=“false” was set > erroneously while > > >>> you’d still have the option of using either compact=“true” or > compact=“false” in > > case > > >>> of 0-byte termination. 0-byte termination is also slightly more > efficient while > > reading > > >>> since the splitting can operate on bytes instead of chars or Strings > - another reason > > >>> why I didn’t just implement it and instead wanted to discuss this > with you first. > > >>>> > > >>>> Joern > > >>>> > > >>>> > > >>>> On 18. July 2017 at 03:26:32, Ralph Goers ( > ralph.go...@dslextreme.com) wrote: > > >>>>> Right now that is all handled by the specific layouts. For > example, by default the > > >> RFC5424Layout > > >>>>> doesn’t append newlines so when writing to a file they will all be > on the same “line”, > > >>> but > > >>>>> it has an option to append one if needed. Doing the same would be > another option for > > >> the > > >>>>> JSONLayout. > > >>>>> > > >>>>> I’d be ok with event header and footers but ONLY if they have zero > overhead when not > > >> present. > > >>>>> IOW, when the Layout is initialized it would have to wire in the > appropriate encode > > >>> method. > > >>>>> > > >>>>> Ralph > > >>>>> > > >>>>>> On Jul 17, 2017, at 3:06 PM, Gary Gregory wrote: > > >>>>>> > > >>>>>> Do we want a general event header and footer then? > > >>>>>> > > >>>>>> Gary > > >>>>>> > > >>>>>> On Jul 17, 2017 14:43, "Ralph Goers" wrote: > > >>>>>> > > >>>>>>> No. A Footer is only used at end of file. He needs to know how > long each > > >>>>>>> event is or when it is the start of a new event. > > >>>>>>> > > >>>>>>> Ralph > > >>>>>>> > > >>>>>>>> On Jul 17, 2017, at 12:32 PM, Gary Gregory > > >>>>>>> wrote: > > >>>>>>>> > > >>>>>>>> Can't you use a footer for any terminator you wish? > > >>>>>>>> > > >>>>>>>> Gary > > >>>>>>>> > > >>>>>>>> On Mon, Jul 17, 2017 at 12:13 PM, Mikael Ståldal > > >>>>>>> wrote: > > >>>>>>>> > > >>>>>>>>> Hi. > > >>>>>>>>> > > >>>>>>>>> (Moving this discussion to logging dev mailing list.) > > >>>>>>>>> > > >>>>>>>>> Have you tried to use: > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> Then each log event will be terminated by end-of-line (\r\n). > > >>>>>>>>> > > >>>>>>>>> I think it would be easy to implement 0-byte terminated log > events in > > >>>>>>>>> JsonLayout, and that would make sense since we have > implemented support > > >>>>>>> for > > >>>>>>>>> that in GelfLayout. Created a JIRA issue for it: > > >>>>>>>>> https://issues.apache.org/jira/browse/LOG4J2-1981 > > >>>>>>>>> > > >>>>>>>>> As for other tools, the only receivers for Log4j 2 > SerializedLayout we > > >>>>>>>>> know are Log4j's own SocketServer and Lilith. Chainsaw > currently only > > >>>>>>>>> support Log4j 1 SerializedLayout. Log4j's own SocketServer > support > > >>>>>>>>> JsonLayout and XmlLayout as well, and we are changing it to use > > >>>>>>> JsonLayout > > >>>>>>>>> by default. > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> On 2017-07-17 15:01, Joern Huxhorn wrote: > > >>>>>>>>> > > >>>>>>>>>> Hi Mikael, > > >>>>>>>>>> > > >>>>>>>>>> I've just taken a look at the JsonLayout and see no way to > parse its > > >>>>>>>>>> output event by event. > > >>>>>>>>>> > > >>>>>>>>>> It's semi-fine for files because then it will result in a > well-formed > > >>>>>>>>>> array at the root level that can be read in one big swoop. It > isn't > > >>>>>>>>>> really ideal for that use case either since it means that the > whole > > >>>>>>>>>> array containing all events needs to be read into memory in > one piece, > > >>>>>>>>>> causing OOM in case of huge files. > > >>>>>>>>>> > > >>>>>>>>>> But in Lilith, I really need to process events one by one. > This is > > >>>>>>>>>> absolutely crucial. > > >>>>>>>>>> > > >>>>>>>>>> The only way to achieve this would essentially require me to > > >>>>>>>>>> re-implement a JSON parser that can cope with data like this. > > >>>>>>>>>> > > >>>>>>>>>> I implemented a similar kludge to support reading of log4j > xml files > > >>>>>>>>>> (see > > >>>>>>>>>> https://github.com/huxi/lilith/blob/master/log4j/log4j-xml/ > > >>>>>>>>>> src/main/java/de/huxhorn/lilith/log4j/xml/ > Log4jImportCallable.java > > >>>>>>>>>> ) but this was way easier since i could simply search for > > >>>>>>>>>> "" to find the position at which I could split the stream > > >>>>>>>>>> of events into a valid XML document for every single event . > This was > > >>>>>>>>>> still kind of nasty but doable, especially since processing an > > >>>>>>> "offline" > > >>>>>>>>>> XML file doesn't have the same performance restriction as > handling of > > >>>>>>>>>> live events. > > >>>>>>>>>> > > >>>>>>>>>> I wouldn't have the luxury of such a unique split signal in > JSON, > > >>>>>>> though. > > >>>>>>>>>> > > >>>>>>>>>> I would need to detect the "}" at the level of the root array > which > > >>>>>>>>>> would not simply involve counting of opening and closing > brackets but > > >>>>>>>>>> also ignoring of brackets inside of strings. This would boil > down to > > >>>>>>>>>> implementing a custom JSON reader and I won't be doing this. > > >>>>>>>>>> > > >>>>>>>>>> This isn't just me being lazy either. Such an implementation > wouldn't > > >>>>>>> be > > >>>>>>>>>> resource (CPU/memory) friendly anyway. > > >>>>>>>>>> > > >>>>>>>>>> In my own JSON receiver using my own JSON format there are > two ways to > > >>>>>>>>>> send those events: > > >>>>>>>>>> - write an int containing the amount of bytes representing > the event, > > >>>>>>>>>> then the bytes of the event. This type of events also supports > > >>>>>>>>>> compression. > > >>>>>>>>>> - write the bytes of the event, followed by a 0-byte. This > works fine > > >>>>>>>>>> and JavaScript/ActionScript is able to produce events like > that while > > >>>>>>>>>> they are unable (or were unable 7 years ago) to count the > bytes on > > >>>>>>> their > > >>>>>>>>>> own. This type of events only supports plain text like JSON > or XML and > > >>>>>>>>>> no compression since compressed events could contain the > 0-byte while > > >>>>>>>>>> XML and JSON both won't allow it. > > >>>>>>>>>> > > >>>>>>>>>> Both are essentially "binary" formats because of either the > raw ints or > > >>>>>>>>>> the 0-bytes. > > >>>>>>>>>> > > >>>>>>>>>> I'm not sure why you deprecate SerializedLayout since the > security > > >>>>>>>>>> issues arise only while deserializing the events, not while > serializing > > >>>>>>>>>> them. Is this just meant to educate the user about the issue? > > >>>>>>>>>> > > >>>>>>>>>> I fixed the remote code execution exploit by implementing > > >>>>>>>>>> https://github.com/huxi/lilith/blob/master/lilith-engine/ > > >>>>>>>>>> src/main/java/de/huxhorn/lilith/engine/impl/eventproduc > > >>>>>>>>>> er/WhitelistObjectInputStream.java > > >>>>>>>>>> > > >>>>>>>>>> This still doesn't fix DoS scenarios (endless loops or OOM in > case of > > >>>>>>>>>> malicious data) but is close enough for me, mainly because > fixing the > > >>>>>>>>>> DoS issues would really have to be handled by Java, not by > user code. > > >>>>>>>>>> Manually re-implementing deserialization would likely be > fragile and > > >>>>>>>>>> error prone, possibly even introducing other security issues > on its > > >>>>>>> own. > > >>>>>>>>>> > > >>>>>>>>>> I'd be interested how other tools are tackling this issue. Is > Chainsaw > > >>>>>>>>>> officially dead or are they implementing receivers for event > streams > > >>>>>>>>>> like this? > > >>>>>>>>>> > > >>>>>>>>>> I'm totally fine with implementing a new receiver as a > replacement for > > >>>>>>>>>> log4j2 SerializedLayout (even though I won't be able to get > rid of the > > >>>>>>>>>> Serializable receiver anyway) but the current JsonLayout just > isn't up > > >>>>>>>>>> to the job at the moment. > > >>>>>>>>>> > > >>>>>>>>>> Feel free to share this mail with your fellow developers. I'm > open for > > >>>>>>>>>> suggestions. > > >>>>>>>>>> > > >>>>>>>>>> I hope this doesn't come across in a harsh way. It isn't > meant to be. > > >>>>>>>>>> > > >>>>>>>>>> Cheers, > > >>>>>>>>>> Jörn. > > >>>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>>>> > > >>>>> > > >>>>> > > >>>>> > > >>>> > > >>> > > >>> > > >> > > >> > > > > > > > > >