Comments (20)
I just did some initial tests and I'm including the fallback that if no timezone is present in the logformat a default timezone is used.
I'm going to look at the problem with the space later (which should have worked).
from logparser.
Thank you! My question would have been if this default timezone can be overriden. AFAICS it's
Locale.UK
- but I might be misinterpreting this
from logparser.
I found the root cause of the 'spaces' problem to be in the expression of the %u
just before the timestamp.
from logparser.
I fixed both issues just now.
This first fix fixes it to UTC.
Can you please check if this works for you?
Next on my list is to make the default timezone/locale settable.
from logparser.
I can check this, since the current master does not build for me.
Tests in error:
testBasicParsing(nl.basjes.parse.httpdlog.JsonLogFormatTest): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testSpecialTimeFormatBegin(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testAllStrfFieldsHighValues(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
missingTimeZone(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testMultipleSpecialTime(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testSpecialTimeLeadingSpaces2a(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testSpecialTimeFormatMultiFields1(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testSpecialTimeFormatMultiFields2(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testAllStrfFieldsLowValues(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testSpecialTimeFormat(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testStrftimeStampDissectorPossibles(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testSpecialTimeLeadingSpaces1(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testSpecialTimeFormatEnd(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
ensureUnsupportedFields(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testHandlingOfNotYetImplementedSpecialTimeFormat(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testReportedSpecialTime(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
testAllFieldsAvailability(nl.basjes.parse.httpdlog.ApacheHttpdAllFieldsTest): nl/basjes/parse/strftime/StrfTimeParser$PmContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PMContext)
I can skip tests for now to build it, but mvn package
without tests feels wrong
from logparser.
When skipping tests, building 4.1-SNAPSHOT
and including it - the following NoClassDefFoundError
is thrown for the above example
java.lang.NoClassDefFoundError: nl/basjes/parse/strftime/StrfTimeParser$PaContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PAContext)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at nl.basjes.parse.httpdlog.dissectors.StrfTimeToDateTimeFormatter.convert(StrfTimeToDateTimeFormatter.java:62)
at nl.basjes.parse.httpdlog.dissectors.StrfTimeToDateTimeFormatter.convert(StrfTimeToDateTimeFormatter.java:53)
at nl.basjes.parse.httpdlog.dissectors.StrfTimeStampDissector.setDateTimePattern(StrfTimeStampDissector.java:57)
at nl.basjes.parse.httpdlog.dissectors.StrfTimeStampDissector.initializeFromSettingsParameter(StrfTimeStampDissector.java:62)
at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenParser.addCustomDissector(TokenParser.java:233)
at nl.basjes.parse.httpdlog.dissectors.tokenformat.ParameterizedTokenParser.getNextToken(ParameterizedTokenParser.java:103)
at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenParser.getTokens(TokenParser.java:214)
at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenFormatDissector.parseTokenLogFileDefinition(TokenFormatDissector.java:303)
at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenFormatDissector.setLogFormat(TokenFormatDissector.java:129)
at nl.basjes.parse.httpdlog.ApacheHttpdLogFormatDissector.setLogFormat(ApacheHttpdLogFormatDissector.java:88)
at nl.basjes.parse.httpdlog.dissectors.tokenformat.TokenFormatDissector.<init>(TokenFormatDissector.java:104)
at nl.basjes.parse.httpdlog.ApacheHttpdLogFormatDissector.<init>(ApacheHttpdLogFormatDissector.java:48)
at nl.basjes.parse.httpdlog.HttpdLogFormatDissector.addLogFormat(HttpdLogFormatDissector.java:125)
at nl.basjes.parse.httpdlog.HttpdLogFormatDissector.addLogFormat(HttpdLogFormatDissector.java:101)
at nl.basjes.parse.httpdlog.HttpdLogFormatDissector.addMultipleLogFormats(HttpdLogFormatDissector.java:96)
at nl.basjes.parse.httpdlog.HttpdLogFormatDissector.<init>(HttpdLogFormatDissector.java:56)
at nl.basjes.parse.httpdlog.HttpdLoglineParser.setupDissectors(HttpdLoglineParser.java:108)
at nl.basjes.parse.httpdlog.HttpdLoglineParser.<init>(HttpdLoglineParser.java:49)
at nl.basjes.parse.httpdlog.ApacheHttpdLoglineParser.<init>(ApacheHttpdLoglineParser.java:27)
at ch.localsearch.dataintel.logfiles.formats.ch.common.TestTelParser.testParser(TestTelParser.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
from logparser.
The CI build works ( https://travis-ci.org/nielsbasjes/logparser ) so I suspect a problem with old stuff on your machine.
Please do a clean build mvn clean package
.
from logparser.
Did that (mvn clean package
) - when running the tests, the error is the same - example:
testAllStrfFieldsLowValues(nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector) Time elapsed: 0.014 sec <<< ERROR!
java.lang.NoClassDefFoundError: nl/basjes/parse/strftime/StrfTimeParser$PaContext (wrong name: nl/basjes/parse/strftime/StrfTimeParser$PAContext)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at nl.basjes.parse.httpdlog.dissectors.StrfTimeToDateTimeFormatter.convert(StrfTimeToDateTimeFormatter.java:62)
at nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector.checkStrfField(TestTimeStampDissector.java:478)
at nl.basjes.parse.httpdlog.dissectors.TestTimeStampDissector.testAllStrfFieldsLowValues(TestTimeStampDissector.java:395)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
from logparser.
Hmm, in what directory do you do that? It must be the top level directory of the project.
from logparser.
I deleted the directory and checked it out again, the error persists :/ could you upload the compiled JAR somwhere maybe?
[tobi@tobmbp ~/github] git clone [email protected]:nielsbasjes/logparser.git
Cloning into 'logparser'...
remote: Counting objects: 11911, done.
remote: Compressing objects: 100% (309/309), done.
remote: Total 11911 (delta 170), reused 440 (delta 90), pack-reused 11310
Receiving objects: 100% (11911/11911), 1.85 MiB | 2.10 MiB/s, done.
Resolving deltas: 100% (4616/4616), done.
[tobi@tobmbp ~/github] cd logparser
[tobi@tobmbp ~/github/logparser:master] mvn package
from logparser.
Hmm, perhaps you have old things in ~/.m2/repository/... ?
from logparser.
- Clear mvn dependencies:
mvn dependency:purge-local-repository -DactTransitively=false -DreResolve=false --fail-at-end
mvn clean package
-> same errors
java -version
java version "1.8.0_152"
Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)
from logparser.
Are you building it locally with Docker and Java 7 maybe?
logparser/docker/centos7/Dockerfile
Line 24 in a4db1b5
from logparser.
Oops .. that Docker image is out of date and should be updated.
Nope, I build it just plain on my machine.
I just build and deployed a 4.1-SNAPSHOT version to https://oss.sonatype.org/content/repositories/snapshots/
so you can download it.
from logparser.
Fixed the docker image. That should allow you to build the software.
from logparser.
I just realized that the error you have is an uppercase/lowercase error. Are you perhaps trying to build on Windows (which breaks anything case sensitive)?
from logparser.
I'm running on MacOS 10.13.2, the underlying filesystem is APFS. The uppercase/lowercase was something I investigated, but I thought it might be present in the source and maybe not triggered on the build server.
I can confirm that the 4.1-SNAPSHOT
fixes this whitespace bug, after downloading it! However, it does not fix the usec_frac
problem (#43):
Given the following logline:
192.168.85.3 - - 2017-12-25 00:00:00.000000 "GET /up.html HTTP/1.0" 203 8 "-" "HTTP-Monitor/1.1" "-" t=4920
and the following configuration:
%a %l %u %{%F %H:%M:%S.%usec_frac}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\" t=%D
The following exception is thrown:
nl.basjes.parse.core.exceptions.DissectionFailure: Text '2017-12-25 00:00:00.000000' could not be parsed at index 21
ParseCaseSensitive(false)Value(Year,4)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)' 'Value(ClockHourOfDay,2)':'Value(MinuteOfHour,2)':'Value(SecondOfMinute,2)'.'Value(DayOfWeek[WeekFields[MONDAY,4]],1)'s''e''c''_''f''r''a''c'
at nl.basjes.parse.httpdlog.dissectors.TimeStampDissector.dissect(TimeStampDissector.java:391)
at nl.basjes.parse.httpdlog.dissectors.StrfTimeStampDissector.dissect(StrfTimeStampDissector.java:69)
at nl.basjes.parse.core.Parser.parse(Parser.java:687)
at nl.basjes.parse.core.Parser.parse(Parser.java:649)
at ch.localsearch.dataintel.logfiles.formats.ch.common.TestTelParser.testParser(TestTelParser.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.time.format.DateTimeParseException: Text '2017-12-25 00:00:00.000000' could not be parsed at index 21
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
at nl.basjes.parse.httpdlog.dissectors.TimeStampDissector.dissect(TimeStampDissector.java:386)
... 26 more
from logparser.
I think I fixed this and I just uploaded a new snapshot version to https://oss.sonatype.org/content/repositories/snapshots/
Please verify
from logparser.
@nielsbasjes works! :) thank you!
from logparser.
Great!
Note that you did %{%usec_frac}t
instead of what I documented %{usec_frac}t
(without the %).
In this fix I also added support for both forms of this (so both will work).
from logparser.
Related Issues (20)
- Some format can not parse, ngnix HOT 4
- Exceptions when the status code is 400 and the request url is invalid HOT 4
- Throws exceptions when missing field keys HOT 3
- Option to call setter only when value is non-null HOT 3
- Error occurred during setter call: No setter called for key HOT 2
- Fix code coverage reporting HOT 1
- Timestamp format Error should be a Warning HOT 4
- Kubernetes NGINX Ingress Controller default logformat HOT 2
- cannot parse Nginx token : $upstream_response_time HOT 12
- add name change interface HOT 1
- Mapping to Java Data Types? HOT 4
- [QUESTION]: Extra Fields in Results HOT 2
- Update commons-httpclient version HOT 2
- NiFi Processor HOT 1
- The input line does not match the specified log format.Line HOT 18
- HTML encoded special chars in URI HOT 1
- Updating Maxmind GeoIP breaks tests HOT 2
- Support for custom dynamic fields HOT 4
- Action Required: Fix Renovate Configuration
- Dependency Dashboard
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from logparser.