From 2c4e0700eb442e87d6ebf57ff161d6682e6d7375 Mon Sep 17 00:00:00 2001 From: gediminasgu Date: Sun, 30 Nov 2014 19:16:04 +0200 Subject: [PATCH 1/3] (feat): @timestamp column for IISW3C input now is parsed from date and time fields. --- .gitignore | 1 + .../Inputs/IisW3CRowReaderTests.cs | 60 ++++++++++++++++ TimberWinR.UnitTests/TestBase.cs | 23 +++++++ .../TimberWinR.UnitTests.csproj | 10 +++ TimberWinR.UnitTests/packages.config | 1 + TimberWinR/Inputs/IISW3CInputListener.cs | 40 +++-------- TimberWinR/Inputs/IISW3CRowReader.cs | 69 +++++++++++++++++++ TimberWinR/TimberWinR.csproj | 1 + 8 files changed, 173 insertions(+), 32 deletions(-) create mode 100644 TimberWinR.UnitTests/Inputs/IisW3CRowReaderTests.cs create mode 100644 TimberWinR.UnitTests/TestBase.cs create mode 100644 TimberWinR/Inputs/IISW3CRowReader.cs diff --git a/.gitignore b/.gitignore index 1bc915c..f803bda 100644 --- a/.gitignore +++ b/.gitignore @@ -154,3 +154,4 @@ $RECYCLE.BIN/ # Mac desktop service store files .DS_Store +packages diff --git a/TimberWinR.UnitTests/Inputs/IisW3CRowReaderTests.cs b/TimberWinR.UnitTests/Inputs/IisW3CRowReaderTests.cs new file mode 100644 index 0000000..fa2ff9f --- /dev/null +++ b/TimberWinR.UnitTests/Inputs/IisW3CRowReaderTests.cs @@ -0,0 +1,60 @@ +namespace TimberWinR.UnitTests.Inputs +{ + using System; + using System.Collections.Generic; + + using Interop.MSUtil; + + using Moq; + + using NUnit.Framework; + + using TimberWinR.Inputs; + using TimberWinR.Parser; + + [TestFixture] + public class IisW3CRowReaderTests : TestBase + { + private IisW3CRowReader reader; + + public override void Setup() + { + base.Setup(); + var fields = new List + { + new Field("date", "DateTime"), + new Field("time", "DateTime"), + new Field("uri") + }; + this.reader = new IisW3CRowReader(fields); + + var recordset = this.GetRecordsetMock(); + this.reader.ReadColumnMap(recordset.Object); + } + + [Test] + public void GivenValidRowAddsTimestampColumn() + { + var record = this.MockRepository.Create(); + record.Setup(x => x.getValue("date")).Returns(new DateTime(2014, 11, 30)); + record.Setup(x => x.getValue("time")).Returns(new DateTime(1, 1, 1, 18, 45, 37, 590)); + record.Setup(x => x.getValue("uri")).Returns("http://somedomain.com/someurl"); + + var json = this.reader.ReadToJson(record.Object); + + Assert.AreEqual("2014-11-30T18:45:37.000Z", json["@timestamp"].ToString()); + Assert.AreEqual("http://somedomain.com/someurl", json["uri"].ToString()); + } + + private Mock GetRecordsetMock() + { + var recordset = this.MockRepository.Create(); + recordset.Setup(x => x.getColumnCount()).Returns(3); + + recordset.Setup(x => x.getColumnName(0)).Returns("date"); + recordset.Setup(x => x.getColumnName(1)).Returns("time"); + recordset.Setup(x => x.getColumnName(2)).Returns("uri"); + return recordset; + } + } +} diff --git a/TimberWinR.UnitTests/TestBase.cs b/TimberWinR.UnitTests/TestBase.cs new file mode 100644 index 0000000..af6612c --- /dev/null +++ b/TimberWinR.UnitTests/TestBase.cs @@ -0,0 +1,23 @@ +namespace TimberWinR.UnitTests +{ + using Moq; + + using NUnit.Framework; + + public class TestBase + { + public MockRepository MockRepository { get; private set; } + + [SetUp] + public virtual void Setup() + { + this.MockRepository = new MockRepository(MockBehavior.Default); + } + + [TearDown] + public virtual void TearDown() + { + this.MockRepository.VerifyAll(); + } + } +} diff --git a/TimberWinR.UnitTests/TimberWinR.UnitTests.csproj b/TimberWinR.UnitTests/TimberWinR.UnitTests.csproj index 7cec546..499d5bf 100644 --- a/TimberWinR.UnitTests/TimberWinR.UnitTests.csproj +++ b/TimberWinR.UnitTests/TimberWinR.UnitTests.csproj @@ -33,6 +33,14 @@ false + + False + False + lib\com-logparser\Interop.MSUtil.dll + + + ..\packages\Moq.4.2.1409.1722\lib\net40\Moq.dll + False ..\packages\Newtonsoft.Json.6.0.4\lib\net40\Newtonsoft.Json.dll @@ -53,9 +61,11 @@ + + diff --git a/TimberWinR.UnitTests/packages.config b/TimberWinR.UnitTests/packages.config index aaa2524..c5a1df5 100644 --- a/TimberWinR.UnitTests/packages.config +++ b/TimberWinR.UnitTests/packages.config @@ -1,5 +1,6 @@  + \ No newline at end of file diff --git a/TimberWinR/Inputs/IISW3CInputListener.cs b/TimberWinR/Inputs/IISW3CInputListener.cs index 675854d..d35dba0 100644 --- a/TimberWinR/Inputs/IISW3CInputListener.cs +++ b/TimberWinR/Inputs/IISW3CInputListener.cs @@ -1,18 +1,11 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Linq; -using System.Security.AccessControl; -using System.Text; using System.Threading; using System.Threading.Tasks; -using System.IO; -using Interop.MSUtil; using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; using NLog; -using TimberWinR.Parser; using LogQuery = Interop.MSUtil.LogQueryClassClass; using IISW3CLogInputFormat = Interop.MSUtil.COMIISW3CInputContextClassClass; using LogRecordSet = Interop.MSUtil.ILogRecordset; @@ -23,15 +16,19 @@ namespace TimberWinR.Inputs public class IISW3CInputListener : InputListener { private readonly int _pollingIntervalInSeconds; - private readonly TimberWinR.Parser.IISW3CLog _arguments; + private readonly Parser.IISW3CLog _arguments; private long _receivedMessages; - public IISW3CInputListener(TimberWinR.Parser.IISW3CLog arguments, CancellationToken cancelToken, int pollingIntervalInSeconds = 5) + private IisW3CRowReader rowReader; + + public IISW3CInputListener(Parser.IISW3CLog arguments, CancellationToken cancelToken, int pollingIntervalInSeconds = 5) : base(cancelToken, "Win32-IISLog") { _arguments = arguments; _receivedMessages = 0; _pollingIntervalInSeconds = pollingIntervalInSeconds; + this.rowReader = new IisW3CRowReader(_arguments.Fields); + foreach (string loc in _arguments.Location.Split(',')) { string hive = loc.Trim(); @@ -62,7 +59,6 @@ namespace TimberWinR.Inputs return json; } - private void IISW3CWatcher(string location) { LogManager.GetCurrentClassLogger().Info("IISW3Listener Ready For {0}", location); @@ -108,39 +104,19 @@ namespace TimberWinR.Inputs } } - foreach (string fileName in logFileMaxRecords.Keys.ToList()) { var lastRecordNumber = logFileMaxRecords[fileName]; var query = string.Format("SELECT * FROM '{0}' Where LogRow > {1}", fileName, lastRecordNumber); var rs = oLogQuery.Execute(query, iFmt); - var colMap = new Dictionary(); - for (int col = 0; col < rs.getColumnCount(); col++) - { - string colName = rs.getColumnName(col); - colMap[colName] = col; - } + rowReader.ReadColumnMap(rs); // Browse the recordset for (; !rs.atEnd(); rs.moveNext()) { var record = rs.getRecord(); - var json = new JObject(); - foreach (var field in _arguments.Fields) - { - if (!colMap.ContainsKey(field.Name)) - continue; - - object v = record.getValue(field.Name); - if (field.DataType == typeof (DateTime)) - { - DateTime dt = DateTime.Parse(v.ToString()); - json.Add(new JProperty(field.Name, dt)); - } - else - json.Add(new JProperty(field.Name, v)); - } + var json = rowReader.ReadToJson(record); ProcessJson(json); _receivedMessages++; var lrn = (Int64)record.getValueEx("LogRow"); diff --git a/TimberWinR/Inputs/IISW3CRowReader.cs b/TimberWinR/Inputs/IISW3CRowReader.cs new file mode 100644 index 0000000..e4ce320 --- /dev/null +++ b/TimberWinR/Inputs/IISW3CRowReader.cs @@ -0,0 +1,69 @@ +namespace TimberWinR.Inputs +{ + using System; + using System.Collections.Generic; + + using Interop.MSUtil; + + using Newtonsoft.Json.Linq; + + using TimberWinR.Parser; + + public class IisW3CRowReader + { + private readonly List fields; + private IDictionary columnMap; + + public IisW3CRowReader(List fields) + { + this.fields = fields; + } + + public JObject ReadToJson(ILogRecord row) + { + var json = new JObject(); + foreach (var field in this.fields) + { + if (this.columnMap.ContainsKey(field.Name)) + { + object v = row.getValue(field.Name); + if (field.DataType == typeof(DateTime)) + { + DateTime dt = DateTime.Parse(v.ToString()); + json.Add(new JProperty(field.Name, dt)); + } + else + { + json.Add(new JProperty(field.Name, v)); + } + } + } + + AddTimestamp(json); + + return json; + } + + public void ReadColumnMap(ILogRecordset rs) + { + this.columnMap = new Dictionary(); + for (int col = 0; col < rs.getColumnCount(); col++) + { + string colName = rs.getColumnName(col); + this.columnMap[colName] = col; + } + } + + private static void AddTimestamp(JObject json) + { + if (json["date"] != null && json["time"] != null) + { + var date = DateTime.Parse(json["date"].ToString()); + var time = DateTime.Parse(json["time"].ToString()); + date = new DateTime(date.Year, date.Month, date.Day, time.Hour, time.Minute, time.Second, time.Millisecond); + + json.Add(new JProperty("@timestamp", date.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"))); + } + } + } +} diff --git a/TimberWinR/TimberWinR.csproj b/TimberWinR/TimberWinR.csproj index 435954a..b2a1207 100644 --- a/TimberWinR/TimberWinR.csproj +++ b/TimberWinR/TimberWinR.csproj @@ -86,6 +86,7 @@ + From 5c7f0e5ab9e1d2e61434aaa4cefbc898d02f0411 Mon Sep 17 00:00:00 2001 From: gediminasgu Date: Sun, 30 Nov 2014 20:25:02 +0200 Subject: [PATCH 2/3] Nuget added --- .nuget/NuGet.exe | Bin 0 -> 17408 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .nuget/NuGet.exe diff --git a/.nuget/NuGet.exe b/.nuget/NuGet.exe new file mode 100644 index 0000000000000000000000000000000000000000..9218fe93fd0cca8b015af1577ec4b1742b8a044e GIT binary patch literal 17408 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 Date: Sun, 30 Nov 2014 20:33:31 +0200 Subject: [PATCH 3/3] Fixed interop path --- TimberWinR.UnitTests/TimberWinR.UnitTests.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TimberWinR.UnitTests/TimberWinR.UnitTests.csproj b/TimberWinR.UnitTests/TimberWinR.UnitTests.csproj index 499d5bf..9528694 100644 --- a/TimberWinR.UnitTests/TimberWinR.UnitTests.csproj +++ b/TimberWinR.UnitTests/TimberWinR.UnitTests.csproj @@ -36,7 +36,7 @@ False False - lib\com-logparser\Interop.MSUtil.dll + ..\TimberWinR\lib\com-logparser\Interop.MSUtil.dll ..\packages\Moq.4.2.1409.1722\lib\net40\Moq.dll