Skip to content

refactor: migrate Serilog.ILogger to Microsoft.Extensions.Logging.ILogger<T>#2090

Merged
erwan-joly merged 1 commit intomasterfrom
refactor/ilogger-generic
Apr 24, 2026
Merged

refactor: migrate Serilog.ILogger to Microsoft.Extensions.Logging.ILogger<T>#2090
erwan-joly merged 1 commit intomasterfrom
refactor/ilogger-generic

Conversation

@erwan-joly
Copy link
Copy Markdown
Collaborator

Summary

Replaces non-generic Serilog.ILogger injection with Microsoft.Extensions.Logging.ILogger<T> across NosCore. Closes #1607.

What changed

  • Type system: ILoggerILogger<ContainingClass> on fields, ctor params and primary-ctor params wherever a logger is owned by a specific type.
  • Method calls: .Information/.Warning/.Error/.Debug/.Verbose/.Fatal.LogInformation/.LogWarning/.LogError/.LogDebug/.LogTrace/.LogCritical.
  • Abstract bases (BaseHubClient, NetworkClient) keep non-generic ILogger so derived classes pass their own ILogger<Derived> through inheritance (MEL ILogger<T> extends ILogger).
  • Classes that new inner classes requiring typed loggers (ItemGenerationServiceWearableInstance, MapInstanceGeneratorServiceMapInstance, the parsers → GenericParser<T> / FluentParser<T> / I18NParser<T,PK>, ImportFactory → 10× I18NParser<…>) now inject ILoggerFactory and call CreateLogger<Inner>() at the construction site.
  • Autofac: the four bootstraps dropped their Register(_ => Log.Logger).As<Serilog.ILogger>().SingleInstance() bindings. ILogger<T> auto-wires through Microsoft DI into Autofac via AutofacServiceProviderFactory. Serilog stays as the backend provider via UseSerilog() — no log output changes.
  • MasterServerBootstrap and the Database PersistenceModule resolve a string-categorized logger via ILoggerFactory.CreateLogger(nameof(…)) because MasterServerBootstrap is static and can't be a type arg.

Dependencies (already published)

  • NosCore.Dao 5.0.0 — breaking: Dao<TEntity, TDto, TPk> now takes ILogger<Dao<TEntity, TDto, TPk>>.
  • NosCore.Networking 8.0.0 — breaking: NetworkClient now takes Microsoft.Extensions.Logging.ILogger.

Directory.Packages.props bumped to consume both.

Testing

  • dotnet build — green (0 errors, 0 warnings).
  • dotnet test924/924 passing across all suites (Core, Database, Parser, WebApi, GameObject, PacketHandlers).

Moq .Verify calls targeting extension methods (LogError, LogWarning etc.) were rewritten to verify the underlying Log(LogLevel, EventId, TState, Exception?, Func<TState, Exception?, string>) interface method, since extension methods can't be intercepted by Moq.

Test plan

  • Build green.
  • Full test suite green.
  • Smoke test server startup (runtime Autofac resolution for ILogger<T> via MEL→Serilog).

Generated with Claude Code

…g.ILogger<T>

Replaces non-generic Serilog.ILogger injection with
Microsoft.Extensions.Logging.ILogger<T> across NosCore. Closes #1607.

- Fields/ctor params: `ILogger` -> `ILogger<ContainingClass>` everywhere
  the logger is owned by a specific type.
- Method calls: `.Information/.Warning/.Error/.Debug/.Verbose/.Fatal`
  -> `.LogInformation/.LogWarning/.LogError/.LogDebug/.LogTrace/.LogCritical`.
- Abstract bases (`BaseHubClient`, `NetworkClient`) keep non-generic
  `ILogger` so derived classes can pass their own `ILogger<Derived>`
  through the inheritance chain (MEL `ILogger<T>` extends `ILogger`).
