Congrats! Just a reminder - you now have write access to all the logging repositories at GitHub. You are welcome to participate in all of them. There are a few that could use more participation.
Ralph > On May 25, 2020, at 1:45 PM, Volkan Yazıcı <volkan.yaz...@gmail.com> wrote: > > BAM! JsonTemplateLayout is merged to master! 🎉🍾 (I needed to wait > some for the GitHub write access to get sync'ed with Apache LDAP.) > > On Mon, May 25, 2020 at 9:46 PM Volkan Yazıcı <volkan.yaz...@gmail.com> wrote: >> >> I had missed the GitBox Account Linking Matt has mentioned. I have >> just completed it and get acknowledged that I "will" have right access >> to the logging-* repositories. I don't know if it is a timing issue, >> but I still cannot see any "merge" buttons available. I will keep on >> refreshing the page. If there is anything else I need to do, please do >> let me know. >> >> On Mon, May 25, 2020 at 6:40 PM Ralph Goers <ralph.go...@dslextreme.com> >> wrote: >>> >>> I see the squash and merge button at the bottom. I just approved the PR so >>> maybe you can see it now? If not, then the steps Matt has provided may be >>> needed. We will need to update the new committer email to reflect this if >>> that is required. >>> >>> If you are still having problems and need me to do it I can merge it, but >>> it would be great to verify that you can do it. >>> >>> Ralph >>> >>>> On May 25, 2020, at 8:49 AM, Matt Sicker <boa...@gmail.com> wrote: >>>> >>>> Make sure your account is linked properly: >>>> https://gitbox.apache.org/setup/ >>>> >>>> On Mon, May 25, 2020 at 07:23 Volkan Yazıcı <volkan.yaz...@gmail.com> >>>> wrote: >>>> >>>>> Ralph, I can indeed see I am a member of the Apache organization. >>>>> Though I don't see a "merge" option appearing in the PR page. Could it >>>>> be because of the "change request" of yours? If so, would you mind >>>>> resolving that request, please? (Sorry, I don't see any other visual >>>>> cue to proceed further. Maybe it is just me...) >>>>> >>>>> On Mon, May 25, 2020 at 12:02 AM Ralph Goers <ralph.go...@dslextreme.com> >>>>> wrote: >>>>>> >>>>>> You should already have it. >>>>>> >>>>>> Ralph >>>>>> >>>>>>> On May 24, 2020, at 2:59 PM, Volkan Yazıcı <volkan.yaz...@gmail.com> >>>>> wrote: >>>>>>> >>>>>>> Somebody mind giving me write access to the GitHub repo, please? I am >>>>>>> not able to merge the PR. >>>>>>> >>>>>>> On Fri, May 22, 2020 at 3:53 PM Apache <ralph.go...@dslextreme.com> >>>>> wrote: >>>>>>>> >>>>>>>> Feel free to merge it. I will test it there when I can. >>>>>>>> >>>>>>>> Ralph >>>>>>>> >>>>>>>> >>>>>>>>> On May 22, 2020, at 4:50 AM, Volkan Yazıcı <volkan.yaz...@gmail.com> >>>>> wrote: >>>>>>>>> >>>>>>>>> Hey Ralph, >>>>>>>>> >>>>>>>>> Here is my status update: >>>>>>>>> >>>>>>>>> -~- Benchmarks -~- >>>>>>>>> >>>>>>>>> I have removed the benchmarks results. It takes ~8h for a complete >>>>> run >>>>>>>>> and I don't want to repeat that cycle after every change. I might >>>>>>>>> revisit this idea once JTL becomes more stable in terms of its >>>>>>>>> features. >>>>>>>>> >>>>>>>>> -~- Flattening of MDC fields -~- >>>>>>>>> >>>>>>>>> I have changed the MDC directive as follows: >>>>>>>>> >>>>>>>>> mdc >>>>>>>>> mdc:flatten[=<prefix>][,stringify] >>>>>>>>> mdc:pattern=<pattern>[,flatten=<prefix>][,stringify] >>>>>>>>> mdc:key=<key>[,stringify] >>>>>>>>> >>>>>>>>> This also allowed JsonTemplateLayout to produce the *exact* output as >>>>>>>>> GelfLayout and EcsLayout, where MDC keys are flattened and values are >>>>>>>>> stringified. >>>>>>>>> >>>>>>>>> -~- Null termination, newlines, Logstash, and etc. -~- >>>>>>>>> >>>>>>>>> I have tried to reproduce the experiment you have shared, though >>>>> could >>>>>>>>> not really succeed due to some Docker command failure in >>>>> restartApp.sh. >>>>>>>>> Further, I find the associated Spring setup quite cumbersome to wrap >>>>> my >>>>>>>>> mind around it. That said, I have done something else: I have >>>>> improved >>>>>>>>> LogstashIT such that >>>>>>>>> >>>>>>>>> 1. Logstash is configured with both "tcp" and "gelf" input plugins, >>>>>>>>> >>>>>>>>> 2. LogstashIT employs JsonTemplateLayout against both inputs, repeats >>>>>>>>> the same using GelfLayout and EcsLayout, and verifies the populated >>>>>>>>> content in Elasticsearch. >>>>>>>>> >>>>>>>>> One can easily validate this on the branch as follows: >>>>>>>>> >>>>>>>>> $ ./mvnw clean package -DskipTests >>>>>>>>> $ ./mvnw \ >>>>>>>>> verify -o -P docker \ >>>>>>>>> -pl >>>>> log4j-layout-jackson-json,log4j-plugins,log4j-core,log4j-api,log4j-layout-json-template >>>>>>>>> \ >>>>>>>>> -Dtest="Dummy.java" -DtrimStackTrace=false >>>>> -DfailIfNoTests=false >>>>>>>>> >>>>>>>>> One can repeat the very same by running LogstashIT in IDE after >>>>>>>>> starting the containers: >>>>>>>>> >>>>>>>>> $ ./mvnw \ >>>>>>>>> docker:start -o -P docker \ >>>>>>>>> -pl >>>>> log4j-layout-jackson-json,log4j-plugins,log4j-core,log4j-api,log4j-layout-json-template >>>>>>>>> >>>>>>>>> I don't know what is wrong with the Spring Cloud Config setup you >>>>> have >>>>>>>>> shared, but I have no reasons to believe that JsonTemplateLayout is >>>>> the >>>>>>>>> suspect. >>>>>>>>> >>>>>>>>> Regarding your remark about everything getting escaped... This might >>>>>>>>> happen when Logstash fails to read an input. In such a case, it puts >>>>>>>>> the entire payload into the "message" field (hence, the escaping) and >>>>>>>>> stores it like that. >>>>>>>>> >>>>>>>>> From now on, I don't know how to proceed with this problem, in >>>>>>>>> particular, given I believe the problem is in somewhere else but >>>>>>>>> JsonTemplateLayout. >>>>>>>>> >>>>>>>>> -~- Merging branch to master -~- >>>>>>>>> >>>>>>>>> Unless there are objections, I want to merge the branch to master. >>>>>>>>> There on I will share json-template-layout.md with the community to >>>>>>>>> collect some feedback on the API. In particular, I have existing >>>>> users >>>>>>>>> of LogstashLayout in mind. >>>>>>>>> >>>>>>>>> Kind regards. >>>>>>>>> >>>>>>>>>> On Mon, May 18, 2020 at 1:18 AM Ralph Goers < >>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>>> On May 17, 2020, at 2:37 PM, Volkan Yazıcı < >>>>> volkan.yaz...@gmail.com> wrote: >>>>>>>>>>> >>>>>>>>>>> Thanks so much for the thorough review Ralph, really appreciated! I >>>>>>>>>>> will address issues you have raised. >>>>>>>>>>> >>>>>>>>>>> [As a side note, I have pushed changes containing performance >>>>>>>>>>> improvements and benchmark results. The module is still dependency >>>>>>>>>>> free and performance-wise pretty good.] >>>>>>>>>>> >>>>>>>>>>>> all the default templates separate the message from the exception >>>>>>>>>>> >>>>>>>>>>> Yes, this I have also realized while studying the source code of >>>>>>>>>>> GelfLayout. Some random thoughts: >>>>>>>>>>> >>>>>>>>>>> 1. How about introducing a firstNonNull-like operator: >>>>>>>>>>> ${json:op:firstNonNull:${json:message},${json:exception:message}}. >>>>>>>>>>> Parsing this would not be trivial, given the list of variables >>>>>>>>>>> can include comma in various forms. Though the rest should >>>>>>>>>>> be tractable. (Feels like JsonTemplateLayout directives will at >>>>>>>>>>> some point catch up the with ones in PatternLayout.) >>>>>>>>>> >>>>>>>>>> The problem here is that I want newlines in the message. I’m not >>>>> sure what firstNonNull means in the context of a message. The message >>>>> itself won’t have nulls. The Gelf format dictates the null is at the end >>>>> of >>>>> the JSON string. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 2. How about introducing a fallback parameter to the "message" >>>>>>>>>>> directive: ${json:message:fallback=exception:message}. >>>>>>>>>> >>>>>>>>>> Again, I don’t know what that means or how it solves my problem of >>>>> wanting newlines in the message. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 3. May I challenge the request: Do one really need it? You store >>>>>>>>>>> individual values, i.e, message and exception, in individual >>>>> fields. >>>>>>>>>>> When one is missing and the other is present, isn't it just a >>>>>>>>>>> presentation layer issue to display it properly? >>>>>>>>>> >>>>>>>>>> Picture how a log event looks in a file with a “standard” >>>>> PatternLayout. In Kibana by default you get 3 columns, the timestamp, a >>>>> field I don’t care about and the message. I want the message to appear >>>>> just >>>>> as it would in a log file without the timestamp. Yes, I can click on each >>>>> message and see its attributes, but that takes longer. And I want >>>>> exceptions to jump out at me when I am visually scrolling through >>>>> messages. >>>>> In fact, I typically don’t want the stack trace in a variable of its own. >>>>> Kibana doesn’t take the pieces of the message and put them together like >>>>> the pattern layout does. Instead it lets you create columns for individual >>>>> attributes. The problem with that is the columns waste a lot of space, >>>>> especially if they frequently are empty as a stack trace would be. >>>>>>>>>> >>>>>>>>>> So yes, I really need it. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> In the logged event all newlines seem to be stripped from the >>>>> exception. >>>>>>>>>>> >>>>>>>>>>> I really don't get this Ralph. Have you seen the tests in >>>>> LogstashIT? >>>>>>>>>>> I have just added a new one testing only newlines. Would you mind >>>>>>>>>>> fiddling around with LogstashIT to reproduce the issue, please? Or >>>>>>>>>>> sharing a recipe for me to reproduce it? >>>>>>>>>> >>>>>>>>>> The way I do it is to install Logstash, ElasticSearch and Kibana >>>>> locally on my Mac as well as Docker Desktop for Mac. I then run >>>>> SpringCloud >>>>> config server from the Log4j Spring Cloud Config project and tailor the >>>>> log4j2.xml that is in the config-repo directory of that project. Note that >>>>> all Log4j Lookup variables have to have the $ escaped or Spring Cloud >>>>> Config will try to resolve them. It also requires having the Socket >>>>> appender connect to a host of “host.docker.internal” to be able to connect >>>>> to Logstash outside of the docker container. I configure Logstash using >>>>> the >>>>> configuration documented at >>>>> http://logging.apache.org/log4j/2.x/manual/cloud.html < >>>>> http://logging.apache.org/log4j/2.x/manual/cloud.html>, at least when >>>>> using Gelf. I configure Kibana with an index of app-*. >>>>>>>>>> >>>>>>>>>> I then modifythe Spring Cloud Config Sample app as needed to work >>>>> with this setup and start it using docker/restartApp.sh. >>>>>>>>>> >>>>>>>>>> After starting I do a few things: >>>>>>>>>> 1. Enter “docker logs app-container”. This should show it is >>>>> running and the last message will be the Spring logo. >>>>>>>>>> 2. Look in Kibana and click on the logs. You should see logs from >>>>> the server. >>>>>>>>>> 3. In a browser enter http://localhost:8080/sample/exception < >>>>> http://localhost:8080/sample/exception> - unless you have changed the >>>>> port. For some reason I had something running on 8080 and had to change >>>>> the >>>>> sample app to use 8090. This will generate a stack trace on the web page >>>>> and in the log. >>>>>>>>>> 4. Look in Kibana. You should see the exception and the stack trace >>>>> properly formatted in the message column. It should also display the >>>>> thread >>>>> id, log-level and other items configured in the pattern. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> Logstash does not seem to be getting a null character >>>>>>>>>>>> (I tried with both “\0” and “\u0000”) >>>>>>>>>>> >>>>>>>>>>> This is weird. Below is how GelfLayout does it: >>>>>>>>>>> >>>>>>>>>>> if (includeNullDelimiter) { >>>>>>>>>>> builder.append('\0'); >>>>>>>>>>> } >>>>>>>>>>> >>>>>>>>>>> And here is how JsonTemplateLayout does it: >>>>>>>>>>> >>>>>>>>>>> stringBuilder.append(eventDelimiter); >>>>>>>>>>> >>>>>>>>>>> Further, there is even a test for this: >>>>>>>>>>> JsonTemplateLayout#test_null_eventDelimiter(): >>>>>>>>>>> >>>>>>>>>>> final String serializedLogEvent = layout.toSerializable(logEvent); >>>>>>>>>>> assertThat(serializedLogEvent).isEqualTo(eventTemplate + '\0'); >>>>>>>>>>> >>>>>>>>>>> Any ideas on what might I be missing? >>>>>>>>>> >>>>>>>>>> No - I just know that Logstash wasn’t detecting the null. It looked >>>>> like the whole string was being escaped as all the double quotes were also >>>>> escaped as you can see from the example. I should note that I directly >>>>> copied that from the Logstash log that was written to the terminal window >>>>> with debug logging enabled, so it is possible it was caused by that, but >>>>> this is also what I see in Kibana. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> This isn’t valid in the Gelf spec as additional attributes in Gelf >>>>>>>>>>>> must match the regex - ^[\w\.\-]*$. This means you need to >>>>>>>>>>>> parse the MDC and add each key as an additional to be able >>>>>>>>>>>> to create valid Gelf. Personally, I’d like that option anyway. >>>>>>>>>>> >>>>>>>>>>> For this purpose, I need to introduce an operator similar to >>>>>>>>>>> unquote-splicing in Lisp to merge the contents of the child with >>>>> the >>>>>>>>>>> parent. That said, I have my doubts about the practical benefit of >>>>>>>>>>> such a feature. To the best of my knowledge, almost every (sanely >>>>>>>>>>> configured?) log pipeline ends up with a structured storage system >>>>>>>>>>> containing whitelisted fields. Consider ELK stack. Would you allow >>>>>>>>>>> developers to introduce fields at their will? If so, it is a >>>>> matter of >>>>>>>>>>> time somebody will take down the entire Elasticsearch cluster by >>>>>>>>>>> flooding it with ContextData.put(userInput, "doh"). Hence, you >>>>> employ >>>>>>>>>>> the identical whitelisting strategy at the layout as well: >>>>>>>>>>> >>>>>>>>>>> { >>>>>>>>>>> "version": "1.1", >>>>>>>>>>> "host": "${hostName}", >>>>>>>>>>> ..., >>>>>>>>>>> "_mdc.loginId": "${json:mdc:loginId}", >>>>>>>>>>> "_mdc.requestId": "${json:mdc:requestId}" >>>>>>>>>>> } >>>>>>>>>>> >>>>>>>>>>> What do you think? Shall we really introduce unquote-splicing? >>>>>>>>>> >>>>>>>>>> I would have preferred a syntax like >>>>>>>>>> >>>>>>>>>> { >>>>>>>>>> “version” “1.1”, >>>>>>>>>> … >>>>>>>>>> ${json.map:mdc:prefix=“_”} >>>>>>>>>> } >>>>>>>>>> >>>>>>>>>> This would cause the whole map to be emitted. Although it would be >>>>> nice to have a version of that which also could specify the keys there >>>>> probably isn’t a point to that since you can directly specify them as you >>>>> have shown. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> As I said previously, now that I understand what is going on I am >>>>> comfortable with you merging the PR. It is going to the master branch so >>>>> it >>>>> won’t be what users see on the web site right now. By the time it makes it >>>>> there we can get this all straightened out. If nothing else we could have >>>>> the current GelfLayout and the JsonTemplateLayout both on the page and >>>>> explain the differences between them, although in the end I agree it would >>>>> be better to have the JsonTemplateLayout replace both the JsonLayout and >>>>> GelfLayout. >>>>>>>>>> >>>>>>>>>> Ralph >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Kind regards. >>>>>>>>>>> >>>>>>>>>>> On Sat, May 16, 2020 at 1:28 AM Ralph Goers < >>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>> I finally got time to spend looking at the Layout. I now >>>>> understand why it works for you and sort of understand why it doesn’t work >>>>> for me. >>>>>>>>>>>> >>>>>>>>>>>> First, all the default templates separate the message from the >>>>> exception. In the logged event all newlines seem to be stripped from the >>>>> exception. This makes viewing them in Kibana pretty awful, but the do get >>>>> logged successfully. >>>>>>>>>>>> >>>>>>>>>>>> To include newlines in a log event you either have to play games >>>>> in Logstash (or Fluentd) and try to put the event back together again >>>>> after >>>>> it has been separated into multiple lines or you have to use a different >>>>> delimiter. Gelf specifies that a null character be used. >>>>>>>>>>>> >>>>>>>>>>>> I then tried to use GelfLayout.json with >>>>>>>>>>>> >>>>>>>>>>>> <Socket name="Logstash" >>>>>>>>>>>> host="\${sys:logstash.host:-host.docker.internal}" >>>>>>>>>>>> port="12222" >>>>>>>>>>>> protocol="tcp" >>>>>>>>>>>> bufferedIo="true"> >>>>>>>>>>>> <JsonTemplateLayout eventTemplateUri="classpath:GelfLayout.json" >>>>> eventDelimiter="\0" >>>>>>>>>>>> locationInfoEnabled="true"> >>>>>>>>>>>> <EventTemplateAdditionalFields> >>>>>>>>>>>> <KeyValuePair key="hostName" value="${hostName}"/> >>>>>>>>>>>> <KeyValuePair key="_containerId" >>>>> value="\${docker:containerId:-}"/> >>>>>>>>>>>> <KeyValuePair key="_application" >>>>> value="$\${lower:\${spring:spring.application.name:-spring}}"/> >>>>>>>>>>>> </EventTemplateAdditionalFields> >>>>>>>>>>>> </JsonTemplateLayout> >>>>>>>>>>>> </Socket> >>>>>>>>>>>> but this did not work at all. Logstash does not seem to be >>>>> getting a null character (I tried with both “\0” and “\u0000”) and all the >>>>> events buffer in Logstash until I shutdown the application. Worse the >>>>> formatting looks like escaped JSON rather than raw json. >>>>>>>>>>>> >>>>>>>>>>>> Also, the GelfTemplate contains >>>>>>>>>>>> { >>>>>>>>>>>> "version": "1.1", >>>>>>>>>>>> "host": "${hostName}", >>>>>>>>>>>> "short_message": "${json:message}", >>>>>>>>>>>> "full_message": "${json:exception:stackTrace:text}", >>>>>>>>>>>> "timestamp": "${json:timestamp:epoch:secs}", >>>>>>>>>>>> "level": "${json:level:severity:code}", >>>>>>>>>>>> "_logger": "${json:logger:name}", >>>>>>>>>>>> "_thread": "${json:thread:name}", >>>>>>>>>>>> "_mdc": "${json:mdc}" >>>>>>>>>>>> } >>>>>>>>>>>> This causes the output to contain >>>>>>>>>>>> >>>>>>>>>>>> >>>>> \\\"_mdc\\\":{\\\"loginId\\\":\\\"rgoers\\\",\\\"requestId\\\":\\\"266196c1-9702-11ea-9e4a-0242ac120006\\\"} >>>>>>>>>>>> >>>>>>>>>>>> This isn’t valid in the Gelf spec as additional attributes in >>>>> Gelf must match the regex - ^[\w\.\-]*$. This means you need to parse the >>>>> MDC and add each key as an additional to be able to create valid Gelf. >>>>> Personally, I’d like that option anyway. >>>>>>>>>>>> >>>>>>>>>>>> I would suggest you attempt to work to make a template that >>>>> matches the result of the GelfLayout I had previously documented. >>>>>>>>>>>> >>>>>>>>>>>> But now that I understand what is going on I am OK with this >>>>> contribution being merged. I would like to get these issues addressed and >>>>> update the Logging in the Cloud documentation so that it can document both >>>>> ways of sending to Logstash but we can do that after the code is merged. >>>>>>>>>>>> >>>>>>>>>>>> Ralph >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>>> On Apr 21, 2020, at 2:23 PM, Ralph Goers < >>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Ok. Now that a release has been cut spending time with your >>>>> contribution is at the top of my list. >>>>>>>>>>>>> >>>>>>>>>>>>> Ralph >>>>>>>>>>>>> >>>>>>>>>>>>>> On Apr 21, 2020, at 1:24 PM, Volkan Yazıcı < >>>>> volkan.yaz...@gmail.com> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Ralph, I've just pushed a commit that adds PatternLayout >>>>> support, FYI. >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Mon, Apr 20, 2020 at 2:08 AM Ralph Goers < >>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I completely understand how messed up people’s lives are right >>>>> now. I’m lucky, all my kids are long gone out of the house. With COVID-19 >>>>> I >>>>> am able to work from home and while that saves me over 2 hours a day in >>>>> commute time and more time because there isn’t much else to do, I end up >>>>> spending a lot of the extra time on my $dayjob (and feel lucky I still >>>>> have >>>>> it). >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 1. You should care about the checkstyle errors as much as >>>>> everyone else ;-). They don’t seem to be a high priority for people to >>>>> fix. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 2. Maybe I didn’t make my need for the Pattern Layout clear. >>>>> Adding the pattern layout for the JTL is ONLY for the message attribute >>>>> (just as I did for the GelfLayout). This allows what is displayed in >>>>> Kibana >>>>> to look like what you would see in the log file while still allowing >>>>> filtering on all the attributes. For me, this is a big deal - I won’t use >>>>> the Layout without it. That doesn’t mean it has to be included in the >>>>> initial commit. I don’t believe JsonLayout supports it either but I am >>>>> hoping to be able to do that today, although I have several other things I >>>>> need to do. What you would end up with is a new attribute called >>>>> messagePattern that takes a pattern that is exactly what you would give to >>>>> PatternLayout. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 3. You can handle the performance issue however you want but >>>>> if it was me I would just revert back to using Jackson without a second >>>>> thought. I just don’t see the point of trying to roll your own. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 4. It will take me a while to see what your integration test >>>>> does and if it resolves my concerns regarding updating the logging in the >>>>> cloud page. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Apr 19, 2020, at 2:30 PM, Volkan Yazıcı < >>>>> volkan.yaz...@gmail.com> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Hello Ralph, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> [Due to #COVID-19, day cares are closed. I can hardly spare >>>>> time to >>>>>>>>>>>>>>>> work, including Log4j. Hence, apologies for my slowed down >>>>> progress & >>>>>>>>>>>>>>>> responses.] >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I could not put my finger on the performance regression, yet. >>>>> I might >>>>>>>>>>>>>>>> opt to switch back to Jackson, but I am not gonna do that >>>>> without >>>>>>>>>>>>>>>> spotting that darn pain in the back. (You might have noticed, >>>>> there is >>>>>>>>>>>>>>>> actually a class for generating a report out of the available >>>>>>>>>>>>>>>> JSON-emitting layouts. I will skip incorporating its output >>>>> into the >>>>>>>>>>>>>>>> manually until I address this performance regression.) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I've just pushed a commit, i.e., LogstashIT, which tests >>>>>>>>>>>>>>>> JsonTemplateLayout against ELK stack. Would you mind skimming >>>>> through >>>>>>>>>>>>>>>> that (small) change, please? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I am not inclined to incorporate PatternLayout (PL) into >>>>>>>>>>>>>>>> JsonTemplateLayout (JTL). JTL is supposed to (ideally) >>>>> deliver all the >>>>>>>>>>>>>>>> functionality provided by PL but in a structured format, >>>>> i.e., JSON. >>>>>>>>>>>>>>>> If there arises a need to fallback to PL, I'd rather add that >>>>> missing >>>>>>>>>>>>>>>> functionality to JTL. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> You've mentioned about the checkstyle errors. How much shall >>>>> I be >>>>>>>>>>>>>>>> concerned about them? (It even complains about missing >>>>> JavaDocs on >>>>>>>>>>>>>>>> class fields.) Are there any particular ones you want me to >>>>> address? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Besides these... I think I am done. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Kind regards. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Thu, Apr 16, 2020 at 10:49 PM Ralph Goers < >>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Volkan, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I’m just wondering if you have had a chance to get to this. >>>>> As I said, as far as I am concerned this is the only thing getting in the >>>>> way of merging the PR. If you would prefer you can just remove the update >>>>> to the “Logging in the Cloud” page and push the rest and then update that >>>>> page after you have the testing done. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On Apr 12, 2020, at 12:01 AM, Ralph Goers < >>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I think I said this before, but I see no reason you can’t >>>>> have a dependency on Jackson. We currently do for almost all of our JSON >>>>> processing. I wouldn’t spend any more time trying to improve the >>>>> performance of your custom support, especially since - as I recall - you >>>>> had to drop support of a feature because it was hard to implement. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> As for replacing JsonLayout and GelfLayout, I would >>>>> envision that those would continue to exist for backwards compatibility >>>>> but >>>>> would simply pass their configuration too JsonTemplateLayout. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> As for moving JSON out of core, we may end up doing that. I >>>>> am pretty sure the xml support will require a dependency on the java.xml >>>>> module so either that will move out of core or we will have a transitive >>>>> dependency on it. Whichever way we go with that I would expect would be >>>>> the >>>>> same with Json and Yaml. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Adding support for formatting the message with the >>>>> PatternLayout was pretty trivial. I would prefer to continue to have that >>>>> in the example so I would hope it could be added if the example changes. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> As I said, the issue is Logstash or Fluentd and how they >>>>> process messages. Adding the null terminator in the configuration would >>>>> make it work on the log4j side as long as you left the logstash >>>>> configuration alone. My devops team has tried everything they can think >>>>> of >>>>> to get exceptions to work and this was the only thing that did without >>>>> having to invent convoluted parsing rules. But yet, before we publish that >>>>> I would need to know it had been tested all the way to Kibana. It was >>>>> pretty easy for me to set it all up in docker containers. I think the >>>>> log4j-spring-cloud-sample project has reference to the docker setup I >>>>> used. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Apr 11, 2020, at 11:23 PM, Volkan Yazıcı < >>>>> volkan.yaz...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Hey Ralph, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Thanks so much for taking time to review such a lengthy >>>>> PR, much >>>>>>>>>>>>>>>>>>> appreciated. Let me try to address your concerns and share >>>>> some of >>>>>>>>>>>>>>>>>>> mine: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Does JTL (i.e., JsonTemplateLayout) support Logstash? I've >>>>> tried it >>>>>>>>>>>>>>>>>>> locally against an actually running Logstash instance and >>>>> it has >>>>>>>>>>>>>>>>>>> worked fine. Though I did not test newlines. I will do >>>>> that. In any >>>>>>>>>>>>>>>>>>> case, AFAIC, JTL should also support null-termination via >>>>>>>>>>>>>>>>>>> eventDelimiter="\u0000" configuration. Nevertheless, I >>>>> will try both >>>>>>>>>>>>>>>>>>> and report the outcome. (I wish we would support Docker in >>>>> ITs to >>>>>>>>>>>>>>>>>>> allow tests against such external services, rather than us >>>>> doing that >>>>>>>>>>>>>>>>>>> manually.) >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Does "message" directive in JTL support patterns ala >>>>> PatternLayout? >>>>>>>>>>>>>>>>>>> No, but it is on my TODO list. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Can one extend the existing JTL template resolvers, i.e., >>>>>>>>>>>>>>>>>>> EventResolverFactories? [I've extracted this remark from >>>>> your most >>>>>>>>>>>>>>>>>>> recent GitHub comment.] No, but sounds like a great idea! >>>>> This is not >>>>>>>>>>>>>>>>>>> a necessity for the first release (as you also have >>>>> stated), but I >>>>>>>>>>>>>>>>>>> will see what I can do about it. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Right now I am busy with a performance regression. After >>>>> replacing the >>>>>>>>>>>>>>>>>>> Jackson JsonGenerator with the in-house JsonWriter, I've >>>>> observed a >>>>>>>>>>>>>>>>>>> ~2x performance degradation. I've been busy with it for >>>>> almost a >>>>>>>>>>>>>>>>>>> month, but it is really difficult to spare time for it due >>>>> to >>>>>>>>>>>>>>>>>>> full-time parenting enforced by closed day cares. I do not >>>>> want to >>>>>>>>>>>>>>>>>>> have a release before fixing this issue. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I can imagine at some point 2.x will ship 3 contending >>>>> JSON layouts: >>>>>>>>>>>>>>>>>>> GelfLayout, JsonLayout, and JsonTemplateLayout. That said, >>>>> for 3.x I >>>>>>>>>>>>>>>>>>> suggest to deprecate (maybe even remove?) the former two. >>>>> Personally, >>>>>>>>>>>>>>>>>>> as a developer, what I find most confusing is a library >>>>> providing >>>>>>>>>>>>>>>>>>> multiple solutions for the same problem without much >>>>> tangible benefit >>>>>>>>>>>>>>>>>>> between each other. I would rather strain from that >>>>> dilemma in a >>>>>>>>>>>>>>>>>>> library that I contribute to. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Speaking of 3.x enhancements I have in mind, I am in favor >>>>> of removing >>>>>>>>>>>>>>>>>>> all JSON logic (i.e., escaping/quoting routines) out of >>>>> core module. >>>>>>>>>>>>>>>>>>> As a motivation, see my earlier post regarding >>>>> discrepancies between >>>>>>>>>>>>>>>>>>> multiple JSON quoting methods. Further, many (incl. you) >>>>> also have >>>>>>>>>>>>>>>>>>> stated their concerns about the size of "core". I don't >>>>> think a logger >>>>>>>>>>>>>>>>>>> should ship JSON encoders, decoders, and such. Though I >>>>> did not >>>>>>>>>>>>>>>>>>> investigate this issue in detail, that is, what are the >>>>> existing >>>>>>>>>>>>>>>>>>> dependencies, etc. Nevertheless, I wanted to raise this >>>>> point. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Kind regards. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Sat, Apr 11, 2020 at 11:22 PM Ralph Goers < >>>>> ralph.go...@dslextreme.com> wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Volkan, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I have looked at the PR and the only remaining thing I >>>>> have an issue with are the changes you made to the logging in the cloud >>>>> documentation. In my testing, only the Gelf Layout worked properly with an >>>>> ELK stack. This is because Logstash (as well as Fluentd) are parsing the >>>>> input trying to figure out where each log event begins and ends. They >>>>> typically do that using some sort of pattern but by default look for >>>>> newlines. This will cause log events that contain exceptions, which >>>>> inherently include newlines) or other events that include newlines in the >>>>> message to be broken into multiple lines in Kibana and make it impossible >>>>> to filter on them properly. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Have you tested the changes you have made to the >>>>> documentation with a full ELK stack and verified that all log events, >>>>> including events with exceptions, are displayed correctly? >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Also, you will notice that the Gelf Layout includes a >>>>> MessagePattern attribute that allows the message element to be formatted >>>>> using the PatternLayout. Does the Json Template Layout support that? I >>>>> don’t see examples of that in any of the template files if it does. If it >>>>> does not, that is another reason I would prefer leaving the page as is for >>>>> now. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Ralph >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>> >>>> -- >>>> Matt Sicker <boa...@gmail.com> >>> >>> >