代码之家  ›  专栏  ›  技术社区  ›  Muflix

如何将eventlog.properties转换为XML?

  •  0
  • Muflix  · 技术社区  · 8 年前

    我想通过存储过程将serilog消息存储到数据库中。我创造了新的水槽。

        namespace Copacking.Web.Logging
        {
            class StoredProcedureSink : ILogEventSink
            {
                private readonly string connectionString;
                public StoredProcedureSink(string connectionString) {
                    this.connectionString = connectionString;
                }
    
                public void Emit(LogEvent logEvent)
                {
    var xml = new XElement("properties");
    
                foreach (KeyValuePair<string, LogEventPropertyValue> property in logEvent.Properties)
                {
                    xml.Add(new XElement("property", new XAttribute("Key", property.Key), property.Value));
                }
    
                    using (var conn = new SqlConnection(connectionString))
                    using (var command = new SqlCommand("dbo.usp_insertLog", conn){ CommandType = CommandType.StoredProcedure })
                    {
                        conn.Open();
                        command.Parameters.Add(new SqlParameter("@message", logEvent.RenderMessage()));
                        command.Parameters.Add(new SqlParameter("@messageTemplate", logEvent.MessageTemplate.Text));
                        command.Parameters.Add(new SqlParameter("@level", logEvent.Level.ToString()));
                        command.Parameters.Add(new SqlParameter("@timestamp", logEvent.Timestamp));
                        command.Parameters.Add(new SqlParameter("@exception", logEvent.Exception.ToString()));
                        command.Parameters.Add(new SqlParameter("@properties", xml.ToString()));
                        command.ExecuteNonQuery();
                    }
                }
    
            }
    
        } 
    

    它有效,但我得到

     <properties>
      <property Key="SourceContext">"..."</property>
      <property Key="RequestId">"..."</property>
      <property Key="RequestPath">"..."</property>
      <property Key="RequestHeader">[("Connection": "Keep-Alive"), ("Accept": "text/html, application/xhtml+xml, image/jxr, */*"), ("Accept-Encoding": "..."), ("Accept-Language": "..."), ("Host": "..."), ("User-Agent": "..."), ("MS-ASPNETCORE-TOKEN": "..."), ("MS-ASPNETCORE-WINAUTHTOKEN": "..."), ("X-Original-Proto": "..."), ("X-Original-For": "...")]</property>
      <property Key="ActivityId">"..."</property>
      <property Key="UserName">"..."</property>
    </properties>
    

    而不是

    <properties>
      <property key="SourceContext">...</property>
      <property key="RequestId">...</property>
      <property key="RequestPath">...</property>
      <property key="RequestHeader">
        <dictionary>
          <item key="Connection">...</item>
          <item key="Accept">...</item>
          <item key="Accept-Encoding">...</item>
          <item key="Accept-Language">...</item>
          <item key="Host">...</item>
          <item key="User-Agent">...</item>
          <item key="MS-ASPNETCORE-TOKEN">...</item>
          <item key="MS-ASPNETCORE-WINAUTHTOKEN">...</item>
          <item key="X-Original-Proto">...</item>
          <item key="X-Original-For">...</item>
        </dictionary>
      </property>
      <property key="ActivityId">...</property>
      <property key="UserName">...</property>
    </properties>
    

    知道如何更改代码吗?可能实现一些递归?!

    1 回复  |  直到 8 年前
        1
  •  0
  •   Muflix    8 年前

    我解决不了这个问题。我抄袭了下列课程

    • 列选项
    • 标准列
    • XML属性格式化程序

    从serilog nuget包 https://github.com/serilog/serilog-sinks-mssqlserver 然后打电话来

    command.Parameters.Add(new SqlParameter("@properties", ConvertPropertiesToXmlStructure(logEvent.Properties)));

    我不能直接使用nuget包中的类,因为 XmlPropertyFormatter 是内部的,因此只能在包内部调用。