首页 > 解决方案 > 如何在 C# .NET 结构化日志记录中强制使用骆驼大小写?

问题描述

有谁知道如何将 .NET Core C# 中结构化日志记录的行为/格式更改为驼峰式(例如:camelCase)?我正在尝试利用结构化日志记录,如下所示:

Logger.LogInformation("Some text here. My object: {@some_class}", someClass);

假设某个类如下所示:

class SomeClass {
  [JsonProperty(PropertyName = "intField")] // this does NOT work for structured logging
  int IntField {get;set;}
  string StrField {get;set;}
}

为简洁起见,我将收到如下输出:

{
  ...
  "message": "Some text here. My object: {\"IntField\":5,\"StrField\":\"I'm here\"}",
  "some_class": {
    "IntField":5,
    "StrField":"I'm here"
  },
  ...
}

但我想要的是所有字段都是驼峰式,就像日志中的所有父字段一样。以下是期望的结果:

{
  ...
  "message": "Some text here. My object: {\"IntField\":5,\"StrField\":\"I'm here\"}",
  "some_class": {
    "intField":5,
    "strField":"I'm here"
  },
  ...
}

我尝试使用新的 JsonSerializerSettings 对象设置我的 JsonConvert.DefaultSettings 以强制使用驼峰式大小写,但我假设这仅在我实际序列化为字符串时才有效(从 StackOverflow 问题中获得)。我猜记录器不会在引擎盖下使用。

如果对我使用有帮助,我正在使用 .NET Core 2.2 和 v4.8.1。

标签: c#asp.net-coreloggingnlogstructured-logging

解决方案


1)使用命名策略配置创建您的自定义序列化程序。CamelCaseNamingStrategy

    internal class JsonNetSerializer : NLog.IJsonConverter
    {
        private readonly DefaultContractResolver contractResolver;

        public JsonNetSerializer()
        {
            contractResolver = new DefaultContractResolver
            {
                // KEY CONFIG !!!
                NamingStrategy = new CamelCaseNamingStrategy()
            };
        }

        /// <summary>Serialization of an object into JSON format.</summary>
        /// <param name="value">The object to serialize to JSON.</param>
        /// <param name="builder">Output destination.</param>
        /// <returns>Serialize succeeded (true/false)</returns>
        public bool SerializeObject(object value, StringBuilder builder)
        {
            try
            {
                string json = JsonConvert.SerializeObject(value, new JsonSerializerSettings
                {
                    ContractResolver = contractResolver
                });

                builder.Append(json);
            }
            catch (Exception e)
            {
                NLog.Common.InternalLogger.Error(e, "Error when custom JSON serialization");
                return false;
            }
            return true;
        }
    }
}

2)更改新自定义的默认值

var customConverter = new JsonNetSerializer();
ConfigurationItemFactory.Default.JsonConverter = customConverter;

使用它,将您的 Json 发送到 NLog log.Info("Metadata: {@source}", metadata);


推荐阅读