如何使用NLog序列化对象字段?

问题描述 投票:0回答:1

我正在测试新的structured logging,但实际上并没有正确完成。

我在nlog.config中有这个:

<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log">
  <layout xsi:type="JsonLayout" includeAllProperties="true">${longdate}|${level}|${logger}|${message}</layout>
</target>

<logger name="CommunicationLogger" minlevel="Info" writeto="f"></logger>

我的日志代码如下:

public void LogCommunication(string operation, List<object> args)
    {
        var parameters = new List<object>();

        var text = "Operation:{Operation} ";
        parameters.Add(operation);

        text += "PersonId:{PersonId} ";
        parameters.Add(SharedContext.GetMyUserContext().CurrentPersonId);

        text += "ClientMachineName:{ComputerName} ";
        parameters.Add(SharedContext.GetMyUserContext().ClientMachineName);

        text += "Servername:{MachineName} ";
        parameters.Add(Environment.MachineName);

        if (args != null)
        {
            foreach(var param in args)
            {
                text += "Param:{@Parameters} ";
                parameters.Add(param);
            }

        }

        _log.LogCommunication(text, parameters.ToArray());
    }

public void LogCommunication(string message, params object[] args)
        {
            _comLogger.Log(LogLevel.Info, message, args);
        }

输出看起来像这样:

{“ Operation”:“ OperationName”,“ PersonId”:1,“ ComputerName”:“ MyComputername”,“ MachineName”:“ MyMachinename”,“ Parameters”:{“ LocationKeyList”:[],“ MyObjectIdList”:[],“ RolList”:[]}}]

我希望参数也可以序列化,而不仅仅是showint [],因此我可以看到服务操作的所有参数。该参数是带有dataContract(WCF)的复杂类型。

是否有一种简单的方法来获取用于结构数据的参数。

Retagards

Update1

nlog.config

<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log">
  <layout xsi:type="JsonLayout" includeAllProperties="true" maxRecursionLimit="10">
    <attribute name="time" layout="${longdate}" />
    <attribute name="level" layout="${level}"/>
    <attribute name="message" layout="${message}" />
  </layout>
</target>

设置数据的代码

var parameters = new List<object>();

            var text = "{TimeStamp} - ";
            parameters.Add(DateTime.Now);

            text += "Duration:{Duration} ";
            parameters.Add(Timestamp);

            text += "Operation:{Operation} ";
            parameters.Add(operation);

            text += "PersonId:{PersonId} ";
            parameters.Add(SharedContext.GetMyUserContext().CurrentPersonId);

            text += "ClientMachineName:{ComputerName} ";
            parameters.Add(SharedContext.GetMyUserContext().ClientMachineName);

            text += "Servername:{MachineName} ";
            parameters.Add(Environment.MachineName);

            if (args != null && args.Count() > 0)
            {
                text += "Param:{@Parameters} ";
                parameters.Add(args);
            }

            _log.LogCommunication(text, parameters.ToArray());

结果:

ientMachineName:\“ MyComputer \”服务器名:\“ MyComputer \”参数:[\“ MyApp.ServiceContracts.GetEntityViewRequest \”]“,“时间戳记”:“ 2020-04-08T23:30:59.7725147Z”,“持续时间”:“ 00:00:00.0009930”,“操作”:“ GetReferenceData”,“ PersonId”:1,“计算机名称”:“ SE-MyCom”,“计算机名称”:“ SE-MyCom”,“参数”:[“ MyApp.ServiceContracts.GetEntityViewRequest”]}

{“ time”:“ 2020-04-09 01:31:00.3637”,“ level”:“ Info”,“ message”:“ 2020-04-09 01:31:00-持续时间:00:00:00.5594936操作:\“ GetExternaAnrop \” PersonId:1ClientMachineName:\“ MyComputer \”服务器名称:\“ MyComputer \”参数:[{\“ PlaceringKeyList \”:[],\“ ArbetsstalleIdList \”:[],\“ RollList \”:[]}]“,” TimeStamp“:” 2020-04-08T23:31:00.363752Z“,“ Duration”:“ 00:00:00.5594936”,“ Operation”:“ GetExternaAnrop”,“ PersonId”:1,“ ComputerName”:“ SE-MyCom”,“ MachineName”:“ SE-MyCom”,“参数”:[{“ PlaceringKeyList”:[],“ ArbetsstalleIdList”:[],“ RollList”:[]}]}

Update2

我有一个如下所示的服务方法:

GetEntityViewResponse GetReferenceData(GetEntityViewRequest request);

请求类如下:

[DataContract]公共类GetEntityViewRequest{公共GetEntityViewRequest(参数EntityViewKey []键){EntityViewKeys.AddRange(Keys);}公共GetEntityViewRequest(params int [] EgnaKodtyper){MyList.AddRange(EgnaKodtyper);}公共GetEntityViewRequest(){

    }
    [DataMember]
    public List<EntityViewKey> EntityViewKeys = new List<EntityViewKey>();
    [DataMember]
    public List<int> MyList= new List<int>();
}

运行代码(发送请求时),我可以在服务端的messageInspector中看到我已获取数据。 EntityViewKeys具有一个枚举集。

NLog输出看起来像这样:

{“ time”:“ 2020-04-12 19:27:55.6690”,“ level”:“ Info”,“ message”:“ 2020-04-12 19:27:55-持续时间:00:00:00.0034730操作:\“ GetReferenceData \” PersonId:1ClientMachineName:\“ MyComputer \”服务器名称:\“ MyComputer \”参数:[\“ Orbit.ServiceContracts.GetEntityViewRequest \”]“,“时间戳记”:“ 2020-04-12T17:27:55.6690745Z”,“持续时间”:“ 00:00:00.0034730”,“操作”:“ GetReferenceData”,“ PersonId”:1,“计算机名称”:“ SE-MyCom”,“计算机名称”:“ SE-MyCom”,“参数”:[“ Orbit.ServiceContracts.GetEntityViewRequest”]}

因此,即使该类并不复杂,它仍然不会在NLog中打印内容?

c# .net data-structures config nlog
1个回答
0
投票

对于JsonLayout,有一个重要的参数称为MaxRecursionLimit(默认值= 0,直到NLog v5到来:]

© www.soinside.com 2019 - 2024. All rights reserved.