public Task <ActionResult> CaptureLogs( ProcessKey?processKey, [FromQuery][Range(-1, int.MaxValue)] int durationSeconds = 30, [FromQuery] LogLevel?level = null, [FromQuery] string egressProvider = null) { return(InvokeForProcess(processInfo => { TimeSpan duration = ConvertSecondsToTimeSpan(durationSeconds); LogFormat format = ComputeLogFormat(Request.GetTypedHeaders().Accept); if (format == LogFormat.None) { return this.NotAcceptable(); } string fileName = FormattableString.Invariant($"{GetFileNameTimeStampUtcNow()}_{processInfo.EndpointInfo.ProcessId}.txt"); string contentType = format == LogFormat.EventStream ? ContentTypes.TextEventStream : ContentTypes.ApplicationNdJson; Func <Stream, CancellationToken, Task> action = async(outputStream, token) => { using var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(new StreamingLoggerProvider(outputStream, format, level)); var settings = new EventLogsPipelineSettings() { Duration = duration }; //If the user does not explicitly specify a log level, we will use the apps defaults for .net 5. //Otherwise, we use the log level specified by the query. if ((!level.HasValue) && (processInfo.EndpointInfo.RuntimeInstanceCookie != Guid.Empty)) { settings.UseAppFilters = true; } else { settings.LogLevel = level.GetValueOrDefault(LogLevel.Warning); } var client = new DiagnosticsClient(processInfo.EndpointInfo.Endpoint); await using EventLogsPipeline pipeline = new EventLogsPipeline(client, settings, loggerFactory); await pipeline.RunAsync(token); }; return Result( ArtifactType_Logs, egressProvider, action, fileName, contentType, processInfo.EndpointInfo, format != LogFormat.EventStream); }, processKey, ArtifactType_Logs)); }
public Task <ActionResult> Logs( ProcessFilter?processFilter, [FromQuery][Range(-1, int.MaxValue)] int durationSeconds = 30, [FromQuery] LogLevel level = LogLevel.Debug, [FromQuery] string egressProvider = null) { TimeSpan duration = ConvertSecondsToTimeSpan(durationSeconds); return(this.InvokeService(async() => { IProcessInfo processInfo = await _diagnosticServices.GetProcessAsync(processFilter, HttpContext.RequestAborted); LogFormat format = ComputeLogFormat(Request.GetTypedHeaders().Accept); if (format == LogFormat.None) { return this.NotAcceptable(); } string fileName = FormattableString.Invariant($"{GetFileNameTimeStampUtcNow()}_{processInfo.EndpointInfo.ProcessId}.txt"); string contentType = format == LogFormat.EventStream ? ContentTypes.TextEventStream : ContentTypes.ApplicationNdJson; Func <Stream, CancellationToken, Task> action = async(outputStream, token) => { using var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(new StreamingLoggerProvider(outputStream, format, level)); var settings = new EventLogsPipelineSettings { Duration = duration, LogLevel = level, }; var client = new DiagnosticsClient(processInfo.EndpointInfo.Endpoint); await using EventLogsPipeline pipeline = new EventLogsPipeline(client, settings, loggerFactory); await pipeline.RunAsync(token); }; return Result( egressProvider, action, fileName, contentType, processInfo.EndpointInfo, format != LogFormat.EventStream); })); }
public Task <ActionResult> Logs( ProcessFilter?processFilter, [FromQuery][Range(-1, int.MaxValue)] int durationSeconds = 30, [FromQuery] LogLevel level = LogLevel.Debug) { TimeSpan duration = ConvertSecondsToTimeSpan(durationSeconds); return(this.InvokeService(async() => { IProcessInfo processInfo = await _diagnosticServices.GetProcessAsync(processFilter, HttpContext.RequestAborted); LogFormat format = ComputeLogFormat(Request.GetTypedHeaders().Accept); if (format == LogFormat.None) { return this.NotAcceptable(); } string contentType = (format == LogFormat.EventStream) ? ContentTypeEventStream : ContentTypeNdJson; string downloadName = (format == LogFormat.EventStream) ? null : FormattableString.Invariant($"{GetFileNameTimeStampUtcNow()}_{processInfo.ProcessId}.txt"); return new OutputStreamResult(async(outputStream, token) => { using var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(new StreamingLoggerProvider(outputStream, format, level)); var settings = new EventLogsPipelineSettings { Duration = duration, LogLevel = level, }; await using EventLogsPipeline pipeline = new EventLogsPipeline(processInfo.Client, settings, loggerFactory); await pipeline.RunAsync(token); }, contentType, downloadName); })); }