Adding support for capturing the output of a node instance for custom logging implementations.

This commit is contained in:
Paul Knopf
2016-07-15 00:42:17 -04:00
committed by SteveSandersonMS
parent a14d9ba2df
commit 27ffa72e0d
7 changed files with 52 additions and 9 deletions

View File

@@ -46,10 +46,10 @@ namespace Microsoft.AspNetCore.NodeServices
switch (options.HostingModel) switch (options.HostingModel)
{ {
case NodeHostingModel.Http: case NodeHostingModel.Http:
return new HttpNodeInstance(options.ProjectPath, options.WatchFileExtensions, /* port */ 0); return new HttpNodeInstance(options.ProjectPath, options.WatchFileExtensions, /* port */ 0, options.NodeInstanceOutputLogger);
case NodeHostingModel.Socket: case NodeHostingModel.Socket:
var pipeName = "pni-" + Guid.NewGuid().ToString("D"); // Arbitrary non-clashing string var pipeName = "pni-" + Guid.NewGuid().ToString("D"); // Arbitrary non-clashing string
return new SocketNodeInstance(options.ProjectPath, options.WatchFileExtensions, pipeName); return new SocketNodeInstance(options.ProjectPath, options.WatchFileExtensions, pipeName, options.NodeInstanceOutputLogger);
default: default:
throw new ArgumentException("Unknown hosting model: " + options.HostingModel); throw new ArgumentException("Unknown hosting model: " + options.HostingModel);
} }

View File

@@ -1,5 +1,6 @@
using System; using System;
using Microsoft.AspNetCore.NodeServices.HostingModels; using Microsoft.AspNetCore.NodeServices.HostingModels;
using Microsoft.AspNetCore.NodeServices.Util;
namespace Microsoft.AspNetCore.NodeServices namespace Microsoft.AspNetCore.NodeServices
{ {
@@ -19,5 +20,6 @@ namespace Microsoft.AspNetCore.NodeServices
public Func<INodeInstance> NodeInstanceFactory { get; set; } public Func<INodeInstance> NodeInstanceFactory { get; set; }
public string ProjectPath { get; set; } public string ProjectPath { get; set; }
public string[] WatchFileExtensions { get; set; } public string[] WatchFileExtensions { get; set; }
public INodeInstanceOutputLogger NodeInstanceOutputLogger { get; set; }
} }
} }

View File

@@ -4,6 +4,7 @@ using System.Net.Http;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.NodeServices.Util;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
@@ -32,14 +33,15 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
private bool _disposed; private bool _disposed;
private int _portNumber; private int _portNumber;
public HttpNodeInstance(string projectPath, string[] watchFileExtensions, int port = 0) public HttpNodeInstance(string projectPath, string[] watchFileExtensions, int port = 0, INodeInstanceOutputLogger nodeInstanceOutputLogger = null)
: base( : base(
EmbeddedResourceReader.Read( EmbeddedResourceReader.Read(
typeof(HttpNodeInstance), typeof(HttpNodeInstance),
"/Content/Node/entrypoint-http.js"), "/Content/Node/entrypoint-http.js"),
projectPath, projectPath,
watchFileExtensions, watchFileExtensions,
MakeCommandLineOptions(port)) MakeCommandLineOptions(port),
nodeInstanceOutputLogger)
{ {
_client = new HttpClient(); _client = new HttpClient();
} }

View File

@@ -3,6 +3,7 @@ using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.NodeServices.Util;
namespace Microsoft.AspNetCore.NodeServices.HostingModels namespace Microsoft.AspNetCore.NodeServices.HostingModels
{ {
@@ -26,13 +27,18 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
private readonly Process _nodeProcess; private readonly Process _nodeProcess;
private bool _nodeProcessNeedsRestart; private bool _nodeProcessNeedsRestart;
private readonly string[] _watchFileExtensions; private readonly string[] _watchFileExtensions;
private INodeInstanceOutputLogger _nodeInstanceOutputLogger;
public OutOfProcessNodeInstance( public OutOfProcessNodeInstance(
string entryPointScript, string entryPointScript,
string projectPath, string projectPath,
string[] watchFileExtensions, string[] watchFileExtensions,
string commandLineArguments) string commandLineArguments,
INodeInstanceOutputLogger nodeOutputLogger)
{ {
_nodeInstanceOutputLogger = nodeOutputLogger;
if(_nodeInstanceOutputLogger == null)
_nodeInstanceOutputLogger = new ConsoleNodeInstanceOutputLogger();
_entryPointScript = new StringAsTempFile(entryPointScript); _entryPointScript = new StringAsTempFile(entryPointScript);
var startInfo = PrepareNodeProcessStartInfo(_entryPointScript.FileName, projectPath, commandLineArguments); var startInfo = PrepareNodeProcessStartInfo(_entryPointScript.FileName, projectPath, commandLineArguments);
@@ -106,12 +112,12 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
protected virtual void OnOutputDataReceived(string outputData) protected virtual void OnOutputDataReceived(string outputData)
{ {
Console.WriteLine("[Node] " + outputData); _nodeInstanceOutputLogger.LogOutputData(outputData);
} }
protected virtual void OnErrorDataReceived(string errorData) protected virtual void OnErrorDataReceived(string errorData)
{ {
Console.WriteLine("[Node] " + errorData); _nodeInstanceOutputLogger.LogErrorData(errorData);
} }
protected virtual void Dispose(bool disposing) protected virtual void Dispose(bool disposing)

View File

@@ -5,6 +5,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.NodeServices.HostingModels.PhysicalConnections; using Microsoft.AspNetCore.NodeServices.HostingModels.PhysicalConnections;
using Microsoft.AspNetCore.NodeServices.HostingModels.VirtualConnections; using Microsoft.AspNetCore.NodeServices.HostingModels.VirtualConnections;
using Microsoft.AspNetCore.NodeServices.Util;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
@@ -36,13 +37,14 @@ namespace Microsoft.AspNetCore.NodeServices.HostingModels
private string _socketAddress; private string _socketAddress;
private VirtualConnectionClient _virtualConnectionClient; private VirtualConnectionClient _virtualConnectionClient;
public SocketNodeInstance(string projectPath, string[] watchFileExtensions, string socketAddress) : base( public SocketNodeInstance(string projectPath, string[] watchFileExtensions, string socketAddress, INodeInstanceOutputLogger nodeInstanceOutputLogger = null) : base(
EmbeddedResourceReader.Read( EmbeddedResourceReader.Read(
typeof(SocketNodeInstance), typeof(SocketNodeInstance),
"/Content/Node/entrypoint-socket.js"), "/Content/Node/entrypoint-socket.js"),
projectPath, projectPath,
watchFileExtensions, watchFileExtensions,
MakeNewCommandLineOptions(socketAddress)) MakeNewCommandLineOptions(socketAddress),
nodeInstanceOutputLogger)
{ {
_socketAddress = socketAddress; _socketAddress = socketAddress;
} }

View File

@@ -0,0 +1,17 @@
using System;
namespace Microsoft.AspNetCore.NodeServices.Util
{
public class ConsoleNodeInstanceOutputLogger : INodeInstanceOutputLogger
{
public void LogOutputData(string outputData)
{
Console.WriteLine("[Node] " + outputData);
}
public void LogErrorData(string errorData)
{
Console.WriteLine("[Node] " + errorData);
}
}
}

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Microsoft.AspNetCore.NodeServices.Util
{
public interface INodeInstanceOutputLogger
{
void LogOutputData(string outputData);
void LogErrorData(string errorData);
}
}