Skip to content

Commit baa7dd8

Browse files
Merge pull request #204 from snakefoot/master
CallSite should recognize all Microsoft.Extensions.Logging.ILogger
2 parents ee13444 + d5fe7c7 commit baa7dd8

File tree

10 files changed

+172
-66
lines changed

10 files changed

+172
-66
lines changed

build.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ $versionProduct = $versionPrefix;
99
if (-Not $versionSuffix.Equals(""))
1010
{ $versionProduct = $versionProduct + "-" + $versionSuffix }
1111

12-
msbuild /t:Restore,Pack .\src\NLog.Extensions.Logging\ /p:targetFrameworks='"net451;net461;netstandard1.5;netstandard2.0;uap10.0"' /p:VersionPrefix=$versionPrefix /p:VersionSuffix=$versionSuffix /p:FileVersion=$versionFile /p:ProductVersion=$versionProduct /p:Configuration=Release /p:IncludeSymbols=true /p:PackageOutputPath=..\..\artifacts /verbosity:minimal
12+
msbuild /t:Restore,Pack .\src\NLog.Extensions.Logging\ /p:targetFrameworks='"net451;net461;netstandard1.3;netstandard1.5;netstandard2.0"' /p:VersionPrefix=$versionPrefix /p:VersionSuffix=$versionSuffix /p:FileVersion=$versionFile /p:ProductVersion=$versionProduct /p:Configuration=Release /p:IncludeSymbols=true /p:PackageOutputPath=..\..\artifacts /verbosity:minimal
1313
if (-Not $LastExitCode -eq 0)
1414
{ exit $LastExitCode }
1515

examples/NetCore2/ConsoleExample/Program.cs

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,28 @@ class Program
99
{
1010
static void Main(string[] args)
1111
{
12-
var servicesProvider = BuildDi();
13-
var runner = servicesProvider.GetRequiredService<Runner>();
14-
15-
runner.DoAction("Action1");
16-
17-
Console.WriteLine("Press ANY key to exit");
18-
Console.ReadLine();
19-
20-
NLog.LogManager.Shutdown(); // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
12+
var logger = NLog.LogManager.LoadConfiguration("nlog.config").GetCurrentClassLogger();
13+
try
14+
{
15+
var servicesProvider = BuildDi();
16+
var runner = servicesProvider.GetRequiredService<Runner>();
17+
18+
runner.DoAction("Action1");
19+
20+
Console.WriteLine("Press ANY key to exit");
21+
Console.ReadLine();
22+
}
23+
catch (Exception ex)
24+
{
25+
//NLog: catch setup errors
26+
logger.Error(ex, "Stopped program because of exception");
27+
throw;
28+
}
29+
finally
30+
{
31+
// Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
32+
NLog.LogManager.Shutdown();
33+
}
2134
}
2235

2336

@@ -38,8 +51,6 @@ private static IServiceProvider BuildDi()
3851

3952
//configure NLog
4053
loggerFactory.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true });
41-
loggerFactory.ConfigureNLog("nlog.config");
42-
4354
return serviceProvider;
4455
}
4556
}
@@ -58,7 +69,5 @@ public void DoAction(string name)
5869
{
5970
_logger.LogDebug(20, "Doing hard work! {Action}", name);
6071
}
61-
62-
6372
}
6473
}

examples/NetCore2/ConsoleExample/nlog.config

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,17 @@
66
internalLogFile="c:\temp\console-example-internal.log"
77
internalLogLevel="Info" >
88

9-
109
<!-- the targets to write to -->
1110
<targets>
1211
<!-- write logs to file -->
13-
<target xsi:type="File" name="target1" fileName="c:\temp\console-example.log"
14-
layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}" />
15-
<target xsi:type="Console" name="target2"
16-
layout="${date}|${level:uppercase=true}|${message} ${exception}|${logger}|${all-event-properties}" />
17-
18-
12+
<target xsi:type="File" name="fileTarget" fileName="c:\temp\console-example.log"
13+
layout="${date}|${level:uppercase=true}|${message} ${exception:format=tostring}|${logger}|${all-event-properties}" />
14+
<target xsi:type="Console" name="consoleTarget"
15+
layout="${date}|${level:uppercase=true}|${message} ${exception:format=tostring}|${logger}|${all-event-properties}" />
1916
</targets>
2017

