How to grok catalina log file - date

I'm trying to find a pattern for this line of log (extracted from catalina.log) of an apache tomcat 8 installation.
30-Apr-2019 15:40:40.044 INFOS [main] org.apache.catalina.startup.VersionLoggerListener.log message
No one of the date pattern include in logstash matches with this date format.
Do you have idea how can I parse this date 30-Apr-2019 15:40:40.044 to a timestamp in my logstash filter ?
Thanks

As stated by #baudsp, you may add the date pattern for catalina using a custom pattern file, or use it embedded in the grok, as shown here
(?<date>%{MONTHDAY}-%{MONTH}-%{YEAR} %{HOUR}:?%{MINUTE}(?::?%{SECOND}))
If you use the pattern often, put it in a file would probably be better, and provide more readability

Finally, there is a solution :
I put a new pattern in a file custom.txt
MY_DATE_PATTERN %{MONTHDAY}-%{MONTH}-%{YEAR} %{HOUR}:?%{MINUTE}(?::?%{SECOND})
Then in my logstash.conf I put this filter :
grok {
patterns_dir => ["./patterns"]
match => {
"message" => "%{MY_DATE_PATTERN:timestamp}%{SPACE}%{GREEDYDATA:loglevel}%{SPACE}\[%{GREEDYDATA:thread}\]%{SPACE}%{JAVACLASS:classname}%{SPACE}%{GREEDYDATA:logmessage}"
}
}
date {
match => [ "timestamp" , "dd-MMM-yyyy HH:mm:ss.SSS" ]
}
Thanks for your help

Related

Elasticsearch failed to parse [timestamp]

I know there are 30 of the same questions out there, but im not able to fix my issue with one of the answers. I got my index working for 7 days then I decided to remove the data with:
DELETE csv
Because I did upload the same date over and over to test. After this I tryed to upload the data again so I only got one copy of it. I did not change anything in my .csv files that im uploading.
But I got the error message:
[2017-11-29T14:23:44,345][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"csv", :_type=>"csv", :_routing=>nil}, 2017-10-01T04:13:19.000Z DESKTOP-*** **.0.0.201,Fred Orr ,Fred_Orr#**.s**m,2017-10-01;06:13:19,** Story: This Tiny Pill Changes Everythi], :response=>{"index"=>{"_index"=>"csv", "_type"=>"csv", "_id"=>"*****", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse [timestamp]", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"Invalid format: \"2017-10-01;06:13:19\" is malformed at \";06:13:19\""}}}}}
In logstash I got the following configuration:
date {
match => ["timestamp", "YYYY-MM-dd;HH:mm:ss"]
target => "#timestamp"
}
My date in the csv file is: 2017-10-01;06:13:19
And I try to match it against 2017-10-01;06:13:19? But it fails on the ;06:13:19 part. What is going wrong?
I tryed to replace the ; with - or a space but nothing did work.
so:
2017-10-01 06:13:19
2017-10-01-06:13:19
But I keep getting the error with the last part of the time.
Mapping:
"properties": {
"#timestamp": {
"type": "date"
},
I dont understand what is wrong? It worked before I deleted the inde
For non-formatting syntax, you’ll need to put single-quote characters around the value. Try this instead:
date {
match => ["timestamp", "YYYY-MM-dd';'HH:mm:ss"]
target => "#timestamp"
}

Elastic(search): Query result date format differs from stored format

got a problem with the elastic date format conversion when I parse the results from a query. So i have a default mapping on a date field as following:
"timestamp" : {
"type" : "date",
"format" : "dateOptionalTime"
}
and it is stored as "timestamp":"2015-05-06T08:52:56.387Z"
if I execute a max aggregation on that field I get a long value:
"timestamp_max": {
"value": 1430902071110
}
however I want the value be the same as it is stored. I read that one can specify the format in the aggregation but its not working. I tried:
"aggregations":{
"timestamp_max":{
"max":{
"field":"timestamp",
"format" : "dateOptionalTime"
}
}
}
but this gives a SearchParseException ... SearchParseException[[logstash-2015.05.07][0]: query[ConstantScore(BooleanFilter(+no_cache(timestamp:[1429357190515 TO 1431949190515])))],from[-1],size[-1]: Parse Failure [Unexpected token VALUE_STRING in [timestamp_max].]]; ...
What am I doing wrong?
Best regards,
Jan
You're almost there. You just need to specify the date format using the correct formatting pattern like this:
"aggregations":{
"timestamp_max":{
"max":{
"field":"timestamp",
"format" : "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
}
}
}
Please note that this is only working from ES 1.5.0 onwards. See the related issue on the ES github.

logstash mongodb output and ISODate type

I have some troubles trying to convert a date type field into mongoDB format (ISODate).
I have a RabbitMQ queue with JSON messages inside. These messages have a Date property like this :
Date : "2014-05-01T14:53:34.25677Z"
My logstash service read the RabbitMQ queue and inject messages into mongoDB.
Here is my logstash config file :
input {
rabbitmq {
...
codec => json
}
}
output {
mongodb {
codec => json
collection => "log"
isodate => true
database => "Test"
uri => "mongodb://localhost:27017"
}
}
My problem is that my Date property is insterted as string instead as Date. How can I do to tell Logstash to insert my Date field as an ISODate field into mongoDB?
Thank you
You should use a logstash Date filter to convert the string into a Date prior to inserting it into MongoDB: http://logstash.net/docs/1.4.2/filters/date
Don't know your full schema but it should looking something like this:
filter {
date {
match => [ "Date", "ISO8601" ]
}
}
Note the use of "ISO8601" - that appears to match the format you are receiving but you may need to play around a bit with it. As you test this I'd strongly suggest using the stdout output option for test runs to easily see what's getting done prior to insertion into MongoDB:
output {
stdout { codec => rubydebug }
}

match logstash correct date format

I have some logs files with the following timestamp format :
2014-04-22 16:08:22,455
I would like to know which is the correct config filter to parse it.
I have the following pattern:
DATE (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})
This is my grok filter:
grok {
patterns_dir => "./patterns"
match => ["message", "%{DATE:date}"]
}
But then I don't know what to put in the filter date, I know that it's not
date {
match => ["date","YYYY-MM-dd HH:mm:ss"]
}
Thanks in advance for your help.
If your grok works correctly (e.g. you get the "date" field with the contents of your log date correctly groked (parsed) in the output, then this should work:
date {
match => [ "date" , "yyyy-MM-dd HH:mm:ss,SSS" ]
}

Date limiting query for MongoDB

I'm looking to do an extract from a MongoDB from a particular date.
Since I'm using a component in Talend that sends the query I'm kind of limited in the sense that I can't use multiple lines of code.
Can you do a date limitation directly in the find-method?
db.example.find({ ts: { $gt: lowdate} });
Where lowdate is substituted for something that I hope any of you can figure out.
Many thanks!
PS. The date format in the mongodb, if that matters, is "Dec 16, 2011 7:37:06 PM".
--- Update ---
From my MongoDB:
, "ty" : "auth", "ts" : "Dec 16, 2011 3:28:01 PM",
which suggests the format of the timestamp (ts) is a string. Correct?
If the date is stored as a string in that format, you will not be able to make a query. In order to fix this, I suggest you write a script in your favourite language that scans all the documents and convert this date-as-a-string into a timestamp. You can either overwrite the "ts" field, or create a new one, f.e. something called "ts_int".
For example, in PHP you would do:
<?php
$m = new Mongo();
$c = $m->mydbname->example;
foreach ( $c->find() as $item )
{
$item['ts_int'] = strtotime( $item['ts'] );
$c->update( $item );
}
?>