public bool Stop(HostControl hostControl) { logger.Info("Stopping service..."); // stop all running jobs if (sched != null) { sched.Shutdown(true); } // finally close opened streams for the logs reader ReadWebAppsLogsJob.CleanupStreams(); return(true); }
public void TestReadLogsJob() { var connectorMock = new Mock <IMusketeerHttpCastleConnector>(); var factoryMock = new Mock <IMusketeerHttpCastleConnectorFactory>(); // setup log folders var fileName = Path.Combine(logFolder, "u_ex151006.log"); var lines = new[] { "#Software: Microsoft Internet Information Services 7.5", "#Version: 1.0", "#Date: 2015-02-06 00:00:01", "#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken", "2015-02-06 00:00:01 172.20.1.2 GET /czesci-samochodowe-do-mitsubishi-77/czesci-wiazki-elektryczne-51106 - 80 - 172.20.11.91 Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html) 200 0 0 312", }; File.WriteAllLines(fileName, lines); int recordsSent = 0; connectorMock.Setup(c => c.SendLogRecords(It.IsAny <IEnumerable <LogRecord> >())) .Callback <IEnumerable <LogRecord> >((ls) => { var logs = ls.ToList(); recordsSent = logs.Count; Assert.True(recordsSent > 0); var l = logs[0]; Assert.Equal(new DateTime(2015, 02, 06, 00, 00, 02), l.TimeUtc); Assert.Equal(LogRecord.ELogLevel.Info, l.LogLevel); Assert.Equal("IISLog", l.LoggerName); Assert.Equal(appPath, l.ApplicationPath); Object o; Assert.True(l.AdditionalFields.TryGetValue("HttpStatusCode", out o)); Assert.Equal(o, "200.0.0"); Assert.True(l.AdditionalFields.TryGetValue("ClientIP", out o)); Assert.Equal(o, "172.20.1.4"); Assert.True(l.AdditionalFields.TryGetValue("Url", out o)); Assert.Equal(o, "/czesci-samochodowe-do-mercedesbenz-74/czesci-tloki-71901"); }); factoryMock.Setup(f => f.CreateCastleConnector()).Returns(connectorMock.Object); var job = new ReadWebAppsLogsJob(sharedInfoAboutApps, factoryMock.Object); job.Execute(null); // add new line lines = new[] { "2015-02-06 00:00:02 172.20.1.2 GET /czesci-samochodowe-do-mercedesbenz-74/czesci-tloki-71901 - 80 - 172.20.1.4 Mozilla/5.0+(compatible;+Googlebot/2.1;++http://www.google.com/bot.html) 200 0 0 312" }; File.AppendAllLines(fileName, lines); job.Execute(null); Assert.True(recordsSent == 1); // try creating a new log // but first append something to the old file lines = new[] { "2015-07-06 12:01:03 194.14.1.4 POST /transcode.svc/customer/1/job/1/_startRegistered testv=2 80 - 194.14.1.2 - 500 0 0 62" }; File.AppendAllLines(fileName, lines); fileName = Path.Combine(logFolder, "u_ex151007.log"); lines = new[] { "#Software: Microsoft Internet Information Services 7.5", "#Version: 1.0", "#Date: 2015-07-06 00:00:03", "#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken", "2015-07-06 00:00:03 194.14.1.4 POST /transcode.svc/customer/1/job/1/_startRegistered testv=1 80 - 194.14.1.2 - 500 0 0 62", "2015-07-06 00:00:33 194.14.1.4 POST /transcode.svc/customer/2/job/1/_startRegistered - 80 - 194.14.1.2 - 500 0 0 15" }; recordsSent = 0; connectorMock.Setup(c => c.SendLogRecords(It.IsAny <IEnumerable <LogRecord> >())) .Callback <IEnumerable <LogRecord> >((ls) => { var logs = ls.ToList(); recordsSent = logs.Count; Assert.True(recordsSent > 2); var l = logs[0]; Assert.Equal(new DateTime(2015, 07, 06, 12, 01, 03), l.TimeUtc); Assert.Equal(LogRecord.ELogLevel.Error, l.LogLevel); Assert.Equal("IISLog", l.LoggerName); Assert.Equal(appPath, l.ApplicationPath); Object o; Assert.True(l.AdditionalFields.TryGetValue("HttpStatusCode", out o)); Assert.Equal(o, "500.0.0"); Assert.True(l.AdditionalFields.TryGetValue("ClientIP", out o)); Assert.Equal(o, "194.14.1.2"); Assert.True(l.AdditionalFields.TryGetValue("Url", out o)); Assert.Equal(o, "/transcode.svc/customer/1/job/1/_startRegistered?testv=2"); l = logs[1]; Assert.Equal(new DateTime(2015, 07, 06, 00, 00, 03), l.TimeUtc); Assert.Equal(LogRecord.ELogLevel.Error, l.LogLevel); Assert.Equal("IISLog", l.LoggerName); Assert.Equal(appPath, l.ApplicationPath); Assert.True(l.AdditionalFields.TryGetValue("HttpStatusCode", out o)); Assert.Equal(o, "500.0.0"); Assert.True(l.AdditionalFields.TryGetValue("ClientIP", out o)); Assert.Equal(o, "194.14.1.2"); Assert.True(l.AdditionalFields.TryGetValue("Url", out o)); Assert.Equal(o, "/transcode.svc/customer/1/job/1/_startRegistered?testv=1"); l = logs[2]; Assert.Equal(new DateTime(2015, 07, 06, 00, 00, 33), l.TimeUtc); Assert.Equal(LogRecord.ELogLevel.Error, l.LogLevel); Assert.Equal("IISLog", l.LoggerName); Assert.Equal(appPath, l.ApplicationPath); Assert.True(l.AdditionalFields.TryGetValue("HttpStatusCode", out o)); Assert.Equal(o, "500.0.0"); Assert.True(l.AdditionalFields.TryGetValue("ClientIP", out o)); Assert.Equal(o, "194.14.1.2"); Assert.True(l.AdditionalFields.TryGetValue("Url", out o)); Assert.Equal(o, "/transcode.svc/customer/2/job/1/_startRegistered"); }); File.WriteAllLines(fileName, lines); job.Execute(null); Assert.Equal(recordsSent, 3); // remove lines and see if the parser does not break totally using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite)) { fs.SetLength(fs.Length - 100); // we truncate last 100 bytes } recordsSent = 0; connectorMock.Setup(c => c.SendLogRecords(It.IsAny <IEnumerable <LogRecord> >())).Callback(() => { recordsSent++; }); job.Execute(null); // no exception should be thrown and the file reopened lines = new[] { "2015-07-06 12:01:03 194.14.1.4 POST /transcode.svc/customer/1/job/1/_startRegistered testv=2 80 - 194.14.1.2 - 500 0 0 62" }; File.AppendAllLines(fileName, lines); job.Execute(null); // no exception should be thrown and the file reopened job.Execute(null); // reset of the stream File.AppendAllLines(fileName, lines); job.Execute(null); // new lines should be read Assert.Equal(1, recordsSent); }
public void Dispose() { ReadWebAppsLogsJob.CleanupStreams(); Directory.Delete(logFolder, true); }