2118
<!-- rules to map from logger name to target -->
2219
<rules>
23-
<logger name="*" minlevel="Trace" writeTo="target1,target2" />
24-
20+
<logger name="*" minlevel="Trace" writeTo="fileTarget,consoleTarget" />
2521
</rules>
2622
</nlog>

src/NLog.Extensions.Logging/Extensions/ConfigureExtensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ private static void SafeAddHiddenAssembly(string assemblyName, bool logOnExcepti
108108
/// <param name="loggerFactory"></param>
109109
/// <param name="configFileRelativePath">relative path to NLog configuration file.</param>
110110
/// <returns>Current configuration for chaining.</returns>
111+
[Obsolete("Instead use NLog.LogManager.LoadConfiguration()")]
111112
public static LoggingConfiguration ConfigureNLog(this ILoggerFactory loggerFactory, string configFileRelativePath)
112113
{
113114
ConfigureHiddenAssemblies();
@@ -120,6 +121,7 @@ public static LoggingConfiguration ConfigureNLog(this ILoggerFactory loggerFacto
120121
/// <param name="loggerFactory"></param>
121122
/// <param name="config">New NLog config.</param>
122123
/// <returns>Current configuration for chaining.</returns>
124+
[Obsolete("Instead assign property NLog.LogManager.Configuration")]
123125
public static LoggingConfiguration ConfigureNLog(this ILoggerFactory loggerFactory, LoggingConfiguration config)
124126
{
125127
ConfigureHiddenAssemblies();

src/NLog.Extensions.Logging/Logging/NLogLogger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void Log<TState>(Microsoft.Extensions.Logging.LogLevel logLevel, EventId
5151
CaptureMessageProperties(eventInfo, state);
5252
}
5353

54-
_logger.Log(eventInfo);
54+
_logger.Log(typeof(Microsoft.Extensions.Logging.ILogger), eventInfo);
5555
}
5656

5757

src/NLog.Extensions.Logging/NLog.Extensions.Logging.csproj

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
44

5-
<TargetFrameworks>net451;net461;netstandard1.5;netstandard2.0</TargetFrameworks>
5+
<TargetFrameworks>net451;net461;netstandard1.3;netstandard1.5;netstandard2.0</TargetFrameworks>
66
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
77
<GenerateDocumentationFile>true</GenerateDocumentationFile>
88

@@ -43,6 +43,11 @@ rc3: Support for .NET 4.6.1, support for message templates .NET standard 1.5+ an
4343
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
4444
<DefineConstants>$(DefineConstants);NETCORE1_0</DefineConstants>
4545
</PropertyGroup>
46+
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
47+
<Title>NLog.Extensions.Logging for NetStandard 1.3</Title>
48+
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
49+
<DefineConstants>$(DefineConstants);NETCORE1_0</DefineConstants>
50+
</PropertyGroup>
4651
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard1.5' ">
4752
<Title>NLog.Extensions.Logging for NetStandard 1.5</Title>
4853
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
@@ -51,20 +56,8 @@ rc3: Support for .NET 4.6.1, support for message templates .NET standard 1.5+ an
5156
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' ">
5257
<Title>NLog.Extensions.Logging for NetStandard 2.0</Title>
5358
</PropertyGroup>
54-
<PropertyGroup Condition=" '$(TargetFramework)' == 'uap10.0' ">
55-
<Title>NLog.Extensions.Logging for UWP</Title>
56-
<NugetTargetMoniker>UAP,Version=v10.0</NugetTargetMoniker>
57-
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
58-
<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
59-
<TargetFrameworkIdentifier>.NETCore</TargetFrameworkIdentifier>
60-
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
61-
<TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>
62-
<TargetPlatformVersion Condition=" '$(TargetPlatformVersion)' == '' ">10.0.15083.0</TargetPlatformVersion>
63-
<TargetPlatformMinVersion>10.0.10240.0</TargetPlatformMinVersion>
64-
<DefineConstants>$(DefineConstants);NETCORE1_0</DefineConstants>
65-
</PropertyGroup>
6659
<ItemGroup>
67-
<PackageReference Include="NLog" Version="[4.5.0-rc06,5)" />
60+
<PackageReference Include="NLog" Version="[4.5.0-rc07,5)" />
6861
</ItemGroup>
6962
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
7063
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.0.2" />
@@ -76,7 +69,7 @@ rc3: Support for .NET 4.6.1, support for message templates .NET standard 1.5+ an
7669
<Reference Include="System" />
7770
<Reference Include="Microsoft.CSharp" />
7871
</ItemGroup>
79-
<ItemGroup Condition=" '$(TargetFramework)' == 'uap10.0' ">
72+
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.3' ">
8073
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="1.0.2" />
8174
</ItemGroup>
8275
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.5' ">

test/CustomLoggerCallSiteTest.cs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using System;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Microsoft.Extensions.Logging;
4+
using Xunit;
5+
6+
namespace NLog.Extensions.Logging.Tests
7+
{
8+
public class CustomLoggerCallSiteTest : NLogTestBase
9+
{
10+
[Fact]
11+
public void TestCallSiteSayHello()
12+
{
13+
ConfigureServiceProvider<CustomLoggerCallSiteTestRunner>((s) => s.AddSingleton(typeof(ILogger<>), typeof(SameAssemblyLogger<>)));
14+
var runner = GetRunner<CustomLoggerCallSiteTestRunner>();
15+
16+
var target = new NLog.Targets.MemoryTarget() { Layout = "${callsite}|${message}" };
17+
NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target);
18+
runner.SayHello();
19+
Assert.Single(target.Logs);
20+
Assert.Contains("SayHello", target.Logs[0]);
21+
Assert.Contains("stuff", target.Logs[0]);
22+
}
23+
24+
public class SameAssemblyLogger<T> : ILogger<T>
25+
{
26+
private readonly Microsoft.Extensions.Logging.ILogger _logger;
27+
28+
public SameAssemblyLogger(ILoggerFactory loggerFactory)
29+
{
30+
_logger = loggerFactory.CreateLogger<T>();
31+
}
32+
33+
public void Log<TState>(Microsoft.Extensions.Logging.LogLevel logLevel, EventId eventId, TState state, Exception exception,
34+
Func<TState, Exception, string> formatter)
35+
{
36+
string Formatter(TState innserState, Exception innerException)
37+
{
38+
// additional logic for all providers goes here
39+
var message = formatter(innserState, innerException) ?? string.Empty;
40+
return message + " additional stuff in here";
41+
}
42+
43+
_logger.Log(logLevel, eventId, state, exception, Formatter);
44+
}
45+
46+
public bool IsEnabled(Microsoft.Extensions.Logging.LogLevel logLevel)
47+
{
48+
return _logger.IsEnabled(logLevel);
49+
}
50+
51+
public IDisposable BeginScope<TState>(TState state)
52+
{
53+
return _logger.BeginScope(state);
54+
}
55+
}
56+
57+
public class CustomLoggerCallSiteTestRunner
58+
{
59+
private readonly ILogger<CustomLoggerCallSiteTestRunner> _logger;
60+
61+
public CustomLoggerCallSiteTestRunner(ILogger<CustomLoggerCallSiteTestRunner> logger)
62+
{
63+
_logger = logger;
64+
}
65+
66+
public void SayHello()
67+
{
68+
_logger.LogInformation("Hello");
69+
}
70+
}
71+
72+
}
73+
}

test/LoggerTests.cs

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@
88

99
namespace NLog.Extensions.Logging.Tests
1010
{
11-
public class LoggerTests
11+
public class LoggerTests : NLogTestBase
1212
{
13-
private static Lazy<IServiceProvider> ServiceProvider = new Lazy<IServiceProvider>(BuildDi);
14-
1513
public LoggerTests()
1614
{
1715
var target = GetTarget();
@@ -144,7 +142,7 @@ public void TestExceptionWithNullMessage(Microsoft.Extensions.Logging.LogLevel l
144142
[InlineData(Microsoft.Extensions.Logging.LogLevel.Warning, "NLog.Extensions.Logging.Tests.LoggerTests.Runner|WARN|message |20")]
145143
public void TestMessageWithNullException(Microsoft.Extensions.Logging.LogLevel logLevel, string expectedLogMessage)
146144
{
147-
GetRunner().Log(logLevel, 20, null, "message");
145+
GetRunner<Runner>().Log(logLevel, 20, null, "message");
148146

149147
var target = GetTarget();
150148
Assert.Equal(expectedLogMessage, target.Logs.FirstOrDefault());
@@ -180,43 +178,25 @@ public void TestWithEmptyMessageAndNullException(Microsoft.Extensions.Logging.Lo
180178
Assert.Equal(expectedLogMessage, target.Logs.FirstOrDefault());
181179
}
182180

183-
private static Runner GetRunner()
184-
{
185-
var serviceProvider = ServiceProvider.Value;
186-
187-
// Start program
188-
var runner = serviceProvider.GetRequiredService<Runner>();
189-
return runner;
190-
}
191-
192181
private static MemoryTarget GetTarget()
193182
{
194183
var target = LogManager.Configuration.FindTargetByName<MemoryTarget>("target1");
195184
return target;
196185
}
197186

198-
private static IServiceProvider BuildDi()
187+
private Runner GetRunner()
199188
{
200-
var services = new ServiceCollection();
201-
202-
services.AddTransient<Runner>();
203-
services.AddSingleton<ILoggerFactory, LoggerFactory>();
204-
205-
var serviceProvider = services.BuildServiceProvider();
206-
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
207-
208-
loggerFactory.AddNLog(new NLogProviderOptions() { CaptureMessageTemplates = true, CaptureMessageProperties = true });
209-
loggerFactory.ConfigureNLog("nlog.config");
210-
return serviceProvider;
189+
base.ConfigureServiceProvider<Runner>((s) => LogManager.LoadConfiguration("nlog.config"));
190+
return base.GetRunner<Runner>();
211191
}
212192

213193
public class Runner
214194
{
215195
private readonly ILogger<Runner> _logger;
216196

217-
public Runner(ILoggerFactory fac)
197+
public Runner(ILogger<Runner> logger)
218198
{
219-
_logger = fac.CreateLogger<Runner>();
199+
_logger = logger;
220200
}
221201

222202
public void LogDebugWithId()

test/NLogTestBase.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Logging;
6+
7+
namespace NLog.Extensions.Logging.Tests
8+
{
9+
public class NLogTestBase
10+
{
11+
IServiceProvider _serviceProvider;
12+
13+
protected IServiceProvider ConfigureServiceProvider<T>(Action<ServiceCollection> configureServices = null, NLogProviderOptions options = null) where T : class
14+
{
15+
if (_serviceProvider == null)
16+
{
17+
var services = new ServiceCollection();
18+
19+
services.AddTransient<T>();
20+
services.AddSingleton<ILoggerFactory, LoggerFactory>();
21+
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
22+
configureServices?.Invoke(services);
23+
24+
_serviceProvider = services.BuildServiceProvider();
25+
26+
var loggerFactory = _serviceProvider.GetRequiredService<ILoggerFactory>();
27+
loggerFactory.AddNLog(options ?? new NLogProviderOptions() { CaptureMessageTemplates = true, CaptureMessageProperties = true });
28+
}
29+
return _serviceProvider;
30+
}
31+
32+
protected T GetRunner<T>(NLogProviderOptions options = null) where T : class
33+
{
34+
// Start program
35+
var runner = ConfigureServiceProvider<T>(null, options).GetRequiredService<T>();
36+
return runner;
37+
}
38+
}
39+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.Reflection;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
5+
// General Information about an assembly is controlled through the following
6+
// set of attributes. Change these attribute values to modify the information
7+
// associated with an assembly.
8+
9+
// Setting ComVisible to false makes the types in this assembly not visible
10+
// to COM components. If you need to access a type in this assembly from
11+
// COM, set the ComVisible attribute to true on that type.
12+
[assembly: ComVisible(false)]
13+
14+
[assembly: Xunit.CollectionBehavior(DisableTestParallelization = true)]

0 commit comments

Comments
 (0)