Skip to content

Commit 7985fb7

Browse files
committed
refactor logger creation to use type-utils for improved type name handling
1 parent 88e36ff commit 7985fb7

File tree

3 files changed

+73
-7
lines changed

3 files changed

+73
-7
lines changed

Sources/Falko.ZeroLogger.Microsoft.Logging/Loggers/MicrosoftLogger{T}.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,11 @@ public sealed class MicrosoftLogger<TTarget> : ILogger<TTarget>
66
{
77
private readonly IMicrosoftLogger _logger;
88

9+
// ReSharper disable once ConvertToPrimaryConstructor
910
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1011
public MicrosoftLogger(IMicrosoftLoggerFactory loggerFactory)
1112
{
12-
var loggerName = typeof(TTarget).FullName;
13-
14-
ArgumentException.ThrowIfNullOrEmpty(loggerName);
15-
16-
_logger = loggerFactory.CreateLogger(loggerName);
13+
_logger = loggerFactory.CreateLogger<TTarget>();
1714
}
1815

1916
public void Log<TState>

Sources/Falko.ZeroLogger/Factories/LoggerFactory.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Logging.Loggers;
22
using System.Logging.Runtimes;
3+
using System.Logging.Utils;
34

45
namespace System.Logging.Factories;
56

@@ -17,7 +18,7 @@ public Logger CreateLogger(string name)
1718
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1819
public Logger CreateLogger<T>() where T : notnull
1920
{
20-
var name = typeof(T).FullName;
21+
var name = TypeUtils.GetTypeName(typeof(T));
2122

2223
ArgumentNullException.ThrowIfNull(name);
2324

@@ -29,7 +30,7 @@ public Logger CreateLogger(Type type)
2930
{
3031
ArgumentNullException.ThrowIfNull(type);
3132

32-
var name = type.FullName;
33+
var name = TypeUtils.GetTypeName(type);
3334

3435
ArgumentNullException.ThrowIfNull(name);
3536

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using System.Logging.Builders;
2+
3+
namespace System.Logging.Utils;
4+
5+
internal static class TypeUtils
6+
{
7+
[MethodImpl(MethodImplOptions.NoInlining)]
8+
public static string GetTypeName(Type type)
9+
{
10+
var nameBuilder = new ValueStringBuilder(stackalloc char[256]);
11+
12+
try
13+
{
14+
GetTypeName(type, ref nameBuilder);
15+
return nameBuilder.ToString();
16+
}
17+
finally
18+
{
19+
nameBuilder.Dispose();
20+
}
21+
}
22+
23+
[MethodImpl(MethodImplOptions.NoInlining)]
24+
private static void GetTypeName(Type type, ref ValueStringBuilder nameBuilder)
25+
{
26+
var name = type.FullName ?? type.Name;
27+
var nameLength = name.Length;
28+
29+
if (type.IsGenericType is false)
30+
{
31+
nameBuilder.Ensure(nameLength);
32+
nameBuilder.Append(name);
33+
34+
return;
35+
}
36+
37+
var index = name.IndexOf('`');
38+
39+
if (index <= 0)
40+
{
41+
nameBuilder.Ensure(nameLength);
42+
nameBuilder.Append(name);
43+
44+
return;
45+
}
46+
47+
scoped ReadOnlySpan<char> shortName = name.AsSpan(0, index);
48+
49+
nameBuilder.Ensure(shortName.Length + 2);
50+
nameBuilder.Append(shortName);
51+
nameBuilder.Append('<');
52+
53+
scoped ReadOnlySpan<Type> genericArguments = type.GetGenericArguments();
54+
55+
for (var i = 0; i < genericArguments.Length; i++)
56+
{
57+
if (i > 0)
58+
{
59+
nameBuilder.Append(',');
60+
nameBuilder.Append(' ');
61+
}
62+
63+
GetTypeName(genericArguments[i], ref nameBuilder);
64+
}
65+
66+
nameBuilder.Append('>');
67+
}
68+
}

0 commit comments

Comments
 (0)