Skip to content

Commit 617fbe8

Browse files
authored
Merge pull request #231 from WeihanLi/dev
1.0.73 preview 1
2 parents 8308b9a + 20727c7 commit 617fbe8

File tree

12 files changed

+234
-37
lines changed

12 files changed

+234
-37
lines changed

Directory.Packages.props

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<PackageVersion Include="System.Reflection.Emit" Version="4.7.0" />
1818
<PackageVersion Include="System.ComponentModel.Annotations" Version="5.0.0" />
1919
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
20-
<PackageVersion Include="Serilog" Version="4.0.2" />
20+
<PackageVersion Include="Serilog" Version="4.1.0" />
2121
</ItemGroup>
2222
<ItemGroup>
2323
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
@@ -31,11 +31,11 @@
3131
<PackageVersion Include="BenchmarkDotNet" Version="0.14.0" />
3232
</ItemGroup>
3333
<ItemGroup>
34-
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.11" />
35-
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.11" />
36-
<PackageVersion Include="Microsoft.Extensions.ObjectPool" Version="8.0.11" />
34+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
35+
<PackageVersion Include="Microsoft.EntityFrameworkCore.InMemory" Version="9.0.0" />
36+
<PackageVersion Include="Microsoft.Extensions.ObjectPool" Version="9.0.0" />
3737
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
38-
<PackageVersion Include="System.Data.SqlClient" Version="4.8.6" />
38+
<PackageVersion Include="System.Data.SqlClient" Version="4.9.0" />
3939
<PackageVersion Include="Dapper" Version="2.1.44" />
4040
</ItemGroup>
4141
<ItemGroup>

README.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,3 @@
2828
## Release Notes
2929

3030
See pull requests list for changes <https://github.com/WeihanLi/WeihanLi.Common/pulls?q=is%3Apr+is%3Amerged+base%3Amaster>
31-
32-
## Contact
33-
34-
Contact me if you need: <weihanli@outlook.com>

build/version.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<VersionMajor>1</VersionMajor>
44
<VersionMinor>0</VersionMinor>
5-
<VersionPatch>72</VersionPatch>
5+
<VersionPatch>73</VersionPatch>
66
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
77
</PropertyGroup>
88
</Project>

