GFramework/GFramework.Godot/Logging/GodotLoggerFactoryProvider.cs
gewuyou ff553977e3 chore(license): 补齐 Apache-2.0 文件头治理
- 新增许可证文件头检查与修复脚本

- 补充维护者手动修复 PR 工作流和 CI 校验

- 更新贡献指南中的文件头说明

- 补齐仓库维护源码和配置文件的许可证声明
2026-05-03 19:39:49 +08:00

80 lines
2.5 KiB
C#

// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
using System;
using System.Collections.Concurrent;
using GFramework.Core.Abstractions.Logging;
namespace GFramework.Godot.Logging;
/// <summary>
/// Provides cached Godot logger instances.
/// </summary>
public sealed class GodotLoggerFactoryProvider : ILoggerFactoryProvider
{
private readonly ConcurrentDictionary<string, ILogger> _loggers = new(StringComparer.Ordinal);
private readonly Func<GodotLoggerSettings> _settingsProvider;
/// <summary>
/// Initializes a Godot logger provider with the default logger factory.
/// </summary>
public GodotLoggerFactoryProvider()
: this(static () => GodotLoggerSettings.Default)
{
}
/// <summary>
/// Initializes a Godot logger provider with Godot-specific formatting options.
/// </summary>
/// <param name="options">The logger options.</param>
public GodotLoggerFactoryProvider(GodotLoggerOptions options)
: this(CreateStaticSettingsProvider(options))
{
}
internal GodotLoggerFactoryProvider(Func<GodotLoggerSettings> settingsProvider)
{
_settingsProvider = settingsProvider ?? throw new ArgumentNullException(nameof(settingsProvider));
}
/// <summary>
/// Gets or sets the provider minimum level.
/// </summary>
public LogLevel MinLevel { get; set; }
/// <summary>
/// Creates a cached logger with the specified name.
/// </summary>
/// <param name="name">The logger name.</param>
/// <returns>A logger configured with <see cref="MinLevel"/>.</returns>
public ILogger CreateLogger(string name)
{
ArgumentNullException.ThrowIfNull(name);
return _loggers.GetOrAdd(
name,
static (loggerName, provider) => new GodotLogger(
loggerName,
provider.GetOptions,
() => provider.GetEffectiveMinLevel(loggerName)),
this);
}
private GodotLoggerOptions GetOptions()
{
return _settingsProvider().Options;
}
private LogLevel GetEffectiveMinLevel(string categoryName)
{
return _settingsProvider().GetEffectiveMinLevel(categoryName, MinLevel);
}
private static Func<GodotLoggerSettings> CreateStaticSettingsProvider(GodotLoggerOptions options)
{
ArgumentNullException.ThrowIfNull(options);
var settings = GodotLoggerSettings.FromOptions(options);
return () => settings;
}
}