* Add Umbraco specific global usings * Enable implicit usings * v10: Wait for updated ConnectionStrings during install (#12536) * Do not change/reload configuration * Wait for updated connection string options * recase assigndomain (#12448) * Add depth property to ICoreScope (#12540) * Remove ambient scope stack from httpcontext.items. (#12539) This change makes it easier to use service calls in parallel whilst a httpcontext is available. * v10: Prefer SQLite primitive types to flexible types (#12541) * Prefer SQLite primitive types to flexible types. * SQLite - column mappings use TEXT for decimals Thanks @mattbrailsford for sense check. * Fix issue where languages files are not found in subdir of package dir (#12543) * Make FindContent return type nullable (#12545) * Updated nuget dependencies (07-06-2022) (#12525) * Updated nuget dependencies * Move Nerdbank.GitVersioning update to Directory.Build.props * Updated more dependencies * Improve FlagOutOfDateModels property behaviour. (cherry picked from commit 54077725c373495fce0d3fbc5cdb6469aad3b676) * Fix logic error WRT models builder flag out of date models. (#12548) (cherry picked from commit 6b0149803a879d1c6902a5f61d1f2e9dc8545aac) * Fixed issue with expected null value. (#12550) Fixes https://github.com/umbraco/Umbraco-CMS/issues/12526 * Updated Examine to 3.0.0 * Fixes relation issue, when moving a root item to recycle bin, the "Relate Parent Media Folder On Delete"/"Relate Parent Document On Delete" cannot get the parent node type, because it is a fake root. * Fix possible null error * Bump version to 10.0.0 final * Fix attempting to write lock files to LocalTempPath before it exists (#12563) * Re fix usage statements Co-authored-by: Ronald Barendse <ronald@barend.se> Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> Co-authored-by: Paul Johnson <pmj@umbraco.com> Co-authored-by: Bjarke Berg <mail@bergmania.dk>
54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
using Serilog;
|
|
using Serilog.Events;
|
|
using Serilog.Parsing;
|
|
|
|
namespace Umbraco.Cms.Core.Logging;
|
|
|
|
public class MessageTemplates : IMessageTemplates
|
|
{
|
|
// Umbraco now uses Message Templates (https://messagetemplates.org/) for logging, which means
|
|
// we cannot plainly use string.Format() to format them. There is a work-in-progress C# lib,
|
|
// derived from Serilog, which should help (https://github.com/messagetemplates/messagetemplates-csharp)
|
|
// but it only has a pre-release NuGet package. So, we've got to use Serilog's code, which
|
|
// means we cannot get rid of Serilog entirely. We may want to revisit this at some point.
|
|
|
|
// TODO: Do we still need this, is there a non-pre release package shipped?
|
|
private static readonly Lazy<ILogger> _minimalLogger = new(() => new LoggerConfiguration().CreateLogger());
|
|
|
|
public string Render(string messageTemplate, params object[] args)
|
|
{
|
|
// resolve a minimal logger instance which is used to bind message templates
|
|
ILogger logger = _minimalLogger.Value;
|
|
|
|
var bound = logger.BindMessageTemplate(messageTemplate, args, out MessageTemplate? parsedTemplate, out IEnumerable<LogEventProperty>? boundProperties);
|
|
|
|
if (!bound)
|
|
{
|
|
throw new FormatException($"Could not format message \"{messageTemplate}\" with {args.Length} args.");
|
|
}
|
|
|
|
var values = boundProperties!.ToDictionary(x => x.Name, x => x.Value);
|
|
|
|
// this ends up putting every string parameter between quotes
|
|
// return parsedTemplate.Render(values);
|
|
|
|
// this does not
|
|
var tw = new StringWriter();
|
|
foreach (MessageTemplateToken? t in parsedTemplate!.Tokens)
|
|
{
|
|
if (t is PropertyToken pt &&
|
|
values.TryGetValue(pt.PropertyName, out LogEventPropertyValue? propVal) &&
|
|
(propVal as ScalarValue)?.Value is string s)
|
|
{
|
|
tw.Write(s);
|
|
}
|
|
else
|
|
{
|
|
t.Render(values, tw);
|
|
}
|
|
}
|
|
|
|
return tw.ToString();
|
|
}
|
|
}
|