From 66756b555f089a18a55d4782689c5090ff21abdd Mon Sep 17 00:00:00 2001 From: limil Date: Sat, 8 Nov 2025 15:10:44 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Src/Config/Attribute/ConfigItemAttribute.cs | 11 - Src/Config/IConfigItem.cs | 3 - Src/{Config => }/ConfigSchema/ProxyConfig.cs | 14 +- Src/{Config => }/ConfigSchema/TMDBConfig.cs | 14 +- Src/Tools/FolderCloner.cs | 1 + Src/Tools/ShowCompletionChecker.cs | 5 +- Src/{Config => Utils}/Config.cs | 15 +- Src/{Log => Utils}/Log.cs | 324 +++++++++---------- 8 files changed, 196 insertions(+), 191 deletions(-) delete mode 100644 Src/Config/Attribute/ConfigItemAttribute.cs delete mode 100644 Src/Config/IConfigItem.cs rename Src/{Config => }/ConfigSchema/ProxyConfig.cs (56%) rename Src/{Config => }/ConfigSchema/TMDBConfig.cs (77%) rename Src/{Config => Utils}/Config.cs (90%) rename Src/{Log => Utils}/Log.cs (96%) diff --git a/Src/Config/Attribute/ConfigItemAttribute.cs b/Src/Config/Attribute/ConfigItemAttribute.cs deleted file mode 100644 index 4d25ff9..0000000 --- a/Src/Config/Attribute/ConfigItemAttribute.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace BangumiRenamer.Config; - -public class ConfigItemAttribute : System.Attribute -{ - public string Name; - - public ConfigItemAttribute(string name) - { - Name = name; - } -} \ No newline at end of file diff --git a/Src/Config/IConfigItem.cs b/Src/Config/IConfigItem.cs deleted file mode 100644 index b0c4aa5..0000000 --- a/Src/Config/IConfigItem.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace BangumiRenamer.Config; - -public interface IConfigItem; \ No newline at end of file diff --git a/Src/Config/ConfigSchema/ProxyConfig.cs b/Src/ConfigSchema/ProxyConfig.cs similarity index 56% rename from Src/Config/ConfigSchema/ProxyConfig.cs rename to Src/ConfigSchema/ProxyConfig.cs index 0e22646..ad4b0de 100644 --- a/Src/Config/ConfigSchema/ProxyConfig.cs +++ b/Src/ConfigSchema/ProxyConfig.cs @@ -1,7 +1,9 @@ -namespace BangumiRenamer.Config; - -[ConfigItem("Proxy")] -public class ProxyConfig : IConfigItem -{ - public string HttpProxy = ""; +using BangumiRenamer.Utils; + +namespace BangumiRenamer.ConfigSchema; + +[ConfigItem("Proxy")] +public class ProxyConfig : IConfigItem +{ + public string HttpProxy = ""; } \ No newline at end of file diff --git a/Src/Config/ConfigSchema/TMDBConfig.cs b/Src/ConfigSchema/TMDBConfig.cs similarity index 77% rename from Src/Config/ConfigSchema/TMDBConfig.cs rename to Src/ConfigSchema/TMDBConfig.cs index 1943e7d..90ef023 100644 --- a/Src/Config/ConfigSchema/TMDBConfig.cs +++ b/Src/ConfigSchema/TMDBConfig.cs @@ -1,7 +1,9 @@ -namespace BangumiRenamer.Config; - -[ConfigItem("TMDB")] -public class TMDBConfig : IConfigItem -{ - public string ApiKey = ""; +using BangumiRenamer.Utils; + +namespace BangumiRenamer.Config; + +[ConfigItem("TMDB")] +public class TMDBConfig : IConfigItem +{ + public string ApiKey = ""; } \ No newline at end of file diff --git a/Src/Tools/FolderCloner.cs b/Src/Tools/FolderCloner.cs index a49acce..da3b8d4 100644 --- a/Src/Tools/FolderCloner.cs +++ b/Src/Tools/FolderCloner.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using BangumiRenamer.Utils; using NativeFileDialogSharp; namespace BangumiRenamer.Tools; diff --git a/Src/Tools/ShowCompletionChecker.cs b/Src/Tools/ShowCompletionChecker.cs index b48751a..f33d296 100644 --- a/Src/Tools/ShowCompletionChecker.cs +++ b/Src/Tools/ShowCompletionChecker.cs @@ -1,6 +1,9 @@ +using BangumiRenamer.Config; +using BangumiRenamer.ConfigSchema; + namespace BangumiRenamer.Tools; -using Config; +using Utils; using TMDbLib.Client; using Data; using NativeFileDialogSharp; diff --git a/Src/Config/Config.cs b/Src/Utils/Config.cs similarity index 90% rename from Src/Config/Config.cs rename to Src/Utils/Config.cs index 498063e..d785809 100644 --- a/Src/Config/Config.cs +++ b/Src/Utils/Config.cs @@ -1,8 +1,21 @@ -namespace BangumiRenamer.Config; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +namespace BangumiRenamer.Utils; + +public class ConfigItemAttribute : System.Attribute +{ + public string Name; + + public ConfigItemAttribute(string name) + { + Name = name; + } +} + +public interface IConfigItem; + public class Config(string configPath) { private static readonly Lazy _lazy = new (() => diff --git a/Src/Log/Log.cs b/Src/Utils/Log.cs similarity index 96% rename from Src/Log/Log.cs rename to Src/Utils/Log.cs index d8e3583..274760c 100644 --- a/Src/Log/Log.cs +++ b/Src/Utils/Log.cs @@ -1,164 +1,162 @@ -using Serilog.Sinks.SystemConsole.Themes; - -namespace BangumiRenamer; - -using Serilog; -using Serilog.Core; -using Serilog.Events; - -public sealed class Log -{ - private static readonly Lazy _instance = new Lazy(() => 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() { } - - /// - /// 初始化日志配置 - /// - public static void Initialize(Action configure = null) - { - Instance.InitializeInternal(configure); - } - - private void InitializeInternal(Action 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); - } - - /// - /// 为特定类型创建Logger - /// - public static ILogger ForContext() - { - Instance.EnsureInitialized(); - return Instance._logger.ForContext(); - } - - /// - /// 为特定源创建Logger - /// - public static ILogger ForContext(string source) - { - Instance.EnsureInitialized(); - return Instance._logger.ForContext("SourceContext", source); - } - - /// - /// 开始一个带属性的日志上下文 - /// - public static IDisposable BeginScope(string propertyName, object value) - { - Instance.EnsureInitialized(); - return Serilog.Context.LogContext.PushProperty(propertyName, value); - } - - /// - /// 开始多个属性的日志上下文 - /// - 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); - } - - /// - /// 关闭并刷新日志 - /// - 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(); - } - } - } +using Serilog; +using Serilog.Core; +using Serilog.Events; +using Serilog.Sinks.SystemConsole.Themes; + +namespace BangumiRenamer.Utils; + +public sealed class Log +{ + private static readonly Lazy _instance = new Lazy(() => 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() { } + + /// + /// 初始化日志配置 + /// + public static void Initialize(Action configure = null) + { + Instance.InitializeInternal(configure); + } + + private void InitializeInternal(Action 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.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); + } + + /// + /// 为特定类型创建Logger + /// + public static ILogger ForContext() + { + Instance.EnsureInitialized(); + return Instance._logger.ForContext(); + } + + /// + /// 为特定源创建Logger + /// + public static ILogger ForContext(string source) + { + Instance.EnsureInitialized(); + return Instance._logger.ForContext("SourceContext", source); + } + + /// + /// 开始一个带属性的日志上下文 + /// + public static IDisposable BeginScope(string propertyName, object value) + { + Instance.EnsureInitialized(); + return Serilog.Context.LogContext.PushProperty(propertyName, value); + } + + /// + /// 开始多个属性的日志上下文 + /// + 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); + } + + /// + /// 关闭并刷新日志 + /// + 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(); + } + } + } } \ No newline at end of file