簡體   English   中英

如何在 C# .NET 結構化日志記錄中強制使用駝峰式大小寫?

[英]How to force camel case in C# .NET structured logging?

有誰知道如何將 .NET Core C# 中結構化日志的行為/格式更改為駝峰式(例如:駝峰式)? 我正在嘗試利用結構化日志記錄,如下所示:

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。

1) 使用CamelCaseNamingStrategy作為 NamingStrategy 配置創建自定義序列化程序

    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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM