添加日志系统
This commit is contained in:
parent
4f021d5a3e
commit
d784357fe5
@ -18,6 +18,9 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="NativeFileDialogSharp" Version="0.5.0" />
|
<PackageReference Include="NativeFileDialogSharp" Version="0.5.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
|
||||||
|
<PackageReference Include="Serilog" Version="4.3.0" />
|
||||||
|
<PackageReference Include="Serilog.Enrichers.Thread" Version="4.0.0" />
|
||||||
|
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
|
||||||
<PackageReference Include="TMDbLib" Version="2.3.0" />
|
<PackageReference Include="TMDbLib" Version="2.3.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
164
Src/Log/Log.cs
Normal file
164
Src/Log/Log.cs
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
using Serilog.Sinks.SystemConsole.Themes;
|
||||||
|
|
||||||
|
namespace BangumiRenamer;
|
||||||
|
|
||||||
|
using Serilog;
|
||||||
|
using Serilog.Core;
|
||||||
|
using Serilog.Events;
|
||||||
|
|
||||||
|
public sealed class Log
|
||||||
|
{
|
||||||
|
private static readonly Lazy<Log> _instance = new Lazy<Log>(() => new Log());
|
||||||
|
private Logger _logger;
|
||||||
|
private bool _isInitialized = false;
|
||||||
|
private readonly object _lockObject = new object();
|
||||||
|
|
||||||
|
public static Log Instance => _instance.Value;
|
||||||
|
public static ILogger Logger => Instance._logger;
|
||||||
|
|
||||||
|
private Log() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化日志配置
|
||||||
|
/// </summary>
|
||||||
|
public static void Initialize(Action<LoggerConfiguration> configure = null)
|
||||||
|
{
|
||||||
|
Instance.InitializeInternal(configure);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeInternal(Action<LoggerConfiguration> configure = null)
|
||||||
|
{
|
||||||
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
if (_isInitialized)
|
||||||
|
{
|
||||||
|
Warn("日志系统已经初始化过");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = new LoggerConfiguration()
|
||||||
|
.MinimumLevel.Debug()
|
||||||
|
.WriteTo.Console(
|
||||||
|
outputTemplate: "[{Timestamp:HH:mm:ss}][{Level:u3}] {Message:lj}{NewLine}{Exception}",
|
||||||
|
theme: AnsiConsoleTheme.Sixteen
|
||||||
|
)
|
||||||
|
.Enrich.FromLogContext()
|
||||||
|
.Enrich.WithProperty("Application", "MyApp")
|
||||||
|
.Enrich.WithThreadId();
|
||||||
|
|
||||||
|
configure?.Invoke(config);
|
||||||
|
|
||||||
|
_logger = config.CreateLogger();
|
||||||
|
_isInitialized = true;
|
||||||
|
|
||||||
|
Info("日志系统初始化完成");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 静态快捷方法 - 使用更简短的名称
|
||||||
|
public static void Debug(string message, params object[] properties)
|
||||||
|
=> Instance.EnsureAndLog(LogEventLevel.Debug, message, properties);
|
||||||
|
|
||||||
|
public static void Info(string message, params object[] properties)
|
||||||
|
=> Instance.EnsureAndLog(LogEventLevel.Information, message, properties);
|
||||||
|
|
||||||
|
public static void Warn(string message, params object[] properties)
|
||||||
|
=> Instance.EnsureAndLog(LogEventLevel.Warning, message, properties);
|
||||||
|
|
||||||
|
public static void Error(string message, params object[] properties)
|
||||||
|
=> Instance.EnsureAndLog(LogEventLevel.Error, message, properties);
|
||||||
|
|
||||||
|
public static void Error(Exception ex, string message, params object[] properties)
|
||||||
|
=> Instance.EnsureAndLog(ex, message, properties);
|
||||||
|
|
||||||
|
public static void Fatal(string message, params object[] properties)
|
||||||
|
=> Instance.EnsureAndLog(LogEventLevel.Fatal, message, properties);
|
||||||
|
|
||||||
|
// 实例方法
|
||||||
|
private void EnsureAndLog(LogEventLevel level, string message, object[] properties)
|
||||||
|
{
|
||||||
|
EnsureInitialized();
|
||||||
|
_logger.Write(level, message, properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnsureAndLog(Exception ex, string message, object[] properties)
|
||||||
|
{
|
||||||
|
EnsureInitialized();
|
||||||
|
_logger.Error(ex, message, properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 为特定类型创建Logger
|
||||||
|
/// </summary>
|
||||||
|
public static ILogger ForContext<T>()
|
||||||
|
{
|
||||||
|
Instance.EnsureInitialized();
|
||||||
|
return Instance._logger.ForContext<T>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 为特定源创建Logger
|
||||||
|
/// </summary>
|
||||||
|
public static ILogger ForContext(string source)
|
||||||
|
{
|
||||||
|
Instance.EnsureInitialized();
|
||||||
|
return Instance._logger.ForContext("SourceContext", source);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始一个带属性的日志上下文
|
||||||
|
/// </summary>
|
||||||
|
public static IDisposable BeginScope(string propertyName, object value)
|
||||||
|
{
|
||||||
|
Instance.EnsureInitialized();
|
||||||
|
return Serilog.Context.LogContext.PushProperty(propertyName, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始多个属性的日志上下文
|
||||||
|
/// </summary>
|
||||||
|
public static IDisposable BeginScope(params (string Name, object Value)[] properties)
|
||||||
|
{
|
||||||
|
Instance.EnsureInitialized();
|
||||||
|
var disposables = properties.Select(p =>
|
||||||
|
Serilog.Context.LogContext.PushProperty(p.Name, p.Value)).ToArray();
|
||||||
|
return new DisposableGroup(disposables);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 关闭并刷新日志
|
||||||
|
/// </summary>
|
||||||
|
public static void Close()
|
||||||
|
{
|
||||||
|
Instance._logger?.Dispose();
|
||||||
|
Serilog.Log.CloseAndFlush();
|
||||||
|
Instance._isInitialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnsureInitialized()
|
||||||
|
{
|
||||||
|
if (!_isInitialized)
|
||||||
|
{
|
||||||
|
InitializeInternal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 辅助类:用于同时释放多个IDisposable
|
||||||
|
private class DisposableGroup : IDisposable
|
||||||
|
{
|
||||||
|
private readonly IDisposable[] _disposables;
|
||||||
|
|
||||||
|
public DisposableGroup(IDisposable[] disposables)
|
||||||
|
{
|
||||||
|
_disposables = disposables;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
foreach (var disposable in _disposables)
|
||||||
|
{
|
||||||
|
disposable?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -9,7 +9,7 @@ public class EmbededResourceViewer
|
|||||||
var names = ResourceLoader.GetAllResNames();
|
var names = ResourceLoader.GetAllResNames();
|
||||||
foreach (var name in names)
|
foreach (var name in names)
|
||||||
{
|
{
|
||||||
Console.WriteLine(name);
|
Log.Info(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,7 +64,7 @@ public static class FolderCloner
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Clone失败 {ex.Message}");
|
Log.Error(ex, "Clone");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,7 +53,7 @@ public static class ShowCompletionChecker
|
|||||||
var checkPath = dir.Path;
|
var checkPath = dir.Path;
|
||||||
|
|
||||||
var shows = FindShows(checkPath);
|
var shows = FindShows(checkPath);
|
||||||
Console.WriteLine($"Total Shows: {shows.Count}");
|
Log.Info($"Total Shows: {shows.Count}");
|
||||||
|
|
||||||
var client = new TMDbClient(
|
var client = new TMDbClient(
|
||||||
apiKey: Config.Default.Get<TMDBConfig>().ApiKey ,
|
apiKey: Config.Default.Get<TMDBConfig>().ApiKey ,
|
||||||
@ -69,7 +69,7 @@ public static class ShowCompletionChecker
|
|||||||
var info = result.Results.FirstOrDefault();
|
var info = result.Results.FirstOrDefault();
|
||||||
if (info == null)
|
if (info == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"找不到对应的TV:{t.title}");
|
Log.Error($"找不到对应的TV:{t.title}");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
foreach (var session in t.sessions)
|
foreach (var session in t.sessions)
|
||||||
@ -77,7 +77,7 @@ public static class ShowCompletionChecker
|
|||||||
var sessionInfo = client.GetTvSeasonAsync(info.Id, session.id).Result;
|
var sessionInfo = client.GetTvSeasonAsync(info.Id, session.id).Result;
|
||||||
if (sessionInfo == null)
|
if (sessionInfo == null)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"季度对不上,可能找错了:{t.title} -> {info.OriginalName}");
|
Log.Error($"季度对不上,可能找错了:{t.title} -> {info.OriginalName}");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
foreach (var episode in sessionInfo.Episodes)
|
foreach (var episode in sessionInfo.Episodes)
|
||||||
@ -90,6 +90,6 @@ public static class ShowCompletionChecker
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Console.Write(output);
|
Log.Info(output.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user