- Classes that construct typed-logger inner classes
  (`ItemGenerationService`, `MapInstanceGeneratorService`, parsers,
  `ImportFactory`) now take `ILoggerFactory` and call
  `CreateLogger<Inner>()` at instantiation.
- Autofac `As<Serilog.ILogger>()` bindings removed; ILogger<T>
  auto-wires via `services.AddLogging()` through
  AutofacServiceProviderFactory. Serilog stays as the backend provider
  via `UseSerilog()`.
- `Directory.Packages.props`: bump NosCore.Dao 4.0.5 -> 5.0.0 and
  NosCore.Networking 7.1.0 -> 8.0.0 (both packages migrated in separate
  PRs, tagged, and published to nuget.org).
- Test mocks rewired per target class: `Mock<ILogger<TargetType>>` at
  each instantiation site; test helpers use `NullLogger<T>.Instance` /
  `NullLoggerFactory.Instance` where verification isn't needed.
- Moq `.Verify(l => l.LogXxx(...))` on extension methods rewritten to
  match the underlying `Log(LogLevel, EventId, TState, Exception?,
  Func<TState, Exception?, string>)` interface method.

Closes #1607.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 24, 2026

Important

Review skipped

Too many files!

This PR contains 196 files, which is 46 over the limit of 150.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 938f133e-5391-4f76-8f3c-594dcfcb8b6a

📥 Commits

Reviewing files that changed from the base of the PR and between 565b16d and 6efa290.

