Namespace Serenity.Logging.Infrastructure.Editor.Builder
Classes
CreateLoggingProfileWindow
Step-by-step window for creating or updating the Logging aggregate's console sink, file sink, optional structured sink (plus its backend), and profile in one run. Mirrors Serenity.SystemConfiguration.Infrastructure.Editor.Builder.CreateSystemConfigurationSettingsWindow's shape: the window only collects input and renders results, LoggingProfileCreator does the actual validation and generation work.
LoggingProfileCreator
Generates (or updates) the assets the Logging aggregate needs to boot with a working default logger: the UnityConsoleLogSettings sink, the UnityFileLogSettings sink, the optional UnityStructuredLogSettings sink (plus its shared backend asset, authored through the same StructuredBackendAuthoringFactory engine GameSave/GameProgress use), and a UnityLogProfile wired to whichever sink(s) are enabled. Today the only tool that creates any of these is the one-shot Setup Assistant (console/file settings only, via generic recipe assets) — this is the first dedicated creation wizard for the aggregate, and the first ever for UnityLogProfile, which otherwise has no authoring tool at all.
Resolution differs per asset, matching how the runtime actually discovers each one:
UnityConsoleLogInstaller/Serenity.EventDispatcher.Installation.Installers.UnityFileLogInstaller
each fall back to UnityAssetUtils.LoadAllFromAnyBlocking<T> over the module:logging
label and use the first match — so the two sink settings are project-wide singletons (ambiguity is a
warning, never an error), resolved the same way Serenity.SystemConfiguration.Infrastructure.Editor.Builder.SystemConfigurationSettingsCreator
resolves its own settings asset, through the shared SettingsAssetAuthoring engine.
UnityStructuredLogSettings resolves the SAME way while the composition root's
StructuredLogSettings list is empty — UnitySerenityInstaller.InstallStructuredLogService
then runs the same zero-config Addressables-label pass — so this wizard authors it with the identical
singleton-resolution/ambiguity-warning behavior as Console/File, even though the runtime also supports
N structured instances once the list is populated by hand.
UnityLogProfile is different: UnitySerenityInstaller.LogProfile is assigned directly
on the composition root, and the shipped project already carries two of them side by side
(EditorLogProfile, StandaloneLogProfile) — so a profile resolves by Id
within OutputFolderPath, the same by-Id-in-folder pattern
Serenity.AssetPrefetcher.Infrastructure.Editor.Builder.PrefetchPolicyCreator uses for its
N PrefetchPolicyProfile rows.
DefaultLoggerKey uses the literal "console"/"file"/"structured"(:"{Id}") keys, not an assembly-qualified type name — even though the two profiles shipped with the project (EditorLogProfile, StandaloneLogProfile) use AQN strings. UnitySerenityInstaller.GetLogServiceFromKeyOrTypeName recognizes all of them directly, but a literal key survives a class rename or namespace move that would silently break an AQN-based profile; a wizard-authored profile should not carry a value that can bit-rot.
CreateLoggingProfileWindow only collects input and renders results; every asset mutation lives here.LoggingProfileCreator.Input
Everything needed to create or update the console sink, the file sink, and the profile.
LoggingProfileCreator.Result
Outcome of a Create(Input) call.