diff --git a/samples/SampleApp/Startup.cs b/samples/SampleApp/Startup.cs index edc92abac0..955df43277 100644 --- a/samples/SampleApp/Startup.cs +++ b/samples/SampleApp/Startup.cs @@ -4,13 +4,18 @@ using System; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; +using Microsoft.Framework.Logging; namespace SampleApp { public class Startup { - public void Configure(IApplicationBuilder app) + public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { + loggerFactory.MinimumLevel = LogLevel.Debug; + + loggerFactory.AddConsole(LogLevel.Debug); + app.Run(context => { Console.WriteLine("{0} {1}{2}{3}", diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 899732b65b..2e0dd6f9c3 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,7 +1,8 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Server.Kestrel": "1.0.0-*" + "Microsoft.AspNet.Server.Kestrel": "1.0.0-*", + "Microsoft.Framework.Logging.Console": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs index 5fa34d141d..823ba518c0 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics; using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.AspNet.Server.Kestrel.Networking; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel.Http { @@ -28,10 +28,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Http public void Start() { - KestrelTrace.Log.ConnectionStart(_connectionId); + Log.ConnectionStart(_connectionId); SocketInput = new SocketInput(Memory); - SocketOutput = new SocketOutput(Thread, _socket); + SocketOutput = new SocketOutput(Thread, _socket, Log); _frame = new Frame(this); _socket.ReadStart(_allocCallback, _readCallback, this); } @@ -63,17 +63,17 @@ namespace Microsoft.AspNet.Server.Kestrel.Http if (normalRead) { - KestrelTrace.Log.ConnectionRead(_connectionId, status); + Log.ConnectionRead(_connectionId, status); } else if (normalDone || errorDone) { - KestrelTrace.Log.ConnectionReadFin(_connectionId); + Log.ConnectionReadFin(_connectionId); SocketInput.RemoteIntakeFin = true; _socket.ReadStop(); if (errorDone && error != null) { - Trace.WriteLine("Connection.OnRead " + error.ToString()); + Log.LogError("Connection.OnRead", error); } } @@ -84,19 +84,19 @@ namespace Microsoft.AspNet.Server.Kestrel.Http } catch (Exception ex) { - Trace.WriteLine("Connection._frame.Consume " + ex.ToString()); + Log.LogError("Connection._frame.Consume ", ex); } } void IConnectionControl.Pause() { - KestrelTrace.Log.ConnectionPause(_connectionId); + Log.ConnectionPause(_connectionId); _socket.ReadStop(); } void IConnectionControl.Resume() { - KestrelTrace.Log.ConnectionResume(_connectionId); + Log.ConnectionResume(_connectionId); _socket.ReadStart(_allocCallback, _readCallback, this); } @@ -113,17 +113,17 @@ namespace Microsoft.AspNet.Server.Kestrel.Http } _connectionState = ConnectionState.Shutdown; - KestrelTrace.Log.ConnectionWriteFin(_connectionId, 0); + Log.ConnectionWriteFin(_connectionId, 0); Thread.Post( state => { - KestrelTrace.Log.ConnectionWriteFin(_connectionId, 1); + Log.ConnectionWriteFin(_connectionId, 1); var self = (Connection)state; - var shutdown = new UvShutdownReq(); + var shutdown = new UvShutdownReq(Log); shutdown.Init(self.Thread.Loop); shutdown.Shutdown(self._socket, (req, status, _) => { - KestrelTrace.Log.ConnectionWriteFin(_connectionId, 1); + Log.ConnectionWriteFin(_connectionId, 1); req.Dispose(); }, null); }, @@ -135,7 +135,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http return; } - KestrelTrace.Log.ConnectionKeepAlive(_connectionId); + Log.ConnectionKeepAlive(_connectionId); _frame = new Frame(this); Thread.Post( state => ((Frame)state).Consume(), @@ -148,11 +148,11 @@ namespace Microsoft.AspNet.Server.Kestrel.Http } _connectionState = ConnectionState.Disconnected; - KestrelTrace.Log.ConnectionDisconnect(_connectionId); + Log.ConnectionDisconnect(_connectionId); Thread.Post( state => { - KestrelTrace.Log.ConnectionStop(_connectionId); + Log.ConnectionStop(_connectionId); ((UvHandle)state).Dispose(); }, _socket); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs index 1b418ee8d8..821e3788c3 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Frame.cs @@ -3,11 +3,11 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Framework.Logging; using Microsoft.Framework.Primitives; // ReSharper disable AccessToModifiedClosure @@ -276,7 +276,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { if (error != null) { - Trace.WriteLine("WriteChunkPrefix" + error.ToString()); + Log.LogError("WriteChunkPrefix", error); } }, null, @@ -290,7 +290,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { if (error != null) { - Trace.WriteLine("WriteChunkSuffix" + error.ToString()); + Log.LogError("WriteChunkSuffix", error); } }, null, @@ -304,7 +304,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { if (error != null) { - Trace.WriteLine("WriteChunkedResponseSuffix" + error.ToString()); + Log.LogError("WriteChunkedResponseSuffix", error); } }, null, @@ -338,7 +338,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { if (error != null) { - Trace.WriteLine("ProduceContinue " + error.ToString()); + Log.LogError("ProduceContinue ", error); } }, null); @@ -361,7 +361,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { if (error != null) { - Trace.WriteLine("ProduceStart " + error.ToString()); + Log.LogError("ProduceStart ", error); } ((IDisposable)state).Dispose(); }, diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/Listener.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/Listener.cs index 8485869296..5b87d873a3 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/Listener.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/Listener.cs @@ -3,8 +3,8 @@ using Microsoft.AspNet.Server.Kestrel.Networking; using System; -using System.Diagnostics; using System.Threading.Tasks; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel.Http { @@ -52,13 +52,14 @@ namespace Microsoft.AspNet.Server.Kestrel.Http protected static void ConnectionCallback(UvStreamHandle stream, int status, Exception error, object state) { + var listener = (Listener) state; if (error != null) { - Trace.WriteLine("Listener.ConnectionCallback " + error.ToString()); + listener.Log.LogError("Listener.ConnectionCallback ", error); } else { - ((Listener)state).OnConnection(stream, status); + listener.OnConnection(stream, status); } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerContext.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerContext.cs index 1d8cd86059..c0f042b4cc 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerContext.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerContext.cs @@ -3,6 +3,7 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Http { @@ -13,6 +14,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http public ListenerContext(ServiceContext serviceContext) { Memory = serviceContext.Memory; + Log = serviceContext.Log; } public ListenerContext(ListenerContext listenerContext) @@ -20,6 +22,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http Thread = listenerContext.Thread; Application = listenerContext.Application; Memory = listenerContext.Memory; + Log = listenerContext.Log; } public KestrelThread Thread { get; set; } @@ -27,5 +30,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http public Func Application { get; set; } public IMemoryPool Memory { get; set; } + + public IKestrelTrace Log { get; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerPrimary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerPrimary.cs index 67204fc729..0010c2d60f 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerPrimary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerPrimary.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http await Thread.PostAsync(_ => { - ListenPipe = new UvPipeHandle(); + ListenPipe = new UvPipeHandle(Log); ListenPipe.Init(Thread.Loop, false); ListenPipe.Bind(pipeName); ListenPipe.Listen(Constants.ListenBacklog, OnListenPipe, null); @@ -54,7 +54,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http return; } - var dispatchPipe = new UvPipeHandle(); + var dispatchPipe = new UvPipeHandle(Log); dispatchPipe.Init(Thread.Loop, true); try { @@ -78,7 +78,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http else { var dispatchPipe = _dispatchPipes[index]; - var write = new UvWriteReq(); + var write = new UvWriteReq(Log); write.Init(Thread.Loop); write.Write2( dispatchPipe, diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs index 864dee2f63..3a0d2e667c 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.AspNet.Server.Kestrel.Networking; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel.Http { @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http Thread = thread; Application = application; - DispatchPipe = new UvPipeHandle(); + DispatchPipe = new UvPipeHandle(Log); var tcs = new TaskCompletionSource(); Thread.Post(_ => @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http try { DispatchPipe.Init(Thread.Loop, true); - var connect = new UvConnectRequest(); + var connect = new UvConnectRequest(Log); connect.Init(Thread.Loop); connect.Connect( DispatchPipe, @@ -67,8 +67,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http { Exception ex; Thread.Loop.Libuv.Check(status2, out ex); - // TODO: Replace Trace.WriteLine with real logging - Trace.WriteLine("DispatchPipe.ReadStart " + ex.Message); + Log.LogError("DispatchPipe.ReadStart", ex); } DispatchPipe.Dispose(); @@ -89,7 +88,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http } catch (Exception ex) { - Trace.WriteLine("DispatchPipe.Accept " + ex.Message); + Log.LogError("DispatchPipe.Accept", ex); acceptSocket.Dispose(); return; } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListener.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListener.cs index 2fd4dd3c32..62e12fc9a7 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListener.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListener.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// protected override UvStreamHandle CreateListenSocket(string host, int port) { - var socket = new UvPipeHandle(); + var socket = new UvPipeHandle(Log); socket.Init(Thread.Loop, false); socket.Bind(host); socket.Listen(Constants.ListenBacklog, ConnectionCallback, this); @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// Connection status protected override void OnConnection(UvStreamHandle listenSocket, int status) { - var acceptSocket = new UvPipeHandle(); + var acceptSocket = new UvPipeHandle(Log); acceptSocket.Init(Thread.Loop, false); listenSocket.Accept(acceptSocket); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListenerPrimary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListenerPrimary.cs index afb4c7c213..96691a2b8d 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListenerPrimary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListenerPrimary.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// protected override UvStreamHandle CreateListenSocket(string host, int port) { - var socket = new UvPipeHandle(); + var socket = new UvPipeHandle(Log); socket.Init(Thread.Loop, false); socket.Bind(host); socket.Listen(Constants.ListenBacklog, ConnectionCallback, this); @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// Connection status protected override void OnConnection(UvStreamHandle listenSocket, int status) { - var acceptSocket = new UvPipeHandle(); + var acceptSocket = new UvPipeHandle(Log); acceptSocket.Init(Thread.Loop, false); listenSocket.Accept(acceptSocket); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListenerSecondary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListenerSecondary.cs index 40b34038d9..a9c3f70529 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListenerSecondary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/PipeListenerSecondary.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// protected override UvStreamHandle CreateAcceptSocket() { - var acceptSocket = new UvPipeHandle(); + var acceptSocket = new UvPipeHandle(Log); acceptSocket.Init(Thread.Loop, false); return acceptSocket; } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs index dc0cb12061..af490063fd 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/SocketOutput.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.AspNet.Server.Kestrel.Networking; namespace Microsoft.AspNet.Server.Kestrel.Http @@ -16,6 +17,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http private readonly KestrelThread _thread; private readonly UvStreamHandle _socket; + private readonly IKestrelTrace _log; // This locks access to to all of the below fields private readonly object _lockObj = new object(); @@ -29,10 +31,11 @@ namespace Microsoft.AspNet.Server.Kestrel.Http private WriteContext _nextWriteContext; private readonly Queue _callbacksPending; - public SocketOutput(KestrelThread thread, UvStreamHandle socket) + public SocketOutput(KestrelThread thread, UvStreamHandle socket, IKestrelTrace log) { _thread = thread; _socket = socket; + _log = log; _callbacksPending = new Queue(); } @@ -43,7 +46,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http Array.Copy(buffer.Array, buffer.Offset, copy, 0, buffer.Count); buffer = new ArraySegment(copy); - KestrelTrace.Log.ConnectionWrite(0, buffer.Count); + _log.ConnectionWrite(0, buffer.Count); bool triggerCallbackNow = false; @@ -127,7 +130,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http buffers[i++] = buffer; } - var writeReq = new UvWriteReq(); + var writeReq = new UvWriteReq(_log); writeReq.Init(_thread.Loop); writeReq.Write(_socket, new ArraySegment>(buffers), (r, status, error, state) => @@ -152,7 +155,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http // This is called on the libuv event loop private void OnWriteCompleted(Queue> writtenBuffers, UvWriteReq req, int status, Exception error) { - KestrelTrace.Log.ConnectionWriteCallback(0, status); + _log.ConnectionWriteCallback(0, status); lock (_lockObj) { diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListener.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListener.cs index 7c67208e3f..4fa374c0fb 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListener.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListener.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// protected override UvStreamHandle CreateListenSocket(string host, int port) { - var socket = new UvTcpHandle(); + var socket = new UvTcpHandle(Log); socket.Init(Thread.Loop, Thread.QueueCloseHandle); socket.Bind(new IPEndPoint(IPAddress.Any, port)); socket.Listen(Constants.ListenBacklog, ConnectionCallback, this); @@ -35,7 +35,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// Connection status protected override void OnConnection(UvStreamHandle listenSocket, int status) { - var acceptSocket = new UvTcpHandle(); + var acceptSocket = new UvTcpHandle(Log); acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle); listenSocket.Accept(acceptSocket); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListenerPrimary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListenerPrimary.cs index 098238bde1..2a80f3caee 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListenerPrimary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListenerPrimary.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// protected override UvStreamHandle CreateListenSocket(string host, int port) { - var socket = new UvTcpHandle(); + var socket = new UvTcpHandle(Log); socket.Init(Thread.Loop, Thread.QueueCloseHandle); socket.Bind(new IPEndPoint(IPAddress.Any, port)); socket.Listen(Constants.ListenBacklog, ConnectionCallback, this); @@ -35,7 +35,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// Connection status protected override void OnConnection(UvStreamHandle listenSocket, int status) { - var acceptSocket = new UvTcpHandle(); + var acceptSocket = new UvTcpHandle(Log); acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle); listenSocket.Accept(acceptSocket); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListenerSecondary.cs b/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListenerSecondary.cs index 4cff07cedf..d6680d3318 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListenerSecondary.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Http/TcpListenerSecondary.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http /// protected override UvStreamHandle CreateAcceptSocket() { - var acceptSocket = new UvTcpHandle(); + var acceptSocket = new UvTcpHandle(Log); acceptSocket.Init(Thread.Loop, Thread.QueueCloseHandle); return acceptSocket; } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/IKestrelTrace.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/IKestrelTrace.cs new file mode 100644 index 0000000000..478b573fe8 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/IKestrelTrace.cs @@ -0,0 +1,29 @@ +using Microsoft.Framework.Logging; + +namespace Microsoft.AspNet.Server.Kestrel.Infrastructure +{ + public interface IKestrelTrace : ILogger + { + void ConnectionStart(long connectionId); + + void ConnectionStop(long connectionId); + + void ConnectionRead(long connectionId, int status); + + void ConnectionPause(long connectionId); + + void ConnectionResume(long connectionId); + + void ConnectionReadFin(long connectionId); + + void ConnectionWriteFin(long connectionId, int step); + + void ConnectionKeepAlive(long connectionId); + + void ConnectionDisconnect(long connectionId); + + void ConnectionWrite(long connectionId, int count); + + void ConnectionWriteCallback(long connectionId, int status); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs index f611d8857a..1af6b04549 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelThread.cs @@ -4,11 +4,12 @@ using Microsoft.AspNet.Server.Kestrel.Networking; using System; using System.Collections.Generic; -using System.Diagnostics; using System.Runtime.ExceptionServices; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.Dnx.Runtime; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel { @@ -30,13 +31,15 @@ namespace Microsoft.AspNet.Server.Kestrel private object _workSync = new Object(); private bool _stopImmediate = false; private ExceptionDispatchInfo _closeError; + private IKestrelTrace _log; public KestrelThread(KestrelEngine engine, ServiceContext serviceContext) { _engine = engine; _appShutdown = serviceContext.AppShutdown; - _loop = new UvLoopHandle(); - _post = new UvAsyncHandle(); + _log = serviceContext.Log; + _loop = new UvLoopHandle(_log); + _post = new UvAsyncHandle(_log); _thread = new Thread(ThreadStart); QueueCloseHandle = PostCloseHandle; } @@ -272,7 +275,7 @@ namespace Microsoft.AspNet.Server.Kestrel } else { - Trace.WriteLine("KestrelThread.DoPostWork " + ex.ToString()); + _log.LogError("KestrelThread.DoPostWork", ex); } } } @@ -295,7 +298,7 @@ namespace Microsoft.AspNet.Server.Kestrel } catch (Exception ex) { - Trace.WriteLine("KestrelThread.DoPostCloseHandle " + ex.ToString()); + _log.LogError("KestrelThread.DoPostCloseHandle", ex); } } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelTrace.cs b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelTrace.cs index 53a1cb73e3..c9ce6bb820 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelTrace.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Infrastructure/KestrelTrace.cs @@ -1,85 +1,92 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -//using System.Diagnostics.Tracing; +using System; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel { /// /// Summary description for KestrelTrace /// - public class KestrelTrace //: EventSource + public class KestrelTrace : IKestrelTrace { - public static KestrelTrace Log = new KestrelTrace(); - // static EventTask Connection = (EventTask)1; - // static EventTask Frame = (EventTask)1; + private readonly ILogger _logger; + public KestrelTrace(ILogger logger) + { + _logger = logger; + } - // [Event(13, Level = EventLevel.Informational, Message = "Id {0}")] public void ConnectionStart(long connectionId) { - // WriteEvent(13, connectionId); + _logger.LogDebug(13, $"{nameof(ConnectionStart)} -> Id: {connectionId}"); } - // [Event(14, Level = EventLevel.Informational, Message = "Id {0}")] public void ConnectionStop(long connectionId) { - // WriteEvent(14, connectionId); + _logger.LogDebug(14, $"{nameof(ConnectionStop)} -> Id: {connectionId}"); } - - // [Event(4, Message = "Id {0} Status {1}")] - internal void ConnectionRead(long connectionId, int status) + public void ConnectionRead(long connectionId, int status) { - // WriteEvent(4, connectionId, status); + _logger.LogDebug(4, $"{nameof(ConnectionRead)} -> Id: {connectionId}, Status: {status}"); } - // [Event(5, Message = "Id {0}")] - internal void ConnectionPause(long connectionId) + public void ConnectionPause(long connectionId) { - // WriteEvent(5, connectionId); + _logger.LogDebug(5, $"{nameof(ConnectionPause)} -> Id: {connectionId}"); } - // [Event(6, Message = "Id {0}")] - internal void ConnectionResume(long connectionId) + public void ConnectionResume(long connectionId) { - // WriteEvent(6, connectionId); + _logger.LogDebug(6, $"{nameof(ConnectionResume)} -> Id: {connectionId}"); } - // [Event(7, Message = "Id {0}")] - internal void ConnectionReadFin(long connectionId) + public void ConnectionReadFin(long connectionId) { - // WriteEvent(7, connectionId); + _logger.LogDebug(7, $"{nameof(ConnectionReadFin)} -> Id: {connectionId}"); } -// [Event(8, Message = "Id {0} Step {1}")] - internal void ConnectionWriteFin(long connectionId, int step) + public void ConnectionWriteFin(long connectionId, int step) { - // WriteEvent(8, connectionId, step); + _logger.LogDebug(8, $"{nameof(ConnectionWriteFin)} -> Id: {connectionId}, Step: {step}"); } - // [Event(9, Message = "Id {0}")] - internal void ConnectionKeepAlive(long connectionId) + public void ConnectionKeepAlive(long connectionId) { - // WriteEvent(9, connectionId); + _logger.LogDebug(9, $"{nameof(ConnectionKeepAlive)} -> Id: {connectionId}"); } - // [Event(10, Message = "Id {0}")] - internal void ConnectionDisconnect(long connectionId) + public void ConnectionDisconnect(long connectionId) { - // WriteEvent(10, connectionId); + _logger.LogDebug(10, $"{nameof(ConnectionDisconnect)} -> Id: {connectionId}"); } - // [Event(11, Message = "Id {0} Count {1}")] - internal void ConnectionWrite(long connectionId, int count) + public void ConnectionWrite(long connectionId, int count) { - // WriteEvent(11, connectionId, count); + _logger.LogDebug(11, $"{nameof(ConnectionWrite)} -> Id: {connectionId}, Count: {count}"); } - // [Event(12, Message = "Id {0} Status {1}")] - internal void ConnectionWriteCallback(long connectionId, int status) + public void ConnectionWriteCallback(long connectionId, int status) { - // WriteEvent(12, connectionId, status); + _logger.LogDebug(12, $"{nameof(ConnectionWriteCallback)} -> Id: {connectionId}, Status: {status}"); + } + + public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func formatter) + { + _logger.Log(logLevel, eventId, state, exception, formatter); + } + + public bool IsEnabled(LogLevel logLevel) + { + return _logger.IsEnabled(logLevel); + } + + public IDisposable BeginScopeImpl(object state) + { + return _logger.BeginScopeImpl(state); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs b/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs index 57fc44876a..893bdf94b2 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/KestrelEngine.cs @@ -9,6 +9,7 @@ using Microsoft.AspNet.Server.Kestrel.Http; using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.AspNet.Server.Kestrel.Networking; using Microsoft.Dnx.Runtime; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel { @@ -16,8 +17,8 @@ namespace Microsoft.AspNet.Server.Kestrel { private readonly ServiceContext _serviceContext; - public KestrelEngine(ILibraryManager libraryManager, IApplicationShutdown appShutdownService) - : this(appShutdownService) + public KestrelEngine(ILibraryManager libraryManager, IApplicationShutdown appShutdownService, ILogger logger) + : this(appShutdownService, logger) { Libuv = new Libuv(); @@ -62,18 +63,19 @@ namespace Microsoft.AspNet.Server.Kestrel } // For testing - internal KestrelEngine(Libuv uv, IApplicationShutdown appShutdownService) - : this(appShutdownService) + internal KestrelEngine(Libuv uv, IApplicationShutdown appShutdownService, ILogger logger) + : this(appShutdownService, logger) { Libuv = uv; } - private KestrelEngine(IApplicationShutdown appShutdownService) + private KestrelEngine(IApplicationShutdown appShutdownService, ILogger logger) { _serviceContext = new ServiceContext { AppShutdown = appShutdownService, - Memory = new MemoryPool() + Memory = new MemoryPool(), + Log = new KestrelTrace(logger) }; Threads = new List(); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvAsyncHandle.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvAsyncHandle.cs index 138853da85..04c2ecce3b 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvAsyncHandle.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvAsyncHandle.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Networking { @@ -10,6 +11,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking private static Libuv.uv_async_cb _uv_async_cb = AsyncCb; private Action _callback; + public UvAsyncHandle(IKestrelTrace logger) : base(logger) + { + } + public void Init(UvLoopHandle loop, Action callback) { CreateMemory( diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvConnectRequest.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvConnectRequest.cs index 1791fb56e7..503cc7dfe7 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvConnectRequest.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvConnectRequest.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.InteropServices; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel.Networking { @@ -18,6 +17,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking private Action _callback; private object _state; + public UvConnectRequest(IKestrelTrace logger) : base (logger) + { + } + public void Init(UvLoopHandle loop) { var requestSize = loop.Libuv.req_size(Libuv.RequestType.CONNECT); @@ -63,7 +66,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking } catch (Exception ex) { - Trace.WriteLine("UvConnectRequest " + ex.ToString()); + req._log.LogError("UvConnectRequest", ex); } } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvHandle.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvHandle.cs index cb4d5a37dc..4b90ecfd57 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvHandle.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvHandle.cs @@ -3,6 +3,7 @@ using System; using System.Threading; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Networking { @@ -11,6 +12,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking private static Libuv.uv_close_cb _destroyMemory = DestroyMemory; private Action, IntPtr> _queueCloseHandle; + protected UvHandle(IKestrelTrace logger) : base (logger) + { + } + unsafe protected void CreateHandle( Libuv uv, int threadId, diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvLoopHandle.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvLoopHandle.cs index f0f3d454b1..5c708c2e23 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvLoopHandle.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvLoopHandle.cs @@ -3,11 +3,16 @@ using System; using System.Threading; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Networking { public class UvLoopHandle : UvHandle { + public UvLoopHandle(IKestrelTrace logger) : base(logger) + { + } + public void Init(Libuv uv) { CreateMemory( diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvMemory.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvMemory.cs index f9d0e11ed2..051218ffef 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvMemory.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvMemory.cs @@ -5,6 +5,7 @@ using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Networking { @@ -15,9 +16,11 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking { protected Libuv _uv; protected int _threadId; + protected IKestrelTrace _log; - public UvMemory() : base(IntPtr.Zero, true) + protected UvMemory(IKestrelTrace logger) : base(IntPtr.Zero, true) { + _log = logger; } public Libuv Libuv { get { return _uv; } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvPipeHandle.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvPipeHandle.cs index ea575a64dd..5205eb5f9b 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvPipeHandle.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvPipeHandle.cs @@ -3,11 +3,16 @@ using System; using System.Net; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Networking { public class UvPipeHandle : UvStreamHandle { + public UvPipeHandle(IKestrelTrace logger) : base(logger) + { + } + public void Init(UvLoopHandle loop, bool ipc) { CreateMemory( diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvRequest.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvRequest.cs index e79ff42674..4005129cec 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvRequest.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvRequest.cs @@ -1,8 +1,6 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Runtime.InteropServices; -using System.Threading.Tasks; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Networking { @@ -10,6 +8,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking { private GCHandle _pin; + protected UvRequest(IKestrelTrace logger) : base (logger) + { + } + protected override bool ReleaseHandle() { DestroyMemory(handle); diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvShutdownReq.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvShutdownReq.cs index a8841754bf..d6aa2c65ad 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvShutdownReq.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvShutdownReq.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Runtime.InteropServices; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Networking { @@ -16,6 +16,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking private Action _callback; private object _state; + public UvShutdownReq(IKestrelTrace logger) : base (logger) + { + } + public void Init(UvLoopHandle loop) { CreateMemory( diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvStreamHandle.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvStreamHandle.cs index 33c0008549..c215ae67e6 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvStreamHandle.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvStreamHandle.cs @@ -2,8 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics; using System.Runtime.InteropServices; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel.Networking { @@ -22,6 +23,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking public object _readState; private GCHandle _readVitality; + protected UvStreamHandle(IKestrelTrace logger) : base(logger) + { + } + protected override bool ReleaseHandle() { if (_listenVitality.IsAllocated) @@ -127,7 +132,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking } catch (Exception ex) { - Trace.WriteLine("UvConnectionCb " + ex.ToString()); + stream._log.LogError("UvConnectionCb", ex); } } @@ -141,7 +146,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking } catch (Exception ex) { - Trace.WriteLine("UvAllocCb " + ex.ToString()); + stream._log.LogError("UvAllocCb", ex); buf = stream.Libuv.buf_init(IntPtr.Zero, 0); throw; } @@ -166,7 +171,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking } catch (Exception ex) { - Trace.WriteLine("UbReadCb " + ex.ToString()); + stream._log.LogError("UbReadCb", ex); } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvTcpHandle.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvTcpHandle.cs index 281f29190b..d99f225bd1 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvTcpHandle.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvTcpHandle.cs @@ -3,11 +3,16 @@ using System; using System.Net; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; namespace Microsoft.AspNet.Server.Kestrel.Networking { public class UvTcpHandle : UvStreamHandle { + public UvTcpHandle(IKestrelTrace logger) : base(logger) + { + } + public void Init(UvLoopHandle loop) { CreateMemory( diff --git a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvWriteReq.cs b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvWriteReq.cs index 39aba8b4dc..298bdf416f 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/Networking/UvWriteReq.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/Networking/UvWriteReq.cs @@ -3,8 +3,9 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Runtime.InteropServices; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel.Networking { @@ -23,6 +24,10 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking private List _pins = new List(); + public UvWriteReq(IKestrelTrace logger) : base(logger) + { + } + public void Init(UvLoopHandle loop) { var requestSize = loop.Libuv.req_size(Libuv.RequestType.WRITE); @@ -161,7 +166,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Networking } catch (Exception ex) { - Trace.WriteLine("UvWriteCb " + ex.ToString()); + req._log.LogError("UvWriteCb", ex); } } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs b/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs index 10b49da527..256b70c248 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/ServerFactory.cs @@ -8,6 +8,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http.Features; using Microsoft.Dnx.Runtime; using Microsoft.Framework.Configuration; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Kestrel { @@ -18,11 +19,13 @@ namespace Microsoft.AspNet.Server.Kestrel { private readonly ILibraryManager _libraryManager; private readonly IApplicationShutdown _appShutdownService; + private readonly ILogger _logger; - public ServerFactory(ILibraryManager libraryManager, IApplicationShutdown appShutdownService) + public ServerFactory(ILibraryManager libraryManager, IApplicationShutdown appShutdownService, ILoggerFactory loggerFactory) { _libraryManager = libraryManager; _appShutdownService = appShutdownService; + _logger = loggerFactory.CreateLogger("Microsoft.AspNet.Server.Kestrel"); } public IFeatureCollection Initialize(IConfiguration configuration) @@ -48,7 +51,7 @@ namespace Microsoft.AspNet.Server.Kestrel try { var information = (KestrelServerInformation)serverFeatures.Get(); - var engine = new KestrelEngine(_libraryManager, _appShutdownService); + var engine = new KestrelEngine(_libraryManager, _appShutdownService, _logger); disposables.Push(engine); diff --git a/src/Microsoft.AspNet.Server.Kestrel/ServiceContext.cs b/src/Microsoft.AspNet.Server.Kestrel/ServiceContext.cs index bd09076565..7e9d4d23f1 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/ServiceContext.cs +++ b/src/Microsoft.AspNet.Server.Kestrel/ServiceContext.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Server.Kestrel.Http; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.Dnx.Runtime; namespace Microsoft.AspNet.Server.Kestrel @@ -11,5 +12,7 @@ namespace Microsoft.AspNet.Server.Kestrel public IApplicationShutdown AppShutdown { get; set; } public IMemoryPool Memory { get; set; } + + public IKestrelTrace Log { get; set; } } } diff --git a/src/Microsoft.AspNet.Server.Kestrel/project.json b/src/Microsoft.AspNet.Server.Kestrel/project.json index 4a3d0ab496..26e0dc886a 100644 --- a/src/Microsoft.AspNet.Server.Kestrel/project.json +++ b/src/Microsoft.AspNet.Server.Kestrel/project.json @@ -8,6 +8,7 @@ "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", "Microsoft.StandardsPolice": { "version": "1.0.0-*", "type": "build" diff --git a/test/Microsoft.AspNet.Server.KestrelTests/EngineTests.cs b/test/Microsoft.AspNet.Server.KestrelTests/EngineTests.cs index a293e8bae9..0a49cb3f85 100644 --- a/test/Microsoft.AspNet.Server.KestrelTests/EngineTests.cs +++ b/test/Microsoft.AspNet.Server.KestrelTests/EngineTests.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public void EngineCanStartAndStop() { - var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented()); + var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented(), new TestLogger()); engine.Start(1); engine.Dispose(); } @@ -94,7 +94,7 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public void ListenerCanCreateAndDispose() { - var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented()); + var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented(), new TestLogger()); engine.Start(1); var started = engine.CreateServer("http", "localhost", 54321, App); started.Dispose(); @@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public void ConnectionCanReadAndWrite() { - var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented()); + var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented(), new TestLogger()); engine.Start(1); var started = engine.CreateServer("http", "localhost", 54321, App); diff --git a/test/Microsoft.AspNet.Server.KestrelTests/MultipleLoopTests.cs b/test/Microsoft.AspNet.Server.KestrelTests/MultipleLoopTests.cs index 35f4f334e6..cef89f8f6c 100644 --- a/test/Microsoft.AspNet.Server.KestrelTests/MultipleLoopTests.cs +++ b/test/Microsoft.AspNet.Server.KestrelTests/MultipleLoopTests.cs @@ -4,6 +4,7 @@ using System.Net.Sockets; using System.Runtime.InteropServices; using System.Threading; using Microsoft.AspNet.Server.Kestrel; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.AspNet.Server.Kestrel.Networking; using Microsoft.Dnx.Runtime; using Microsoft.Dnx.Runtime.Infrastructure; @@ -13,10 +14,11 @@ namespace Microsoft.AspNet.Server.KestrelTests { public class MultipleLoopTests { - Libuv _uv; + private readonly Libuv _uv; + private readonly IKestrelTrace _logger = new KestrelTrace(new TestLogger()); public MultipleLoopTests() { - var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented()); + var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented(), new TestLogger()); _uv = engine.Libuv; } @@ -41,8 +43,8 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public void InitAndCloseServerPipe() { - var loop = new UvLoopHandle(); - var pipe = new UvPipeHandle(); + var loop = new UvLoopHandle(_logger); + var pipe = new UvPipeHandle(_logger); loop.Init(_uv); pipe.Init(loop, true); @@ -59,15 +61,15 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public void ServerPipeListenForConnections() { - var loop = new UvLoopHandle(); - var serverListenPipe = new UvPipeHandle(); + var loop = new UvLoopHandle(_logger); + var serverListenPipe = new UvPipeHandle(_logger); loop.Init(_uv); serverListenPipe.Init(loop, false); serverListenPipe.Bind(@"\\.\pipe\ServerPipeListenForConnections"); serverListenPipe.Listen(128, (_1, status, error, _2) => { - var serverConnectionPipe = new UvPipeHandle(); + var serverConnectionPipe = new UvPipeHandle(_logger); serverConnectionPipe.Init(loop, true); try { @@ -79,7 +81,7 @@ namespace Microsoft.AspNet.Server.KestrelTests return; } - var writeRequest = new UvWriteReq(); + var writeRequest = new UvWriteReq(new KestrelTrace(new TestLogger())); writeRequest.Init(loop); writeRequest.Write( serverConnectionPipe, @@ -96,9 +98,9 @@ namespace Microsoft.AspNet.Server.KestrelTests var worker = new Thread(() => { - var loop2 = new UvLoopHandle(); - var clientConnectionPipe = new UvPipeHandle(); - var connect = new UvConnectRequest(); + var loop2 = new UvLoopHandle(_logger); + var clientConnectionPipe = new UvPipeHandle(_logger); + var connect = new UvConnectRequest(new KestrelTrace(new TestLogger())); loop2.Init(_uv); clientConnectionPipe.Init(loop2, true); @@ -134,19 +136,19 @@ namespace Microsoft.AspNet.Server.KestrelTests { var pipeName = @"\\.\pipe\ServerPipeDispatchConnections" + Guid.NewGuid().ToString("n"); - var loop = new UvLoopHandle(); + var loop = new UvLoopHandle(_logger); loop.Init(_uv); var serverConnectionPipe = default(UvPipeHandle); var serverConnectionPipeAcceptedEvent = new ManualResetEvent(false); var serverConnectionTcpDisposedEvent = new ManualResetEvent(false); - var serverListenPipe = new UvPipeHandle(); + var serverListenPipe = new UvPipeHandle(_logger); serverListenPipe.Init(loop, false); serverListenPipe.Bind(pipeName); serverListenPipe.Listen(128, (_1, status, error, _2) => { - serverConnectionPipe = new UvPipeHandle(); + serverConnectionPipe = new UvPipeHandle(_logger); serverConnectionPipe.Init(loop, true); try { @@ -161,18 +163,18 @@ namespace Microsoft.AspNet.Server.KestrelTests } }, null); - var serverListenTcp = new UvTcpHandle(); + var serverListenTcp = new UvTcpHandle(_logger); serverListenTcp.Init(loop); serverListenTcp.Bind(new IPEndPoint(0, 54321)); serverListenTcp.Listen(128, (_1, status, error, _2) => { - var serverConnectionTcp = new UvTcpHandle(); + var serverConnectionTcp = new UvTcpHandle(_logger); serverConnectionTcp.Init(loop); serverListenTcp.Accept(serverConnectionTcp); serverConnectionPipeAcceptedEvent.WaitOne(); - var writeRequest = new UvWriteReq(); + var writeRequest = new UvWriteReq(new KestrelTrace(new TestLogger())); writeRequest.Init(loop); writeRequest.Write2( serverConnectionPipe, @@ -192,9 +194,9 @@ namespace Microsoft.AspNet.Server.KestrelTests var worker = new Thread(() => { - var loop2 = new UvLoopHandle(); - var clientConnectionPipe = new UvPipeHandle(); - var connect = new UvConnectRequest(); + var loop2 = new UvLoopHandle(_logger); + var clientConnectionPipe = new UvPipeHandle(_logger); + var connect = new UvConnectRequest(new KestrelTrace(new TestLogger())); loop2.Init(_uv); clientConnectionPipe.Init(loop2, true); @@ -216,7 +218,7 @@ namespace Microsoft.AspNet.Server.KestrelTests clientConnectionPipe.Dispose(); return; } - var clientConnectionTcp = new UvTcpHandle(); + var clientConnectionTcp = new UvTcpHandle(_logger); clientConnectionTcp.Init(loop2); clientConnectionPipe.Accept(clientConnectionTcp); var buf2 = loop2.Libuv.buf_init(Marshal.AllocHGlobal(64), 64); diff --git a/test/Microsoft.AspNet.Server.KestrelTests/NetworkingTests.cs b/test/Microsoft.AspNet.Server.KestrelTests/NetworkingTests.cs index 4e381b079d..e5dfc9f3cb 100644 --- a/test/Microsoft.AspNet.Server.KestrelTests/NetworkingTests.cs +++ b/test/Microsoft.AspNet.Server.KestrelTests/NetworkingTests.cs @@ -7,6 +7,7 @@ using System.Net.Sockets; using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.AspNet.Server.Kestrel; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.AspNet.Server.Kestrel.Networking; using Microsoft.Dnx.Runtime; using Microsoft.Dnx.Runtime.Infrastructure; @@ -19,10 +20,11 @@ namespace Microsoft.AspNet.Server.KestrelTests /// public class NetworkingTests { - Libuv _uv; + private readonly Libuv _uv; + private readonly IKestrelTrace _logger = new KestrelTrace(new TestLogger()); public NetworkingTests() { - var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented()); + var engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented(), new TestLogger()); _uv = engine.Libuv; } @@ -47,7 +49,7 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public void LoopCanBeInitAndClose() { - var loop = new UvLoopHandle(); + var loop = new UvLoopHandle(_logger); loop.Init(_uv); loop.Run(); loop.Dispose(); @@ -56,9 +58,9 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public void AsyncCanBeSent() { - var loop = new UvLoopHandle(); + var loop = new UvLoopHandle(_logger); loop.Init(_uv); - var trigger = new UvAsyncHandle(); + var trigger = new UvAsyncHandle(_logger); var called = false; trigger.Init(loop, () => { @@ -74,9 +76,9 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public void SocketCanBeInitAndClose() { - var loop = new UvLoopHandle(); + var loop = new UvLoopHandle(_logger); loop.Init(_uv); - var tcp = new UvTcpHandle(); + var tcp = new UvTcpHandle(_logger); tcp.Init(loop); tcp.Bind(new IPEndPoint(IPAddress.Loopback, 0)); tcp.Dispose(); @@ -88,14 +90,14 @@ namespace Microsoft.AspNet.Server.KestrelTests [Fact] public async Task SocketCanListenAndAccept() { - var loop = new UvLoopHandle(); + var loop = new UvLoopHandle(_logger); loop.Init(_uv); - var tcp = new UvTcpHandle(); + var tcp = new UvTcpHandle(_logger); tcp.Init(loop); tcp.Bind(new IPEndPoint(IPAddress.Loopback, 54321)); tcp.Listen(10, (stream, status, error, state) => { - var tcp2 = new UvTcpHandle(); + var tcp2 = new UvTcpHandle(_logger); tcp2.Init(loop); stream.Accept(tcp2); tcp2.Dispose(); @@ -125,15 +127,15 @@ namespace Microsoft.AspNet.Server.KestrelTests public async Task SocketCanRead() { int bytesRead = 0; - var loop = new UvLoopHandle(); + var loop = new UvLoopHandle(_logger); loop.Init(_uv); - var tcp = new UvTcpHandle(); + var tcp = new UvTcpHandle(_logger); tcp.Init(loop); tcp.Bind(new IPEndPoint(IPAddress.Loopback, 54321)); tcp.Listen(10, (_, status, error, state) => { Console.WriteLine("Connected"); - var tcp2 = new UvTcpHandle(); + var tcp2 = new UvTcpHandle(_logger); tcp2.Init(loop); tcp.Accept(tcp2); var data = Marshal.AllocCoTaskMem(500); @@ -181,15 +183,15 @@ namespace Microsoft.AspNet.Server.KestrelTests public async Task SocketCanReadAndWrite() { int bytesRead = 0; - var loop = new UvLoopHandle(); + var loop = new UvLoopHandle(_logger); loop.Init(_uv); - var tcp = new UvTcpHandle(); + var tcp = new UvTcpHandle(_logger); tcp.Init(loop); tcp.Bind(new IPEndPoint(IPAddress.Loopback, 54321)); tcp.Listen(10, (_, status, error, state) => { Console.WriteLine("Connected"); - var tcp2 = new UvTcpHandle(); + var tcp2 = new UvTcpHandle(_logger); tcp2.Init(loop); tcp.Accept(tcp2); var data = Marshal.AllocCoTaskMem(500); @@ -206,7 +208,7 @@ namespace Microsoft.AspNet.Server.KestrelTests { for (var x = 0; x != 2; ++x) { - var req = new UvWriteReq(); + var req = new UvWriteReq(new KestrelTrace(new TestLogger())); req.Init(loop); req.Write( tcp2, diff --git a/test/Microsoft.AspNet.Server.KestrelTests/SocketOutputTests.cs b/test/Microsoft.AspNet.Server.KestrelTests/SocketOutputTests.cs index 97b1d998d7..7577fa25d5 100644 --- a/test/Microsoft.AspNet.Server.KestrelTests/SocketOutputTests.cs +++ b/test/Microsoft.AspNet.Server.KestrelTests/SocketOutputTests.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Threading; using Microsoft.AspNet.Server.Kestrel; using Microsoft.AspNet.Server.Kestrel.Http; +using Microsoft.AspNet.Server.Kestrel.Infrastructure; using Microsoft.AspNet.Server.Kestrel.Networking; using Microsoft.AspNet.Server.KestrelTests.TestHelpers; using Xunit; @@ -31,13 +32,14 @@ namespace Microsoft.AspNet.Server.KestrelTests } }; - using (var kestrelEngine = new KestrelEngine(mockLibuv, new ShutdownNotImplemented())) + using (var kestrelEngine = new KestrelEngine(mockLibuv, new ShutdownNotImplemented(), new TestLogger())) { kestrelEngine.Start(count: 1); var kestrelThread = kestrelEngine.Threads[0]; - var socket = new MockSocket(kestrelThread.Loop.ThreadId); - var socketOutput = new SocketOutput(kestrelThread, socket); + var socket = new MockSocket(kestrelThread.Loop.ThreadId, new KestrelTrace(new TestLogger())); + var trace = new KestrelTrace(new TestLogger()); + var socketOutput = new SocketOutput(kestrelThread, socket, trace); // I doubt _maxBytesPreCompleted will ever be over a MB. If it is, we should change this test. var bufferSize = 1048576; @@ -75,13 +77,14 @@ namespace Microsoft.AspNet.Server.KestrelTests } }; - using (var kestrelEngine = new KestrelEngine(mockLibuv, new ShutdownNotImplemented())) + using (var kestrelEngine = new KestrelEngine(mockLibuv, new ShutdownNotImplemented(), new TestLogger())) { kestrelEngine.Start(count: 1); var kestrelThread = kestrelEngine.Threads[0]; - var socket = new MockSocket(kestrelThread.Loop.ThreadId); - var socketOutput = new SocketOutput(kestrelThread, socket); + var socket = new MockSocket(kestrelThread.Loop.ThreadId, new KestrelTrace(new TestLogger())); + var trace = new KestrelTrace(new TestLogger()); + var socketOutput = new SocketOutput(kestrelThread, socket, trace); var bufferSize = maxBytesPreCompleted; var buffer = new ArraySegment(new byte[bufferSize], 0, bufferSize); @@ -115,7 +118,7 @@ namespace Microsoft.AspNet.Server.KestrelTests private class MockSocket : UvStreamHandle { - public MockSocket(int threadId) + public MockSocket(int threadId, IKestrelTrace logger) : base(logger) { // Set the handle to something other than IntPtr.Zero // so handle.Validate doesn't fail in Libuv.write diff --git a/test/Microsoft.AspNet.Server.KestrelTests/TestLogger.cs b/test/Microsoft.AspNet.Server.KestrelTests/TestLogger.cs new file mode 100644 index 0000000000..2c25a46691 --- /dev/null +++ b/test/Microsoft.AspNet.Server.KestrelTests/TestLogger.cs @@ -0,0 +1,23 @@ +using System; +using Microsoft.AspNet.Server.Kestrel; +using Microsoft.Framework.Logging; + +namespace Microsoft.AspNet.Server.KestrelTests +{ + public class TestLogger : ILogger + { + public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func formatter) + { + } + + public bool IsEnabled(LogLevel logLevel) + { + return false; + } + + public IDisposable BeginScopeImpl(object state) + { + return new Disposable(() => { }); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Server.KestrelTests/TestServer.cs b/test/Microsoft.AspNet.Server.KestrelTests/TestServer.cs index b299d26246..3ada706a90 100644 --- a/test/Microsoft.AspNet.Server.KestrelTests/TestServer.cs +++ b/test/Microsoft.AspNet.Server.KestrelTests/TestServer.cs @@ -45,7 +45,7 @@ namespace Microsoft.AspNet.Server.KestrelTests public void Create(Func app) { - _engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented()); + _engine = new KestrelEngine(LibraryManager, new ShutdownNotImplemented(), new TestLogger()); _engine.Start(1); _server = _engine.CreateServer( "http",