📒 Files selected for processing (196)
  • Directory.Packages.props
  • src/NosCore.Database/Hosting/PersistenceModule.cs
  • src/NosCore.GameObject/Ecs/Extensions/CharacterEntityExtension.cs
  • src/NosCore.GameObject/Ecs/Extensions/NonPlayableEntityExtension.cs
  • src/NosCore.GameObject/InterChannelCommunication/Hubs/BaseHubClient.cs
  • src/NosCore.GameObject/InterChannelCommunication/Hubs/BazaarHub/BazaarHubClient.cs
  • src/NosCore.GameObject/InterChannelCommunication/Hubs/BlacklistHub/BlacklistHubClient.cs
  • src/NosCore.GameObject/InterChannelCommunication/Hubs/ChannelHub/ChannelHubClient.cs
  • src/NosCore.GameObject/InterChannelCommunication/Hubs/FriendHub/FriendHubClient.cs
  • src/NosCore.GameObject/InterChannelCommunication/Hubs/MailHub/MailHubClient.cs
  • src/NosCore.GameObject/InterChannelCommunication/Hubs/PubSub/PubSubHubClient.cs
  • src/NosCore.GameObject/InterChannelCommunication/Hubs/WarehouseHub/WarehouseHubClient.cs
  • src/NosCore.GameObject/Messaging/Handlers/Battle/DeathBCardHandler.cs
  • src/NosCore.GameObject/Messaging/Handlers/Battle/MonsterRespawnHandler.cs
  • src/NosCore.GameObject/Messaging/Handlers/Battle/PlayerRevivalHandler.cs
  • src/NosCore.GameObject/Messaging/Handlers/Guri/SpeakerHandler.cs
  • src/NosCore.GameObject/Messaging/Handlers/Nrun/ChangeClassHandler.cs
  • src/NosCore.GameObject/Messaging/Handlers/Nrun/OpenShopHandler.cs
  • src/NosCore.GameObject/Messaging/Handlers/Quest/OnEntityDiedHandler.cs
  • src/NosCore.GameObject/Messaging/Handlers/UseItem/VehicleHandler.cs
  • src/NosCore.GameObject/Messaging/Handlers/UseItem/WearHandler.cs
  • src/NosCore.GameObject/Networking/ClientSession/ClientSession.cs
  • src/NosCore.GameObject/Networking/ClientSession/LoginPacketHandlingStrategy.cs
  • src/NosCore.GameObject/Networking/ClientSession/WorldPacketHandlingStrategy.cs
  • src/NosCore.GameObject/Services/BattleService/BattleService.cs
  • src/NosCore.GameObject/Services/BattleService/HitQueue.cs
  • src/NosCore.GameObject/Services/BattleService/MonsterAi.cs
  • src/NosCore.GameObject/Services/BattleService/RegenerationService.cs
  • src/NosCore.GameObject/Services/BattleService/RewardService.cs
  • src/NosCore.GameObject/Services/BroadcastService/SessionRegistry.cs
  • src/NosCore.GameObject/Services/ChannelCommunicationService/ChannelCommunicationRunner.cs
  • src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/PostedPacketMessageChannelCommunicationMessageHandler.cs
  • src/NosCore.GameObject/Services/ChannelCommunicationService/Handlers/StatDataMessageChannelCommunicationMessageHandler.cs
  • src/NosCore.GameObject/Services/ExchangeService/ExchangeService.cs
  • src/NosCore.GameObject/Services/FriendService/FriendService.cs
  • src/NosCore.GameObject/Services/InventoryService/InventoryService.cs
  • src/NosCore.GameObject/Services/ItemGenerationService/Item/WearableInstance.cs
  • src/NosCore.GameObject/Services/ItemGenerationService/ItemGenerationService.cs
  • src/NosCore.GameObject/Services/MapChangeService/MapChangeService.cs
  • src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstance.cs
  • src/NosCore.GameObject/Services/MapInstanceGenerationService/MapInstanceGenerationService.cs
  • src/NosCore.GameObject/Services/QuestService/Handlers/HuntQuestHandler.cs
  • src/NosCore.GameObject/Services/QuestService/Handlers/KillQuestHandlerBase.cs
  • src/NosCore.GameObject/Services/QuestService/Handlers/NumberOfKillQuestHandler.cs
  • src/NosCore.GameObject/Services/QuestService/QuestService.cs
  • src/NosCore.GameObject/Services/SaveService/SaveService.cs
  • src/NosCore.GameObject/Services/TransformationService/TransformationService.cs
  • src/NosCore.LoginServer/LoginServer.cs
  • src/NosCore.LoginServer/LoginServerBootstrap.cs
  • src/NosCore.MasterServer/MasterServer.cs
  • src/NosCore.MasterServer/MasterServerBootstrap.cs
  • src/NosCore.PacketHandlers/Battle/RevivalPacketHandler.cs
  • src/NosCore.PacketHandlers/Battle/UseSkillPacketHandler.cs
  • src/NosCore.PacketHandlers/Bazaar/CBuyPacketHandler.cs
  • src/NosCore.PacketHandlers/Bazaar/CModPacketHandler.cs
  • src/NosCore.PacketHandlers/Bazaar/CScalcPacketHandler.cs
  • src/NosCore.PacketHandlers/CharacterScreen/CharNewPacketHandler.cs
  • src/NosCore.PacketHandlers/CharacterScreen/DacPacketHandler.cs
  • src/NosCore.PacketHandlers/CharacterScreen/EntryPointPacketHandler.cs
  • src/NosCore.PacketHandlers/CharacterScreen/SelectPacketHandler.cs
  • src/NosCore.PacketHandlers/Chat/BtkPacketHandler.cs
  • src/NosCore.PacketHandlers/Chat/WhisperPacketHandler.cs
  • src/NosCore.PacketHandlers/Command/CreateItemPacketHandler.cs
  • src/NosCore.PacketHandlers/Command/SizePacketHandler.cs
  • src/NosCore.PacketHandlers/Command/TeleportPacketHandler.cs
  • src/NosCore.PacketHandlers/Exchange/ExcListPacketHandler.cs
  • src/NosCore.PacketHandlers/Exchange/ExchangeRequestPacketHandler.cs
  • src/NosCore.PacketHandlers/Friend/BlInsPacketHandler.cs
  • src/NosCore.PacketHandlers/Game/NcifPacketHandler.cs
  • src/NosCore.PacketHandlers/Game/ReqInfoPacketHandler.cs
  • src/NosCore.PacketHandlers/Group/PjoinPacketHandler.cs
  • src/NosCore.PacketHandlers/Inventory/BiPacketHandler.cs
  • src/NosCore.PacketHandlers/Inventory/GetPacketHandler.cs
  • src/NosCore.PacketHandlers/Login/NoS0575PacketHandler.cs
  • src/NosCore.PacketHandlers/Movement/ClientDirPacketHandler.cs
  • src/NosCore.PacketHandlers/Movement/SitPacketHandler.cs
  • src/NosCore.PacketHandlers/Movement/WalkPacketHandler.cs
  • src/NosCore.PacketHandlers/Shops/BuyPacketHandler.cs
  • src/NosCore.PacketHandlers/Shops/NrunPacketHandler.cs
  • src/NosCore.PacketHandlers/Shops/RequestNpcPacketHandler.cs
  • src/NosCore.PacketHandlers/Shops/ShoppingPacketHandler.cs
  • src/NosCore.PacketHandlers/Upgrades/UpgradePacketHandler.cs
  • src/NosCore.Parser/ImportFactory.cs
  • src/NosCore.Parser/Parser.cs
  • src/NosCore.Parser/ParserBootstrap.cs
  • src/NosCore.Parser/Parsers/ActParser.cs
  • src/NosCore.Parser/Parsers/CardParser.cs
  • src/NosCore.Parser/Parsers/Generic/FluentParserBuilder.cs
  • src/NosCore.Parser/Parsers/Generic/GenericParser.cs
  • src/NosCore.Parser/Parsers/I18NParser.cs
  • src/NosCore.Parser/Parsers/ItemParser.cs
  • src/NosCore.Parser/Parsers/MapMonsterParser.cs
  • src/NosCore.Parser/Parsers/MapNpcParser.cs
  • src/NosCore.Parser/Parsers/MapParser.cs
  • src/NosCore.Parser/Parsers/MapTypeParser.cs
  • src/NosCore.Parser/Parsers/NpcMonsterParser.cs
  • src/NosCore.Parser/Parsers/NpcTalkParser.cs
  • src/NosCore.Parser/Parsers/PortalParser.cs
  • src/NosCore.Parser/Parsers/QuestParser.cs
  • src/NosCore.Parser/Parsers/QuestPrizeParser.cs
  • src/NosCore.Parser/Parsers/RespawnMapTypeParser.cs
  • src/NosCore.Parser/Parsers/ScriptParser.cs
  • src/NosCore.Parser/Parsers/ShopItemParser.cs
  • src/NosCore.Parser/Parsers/ShopParser.cs
  • src/NosCore.Parser/Parsers/SkillParser.cs
  • src/NosCore.WebApi/WebApiBootstrap.cs
  • src/NosCore.WorldServer/WorldServerBootstrap.cs
  • test/NosCore.GameObject.Tests/Messaging/Handlers/Battle/MonsterRespawnHandlerTests.cs
  • test/NosCore.GameObject.Tests/Messaging/Handlers/Battle/PlayerRevivalHandlerTests.cs
  • test/NosCore.GameObject.Tests/Messaging/Handlers/UseItem/WearHandlerTests.cs
  • test/NosCore.GameObject.Tests/Messaging/WolverineHandlerResolutionTests.cs
  • test/NosCore.GameObject.Tests/Services/BattleService/BattleServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/BattleService/HitQueueTests.cs
  • test/NosCore.GameObject.Tests/Services/BattleService/MonsterAiTests.cs
  • test/NosCore.GameObject.Tests/Services/BroadcastService/SessionRegistryTests.cs
  • test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/PostedPacketMessageHandlerTests.cs
  • test/NosCore.GameObject.Tests/Services/ChannelCommunicationService/Handlers/StatDataMessageHandlerTests.cs
  • test/NosCore.GameObject.Tests/Services/CharacterService/CharacterInitializationServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/ExchangeService/ExchangeServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/FriendService/FriendServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/InventoryService/InventoryServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/MapChangeService/MapChangeServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/MinilandService/MinilandServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/QuestService/QuestServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/SaveService/SaveServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/SkillService/SkillServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/TransformationService/TransformationServiceTests.cs
  • test/NosCore.GameObject.Tests/Services/UpgradeService/EquipmentUpgradeOperationTests.cs
  • test/NosCore.GameObject.Tests/Services/UpgradeService/RarifyOperationTests.cs
  • test/NosCore.GameObject.Tests/Services/UpgradeService/SumUpgradeOperationTests.cs
  • test/NosCore.GameObject.Tests/Services/WarehouseService/WarehouseServiceTests.cs
  • test/NosCore.GameObject.Tests/ShopTests.cs
  • test/NosCore.PacketHandlers.Tests/Battle/RevivalPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Battle/UseSkillPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Bazaar/CBuyPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Bazaar/CModPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Bazaar/CScalcPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/CharacterScreen/CharNewPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/CharacterScreen/CharRenPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/CharacterScreen/DacPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/CharacterScreen/EntryPointPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/CharacterScreen/SelectPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Chat/BtkPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Chat/WhisperPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Command/CreateItemPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Command/SizePacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Command/TeleportPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Exchange/ExcListPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Exchange/ExchangeRequestPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Friend/BlDelPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Friend/BlInsPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Friend/BlPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Friend/FinsPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Friend/FlPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Friend/fDelPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Game/NcifPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Game/ReqInfoPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Group/GroupTalkPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Group/PJoinPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Group/PleavePacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Inventory/BiPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Inventory/SpTransformPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Login/NoS0575PacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Miniland/AddobjPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Miniland/MJoinPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/MgPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Miniland/MinilandObjects/UseobjPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Miniland/MlEditPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Miniland/RmvobjPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Movement/ClientDirPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Movement/SitPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Movement/WalkPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Shops/BuyPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Shops/MShopPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Shops/NrunPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Shops/RequestNpcPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Shops/SellPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Shops/ShoppingPacketHandlerTests.cs
  • test/NosCore.PacketHandlers.Tests/Upgrades/UpgradePacketHandlerTests.cs
  • test/NosCore.Parser.Tests/ActParserTests.cs
  • test/NosCore.Parser.Tests/CardParserTests.cs
  • test/NosCore.Parser.Tests/DatDocumentationSnapshotTests.cs
  • test/NosCore.Parser.Tests/FluentParserBuilderTests.cs
  • test/NosCore.Parser.Tests/GenericParserTests.cs
  • test/NosCore.Parser.Tests/ItemParserTests.cs
  • test/NosCore.Parser.Tests/MapMonsterParserTests.cs
  • test/NosCore.Parser.Tests/MapNpcParserTests.cs
  • test/NosCore.Parser.Tests/MapParserTests.cs
  • test/NosCore.Parser.Tests/NpcMonsterParserTests.cs
  • test/NosCore.Parser.Tests/PortalParserTests.cs
  • test/NosCore.Parser.Tests/QuestParserTests.cs
  • test/NosCore.Parser.Tests/QuestPrizeParserTests.cs
  • test/NosCore.Parser.Tests/ShopParserTests.cs
  • test/NosCore.Parser.Tests/SkillParserTests.cs
  • test/NosCore.Tests.Shared/BDD/SpecBase.cs
  • test/NosCore.Tests.Shared/TestHelpers.cs

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/ilogger-generic

Comment @coderabbitai help to get the list of available commands and usage tips.

@erwan-joly erwan-joly merged commit e455f1d into master Apr 24, 2026
2 checks passed
@erwan-joly erwan-joly deleted the refactor/ilogger-generic branch April 24, 2026 07:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

replace ILogger by ILogger<T> from microsoft

1 participant