.NET Parse text with pattern.
Package Manager
Install-Package DotGrok
.NET CLI
dotnet add package DotGrok
// Setting extract format "%{PatternName:ExtractName}"
var grok = DotGrok.Grok.NewBuilder("%{Method:Method} %{HttpVersion:Version} %{StatusCode:StatusCode}")
.AddPattern("Method", @"\w{3,4}")
.AddPattern("HttpVersion", @"HTTP\/\d+.\d+")
.AddPattern("StatusCode", @"\d{3}")
.Build();
var sampleData = [
"GET HTTP/1.1 200",
"GET HTTP/1.1 404"
"POST HTTP/1.1 200"
];
foreach(var line in sampleData)
{
var result = grok.Match(line);
foreach(var item in result.Items)
{
System.Console.WriteLine($"{item.Name} : {item.Value}");
}
}
var grok = DotGrok.Grok.NewBuilder("%{DateTime:Date}")
.AddPattern("DateTime", @"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}")
.AddConverter(s => DateTime.parse())
.Build();
var r = grok.Match("2018-01-01 12:32:23.345 INFO test message 1233tdsg");
var items = r.Items.ToList();
Assert.Equal(new DateTime(2018, 01, 01, 12, 32, 23, 345), items[0].Value);
// Read apache access log format like below
// 64.242.88.10 - - [07/Mar/2004:16:10:02 -0800] "GET /mailman/listinfo/hsdivision HTTP/1.1" 200
var grok = DotGrok.Grok.NewBuilder(
"%{ClientId:ClientId} - - \\[%{Text:Date}\\] \"%{Method:Method} %{Text:Url} %{HttpVersion:HttpVersion}\" %{StatusCode:StatusCode}")
.AddPattern("ClientId", @"\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}|.+")
.AddPattern("Text", @".+")
.AddPattern("Method", @"\w{3,4}")
.AddPattern("HttpVersion", @"HTTP\/\d+.\d+")
.AddPattern("StatusCode", @"\d{3}")
.Build();
foreach (var line in File.ReadLines("./sample_apache_access_log.txt").Take(10))
{
var result = grok.Match(line);
var text = string.Join(", ", result.Items.Select(item => $"{item.Name}:{item.Value}"));
System.Console.WriteLine(text);
System.Console.WriteLine();
}