samples/DotNetCoreSample/LoggerTest.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ public static void MainTest()
3535
public static void MicrosoftLoggingTest()
3636
{
3737
var services = new ServiceCollection()
38-
.AddLogging(builder => builder.AddConsole())
38+
.AddLogging(builder =>
39+
// builder.AddConsole()
40+
builder.AddFile()
41+
)
3942
.AddSingleton(typeof(GenericTest<>))
4043
.BuildServiceProvider();
4144
services.GetRequiredService<GenericTest<int>>()
@@ -46,7 +49,7 @@ public static void MicrosoftLoggingTest()
4649
Console.WriteLine();
4750

4851
services = new ServiceCollection()
49-
.AddLogging(builder => builder.AddConsole().UseCustomGenericLogger(options => options.FullNamePredict = _ => true))
52+
.AddLogging(builder => builder.AddConsole().UseCustomGenericLogger())
5053
.AddSingleton(typeof(GenericTest<>))
5154
.BuildServiceProvider();
5255
services.GetRequiredService<GenericTest<int>>()

samples/DotNetCoreSample/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@
347347

348348
// InvokeHelper.TryInvoke(() => throw null, 3);
349349

350-
await InvokeHelper.TryInvokeAsync(TemplatingSample.MainTest);
350+
InvokeHelper.TryInvoke(LoggerTest.MicrosoftLoggingTest);
351351

352352
ConsoleHelper.ReadKeyWithPrompt("Press any key to exit");
353353

src/WeihanLi.Common/Extensions/JsonSerializeExtension.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ public static class JsonSerializeExtension
1010
/// <summary>
1111
/// DefaultSerializerSettings
1212
/// </summary>
13-
private static readonly JsonSerializerSettings DefaultSerializerSettings = GetDefaultSerializerSettings();
13+
internal static readonly JsonSerializerSettings DefaultSerializerSettings = GetDefaultSerializerSettings();
14+
internal static readonly JsonSerializerSettings WriteIndentedSerializerSettings =
15+
SerializerSettingsWith(s => s.Formatting = Formatting.Indented);
1416

1517
private static JsonSerializerSettings GetDefaultSerializerSettings() => new()
1618
{
@@ -46,13 +48,19 @@ public static string ToJson(this object? obj)
4648
public static string ToJson(this object obj, JsonSerializerSettings? serializerSettings)
4749
=> obj.ToJson(false, serializerSettings);
4850

51+
/// <summary>
52+
/// Serialize to Indented Json
53+
/// </summary>
54+
/// <param name="obj">object</param>
55+
/// <returns>To Indented Json</returns>
56+
public static string ToIndentedJson(this object obj) => obj.ToJson(false, WriteIndentedSerializerSettings);
57+
4958
/// <summary>
5059
/// 将object对象转换为Json数据
5160
/// </summary>
5261
/// <param name="obj">目标对象</param>
5362
/// <param name="isConvertToSingleQuotes">是否将双引号转成单引号</param>
54-
public static string ToJson(this object? obj, bool isConvertToSingleQuotes)
55-
=> obj.ToJson(isConvertToSingleQuotes, null);
63+
public static string ToJson(this object? obj, bool isConvertToSingleQuotes) => obj.ToJson(isConvertToSingleQuotes, null);
5664

5765
/// <summary>
5866
/// 将object对象转换为Json数据
@@ -62,7 +70,7 @@ public static string ToJson(this object? obj, bool isConvertToSingleQuotes)
6270
/// <param name="settings">serializerSettings</param>
6371
public static string ToJson(this object? obj, bool isConvertToSingleQuotes, JsonSerializerSettings? settings)
6472
{
65-
if (obj == null)
73+
if (obj is null)
6674
{
6775
return string.Empty;
6876
}

src/WeihanLi.Common/Helpers/DisposableHelper.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public void Dispose()
1414
}
1515

1616
public ValueTask DisposeAsync() =>
17-
#if NET6_0_OR_GREATER
17+
#if NET
1818
ValueTask.CompletedTask
1919
#else
2020
default
@@ -33,16 +33,18 @@ public ValueTask DisposeAsync() =>
3333
/// <param name="disposeAction">dispose delegate</param>
3434
public sealed class DisposableAction(Action? disposeAction) : IDisposable, IAsyncDisposable
3535
{
36+
private Action? _disposeAction = disposeAction;
37+
3638
public void Dispose()
3739
{
38-
Interlocked.Exchange(ref disposeAction, null)?.Invoke();
40+
Interlocked.Exchange(ref _disposeAction, null)?.Invoke();
3941
}
4042

4143
public ValueTask DisposeAsync()
4244
{
4345
Dispose();
4446
return
45-
#if NET6_0_OR_GREATER
47+
#if NET
4648
ValueTask.CompletedTask
4749
#else
4850
default
@@ -100,7 +102,7 @@ protected virtual ValueTask DisposeAsyncCore()
100102
{
101103
// dispose managed state in async way (managed objects)
102104
return
103-
#if NET6_0_OR_GREATER
105+
#if NET
104106
ValueTask.CompletedTask
105107
#else
106108
default

src/WeihanLi.Common/Helpers/JsonHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Copyright (c) Weihan Li. All rights reserved.
22
// Licensed under the Apache license.
3-
#if NET6_0_OR_GREATER
3+
#if NET
44

55
using System.Text.Encodings.Web;
66
using System.Text.Json;
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// Copyright (c) Weihan Li. All rights reserved.
2+
// Licensed under the Apache license.
3+
4+
using Microsoft.Extensions.Logging;
5+
using System.Collections.Concurrent;
6+
using System.Text;
7+
using WeihanLi.Common.Helpers;
8+
using WeihanLi.Extensions;
9+
10+
namespace WeihanLi.Common.Logging;
11+
12+
internal sealed class FileLoggingProcessor : DisposableBase
13+
{
14+
private readonly FileLoggingOptions _options;
15+
private readonly BlockingCollection<(string log, DateTimeOffset timestamp)> _messageQueue = [];
16+
private readonly Thread _outputThread;
17+
18+
private FileStream? _fileStream;
19+
private string? _logFileName;
20+
21+
public FileLoggingProcessor(FileLoggingOptions options)
22+
{
23+
if (!Directory.Exists(options.LogsDirectory))
24+
{
25+
try
26+
{
27+
Directory.CreateDirectory(options.LogsDirectory);
28+
}
29+
catch (Exception e)
30+
{
31+
throw new InvalidOperationException("Failed to create log directory", e);
32+
}
33+
}
34+
35+
_options = options;
36+
_outputThread = new Thread(ProcessLogQueue)
37+
{
38+
IsBackground = true,
39+
Priority = ThreadPriority.BelowNormal,
40+
Name = "FileLoggingProcessor"
41+
};
42+
_outputThread.Start();
43+
}
44+
45+
public void EnqueueLog(string log, DateTimeOffset dateTimeOffset)
46+
{
47+
if (_messageQueue.IsAddingCompleted) return;
48+
49+
try
50+
{
51+
_messageQueue.Add((log, dateTimeOffset));
52+
}
53+
catch (InvalidOperationException) { }
54+
}
55+
56+
protected override void Dispose(bool disposing)
57+
{
58+
if (!disposing) return;
59+
60+
_messageQueue.CompleteAdding();
61+
_fileStream?.Flush();
62+
_fileStream?.Dispose();
63+
_messageQueue.Dispose();
64+
}
65+
66+
private void ProcessLogQueue()
67+
{
68+
try
69+
{
70+
foreach (var message in _messageQueue.GetConsumingEnumerable())
71+
{
72+
WriteLoggingEvent(message.log, message.timestamp);
73+
}
74+
}
75+
catch
76+
{
77+
try
78+
{
79+
_messageQueue.CompleteAdding();
80+
}
81+
catch
82+
{
83+
// ignored
84+
}
85+
}
86+
}
87+
88+
private void WriteLoggingEvent(string log, DateTimeOffset timestamp)
89+
{
90+
var fileName = _options.FileFormat.Replace("{date}", timestamp.ToString("yyyyMMdd"));
91+
var fileInfo = new FileInfo(Path.Combine(_options.LogsDirectory, fileName));
92+
93+
try
94+
{
95+
var previousFileName = Interlocked.CompareExchange(ref _logFileName, fileInfo.FullName, _logFileName);
96+
if (_logFileName != previousFileName)
97+
{
98+
// file name changed
99+
var fs = File.OpenWrite(fileInfo.FullName);
100+
var originalWriter = Interlocked.Exchange(ref _fileStream, fs);
101+
if (originalWriter is not null)
102+
{
103+
originalWriter.Flush();
104+
originalWriter.Dispose();
105+
}
106+
}
107+
108+
Guard.NotNull(_fileStream);
109+
var bytes = Encoding.UTF8.GetBytes(log);
110+
_fileStream.Write(bytes, 0, bytes.Length);
111+
if (SecurityHelper.Random.CoinToss())
112+
{
113+
_fileStream.Flush();
114+
}
115+
}
116+
catch(Exception ex)
117+
{
118+
Console.WriteLine($@"Error when trying to log to file({fileInfo.FullName}) \n" + log + Environment.NewLine + ex);
119+
}
120+
}
121+
}

src/WeihanLi.Common/Logging/LoggerGeneric.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace WeihanLi.Common.Logging;
66

77
public sealed class GenericLoggerOptions
88
{
9-
public Func<Type, bool>? FullNamePredict { get; set; }
9+
public Func<Type, bool>? FullNamePredict { get; set; } = _ => true;
1010
}
1111

1212
internal sealed class GenericLogger<T> : ILogger<T>

0 commit comments

Comments
 (0)