Skip to content

Commit 097bb8d

Browse files
Unify logging on Microsoft.CodeAnalysis.Razor.Logging.ILogger (#10296)
Fixes #10294 This pull request removes Razor tooling's alternative logging systems (`IErrorReporter` and `RazorLogger`) and unifies on `Microsoft.CodeAnalysis.Razor.Logging.ILogger`. As part of this, I've introduced a `RazorActivityLog` service that can be MEF imported in the VS layer to write to the VS activity log. Also, I've add an `ILoggerProvider` in the VS layer that automatically writes any warnings and errors to the activity log.
2 parents 9acd526 + 0646c2d commit 097bb8d

File tree

46 files changed

+417
-506
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+417
-506
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the MIT license. See License.txt in the project root for license information.
3+
4+
using System;
5+
using Microsoft.CodeAnalysis.Razor.Logging;
6+
7+
namespace Microsoft.AspNetCore.Razor.Logging;
8+
9+
internal sealed partial class EmptyLoggingFactory
10+
{
11+
private sealed class EmptyLogger : ILogger
12+
{
13+
public static readonly EmptyLogger Instance = new();
14+
15+
private EmptyLogger()
16+
{
17+
}
18+
19+
public bool IsEnabled(LogLevel logLevel) => false;
20+
21+
public void Log(LogLevel logLevel, string message, Exception? exception)
22+
{
23+
}
24+
}
25+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the MIT license. See License.txt in the project root for license information.
3+
4+
using System;
5+
using Microsoft.CodeAnalysis.Razor.Logging;
6+
7+
namespace Microsoft.AspNetCore.Razor.Logging;
8+
9+
internal sealed partial class EmptyLoggingFactory : ILoggerFactory
10+
{
11+
public static readonly EmptyLoggingFactory Instance = new();
12+
13+
private EmptyLoggingFactory()
14+
{
15+
}
16+
17+
public void AddLoggerProvider(ILoggerProvider provider)
18+
=> throw new NotImplementedException();
19+
20+
public ILogger GetOrCreateLogger(string categoryName)
21+
=> EmptyLogger.Instance;
22+
}

src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/ProjectSystem/ProjectSnapshotManagerBenchmarkBase.TestErrorReporter.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/ProjectSystem/ProjectSnapshotManagerBenchmarkBase.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.IO;
77
using Microsoft.AspNetCore.Razor.Language;
88
using Microsoft.AspNetCore.Razor.LanguageServer;
9+
using Microsoft.AspNetCore.Razor.Logging;
910
using Microsoft.AspNetCore.Razor.PooledObjects;
1011
using Microsoft.CodeAnalysis;
1112
using Microsoft.CodeAnalysis.Razor;
@@ -23,7 +24,6 @@ public abstract partial class ProjectSnapshotManagerBenchmarkBase
2324
internal ImmutableArray<TextLoader> TextLoaders { get; }
2425
protected string RepoRoot { get; }
2526
private protected ProjectSnapshotManagerDispatcher Dispatcher { get; }
26-
private protected IErrorReporter ErrorReporter { get; }
2727

2828
protected ProjectSnapshotManagerBenchmarkBase(int documentCount = 100)
2929
{
@@ -67,8 +67,7 @@ protected ProjectSnapshotManagerBenchmarkBase(int documentCount = 100)
6767
.Setup(x => x.GetOrCreateLogger(It.IsAny<string>()))
6868
.Returns(Mock.Of<ILogger>(MockBehavior.Strict));
6969

70-
ErrorReporter = new TestErrorReporter();
71-
Dispatcher = new LSPProjectSnapshotManagerDispatcher(ErrorReporter);
70+
Dispatcher = new LSPProjectSnapshotManagerDispatcher(EmptyLoggingFactory.Instance);
7271
}
7372

7473
internal ProjectSnapshotManager CreateProjectSnapshotManager()

src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/LSPProjectSnapshotManagerDispatcher.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
// Licensed under the MIT license. See License.txt in the project root for license information.
33

44
using Microsoft.CodeAnalysis.Razor;
5+
using Microsoft.CodeAnalysis.Razor.Logging;
56

67
namespace Microsoft.AspNetCore.Razor.LanguageServer;
78

8-
internal class LSPProjectSnapshotManagerDispatcher(IErrorReporter errorReporter)
9-
: ProjectSnapshotManagerDispatcher(errorReporter)
9+
internal class LSPProjectSnapshotManagerDispatcher(ILoggerFactory loggerFactory)
10+
: ProjectSnapshotManagerDispatcher(loggerFactory)
1011
{
1112
}

src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/LanguageServerErrorReporter.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/RazorLanguageServer.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,6 @@ protected override ILspServices ConstructLspServices()
108108
// Add the logger as a service in case anything in CLaSP pulls it out to do logging
109109
services.AddSingleton<ILspLogger>(_logger);
110110

111-
services.AddSingleton<IErrorReporter, LanguageServerErrorReporter>();
112-
113111
if (_projectSnapshotManagerDispatcher is null)
114112
{
115113
services.AddSingleton<ProjectSnapshotManagerDispatcher, LSPProjectSnapshotManagerDispatcher>();

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/IErrorReporter.cs

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the MIT license. See License.txt in the project root for license information.
3+
4+
namespace Microsoft.CodeAnalysis.Razor.Logging;
5+
6+
internal static class LogLevelExtensions
7+
{
8+
public static bool IsAtLeast(this LogLevel target, LogLevel logLevel)
9+
{
10+
return target >= logLevel && target != LogLevel.None;
11+
}
12+
13+
public static bool IsAtMost(this LogLevel target, LogLevel logLevel)
14+
{
15+
return target <= logLevel || target == LogLevel.None;
16+
}
17+
}

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSnapshotManagerDispatcher.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,21 @@
77
using System.Runtime.CompilerServices;
88
using System.Threading;
99
using System.Threading.Tasks;
10+
using Microsoft.CodeAnalysis.Razor.Logging;
1011
using Microsoft.VisualStudio.Threading;
1112

1213
namespace Microsoft.CodeAnalysis.Razor;
1314

14-
internal abstract class ProjectSnapshotManagerDispatcher(IErrorReporter errorReporter) : IDisposable
15+
internal abstract class ProjectSnapshotManagerDispatcher : IDisposable
1516
{
16-
private readonly CustomScheduler _scheduler = new(errorReporter);
17+
private readonly CustomScheduler _scheduler;
18+
private readonly ILogger _logger;
19+
20+
public ProjectSnapshotManagerDispatcher(ILoggerFactory loggerFactory)
21+
{
22+
_logger = loggerFactory.GetOrCreateLogger<ProjectSnapshotManagerDispatcher>();
23+
_scheduler = new(_logger);
24+
}
1725

1826
public TaskScheduler Scheduler => _scheduler;
1927
public bool IsRunningOnDispatcher => TaskScheduler.Current == _scheduler;
@@ -79,15 +87,15 @@ public void AssertRunningOnDispatcher([CallerMemberName] string? caller = null)
7987
private class CustomScheduler : TaskScheduler, IDisposable
8088
{
8189
private readonly AsyncQueue<Task> _taskQueue = new();
82-
private readonly IErrorReporter _errorReporter;
90+
private readonly ILogger _logger;
8391
private readonly CancellationTokenSource _disposeTokenSource;
8492

8593
public override int MaximumConcurrencyLevel => 1;
8694

87-
public CustomScheduler(IErrorReporter errorReporter)
95+
public CustomScheduler(ILogger logger)
8896
{
8997
_taskQueue = new();
90-
_errorReporter = errorReporter;
98+
_logger = logger;
9199
_disposeTokenSource = new();
92100

93101
_ = Task.Run(ProcessQueueAsync);
@@ -115,7 +123,7 @@ private async Task ProcessQueueAsync()
115123
catch (Exception ex)
116124
{
117125
// We don't want to crash our loop, so we report the exception and continue.
118-
_errorReporter.ReportError(ex);
126+
_logger.LogError(ex);
119127
}
120128
}
121129
}

0 commit comments

Comments
 (0)