【问题标题】:Writing logs into Excel file using Serilog for .NET使用 Serilog for .NET 将日志写入 Excel 文件
【发布时间】:2020-04-02 11:37:51
【问题描述】:

我已经在我的 WPF 应用程序中使用Serilog 实现了logging。我希望生成的输出采用Excel 格式。 我希望excel 文件具有这些column headers,如下所述,以便我可以通过应用filterssort

date time| logtype |environment| app build version | test case description | status

output 示例应如下所示

date time       | logtype    |environment| app build version| test case description | status
02-04-2020 4:30 | Test Reults|aBC06      |2.0.150           | Loading Views         | Success

我有如下logging配置

 public class LoggerFactory : ILoggerFactory
    {
        public Serilog.Core.Logger Create()
        {
            var logger = new LoggerConfiguration()
                .ReadFrom.AppSettings()
                .CreateLogger();
            return logger;
        }
    }

AppSettings 有这个配置

<add key="serilog:using:Seq" value="Serilog.Sinks.Seq" />
    <add key="serilog:using:RollingFile" value="Serilog.Sinks.RollingFile" />
    <add key="serilog:write-to:RollingFile.pathFormat" value="C:\Dev\Logs\abc-ui-automation-{Date}.txt" />
    <add key="serilog:write-to:RollingFile.retainedFileCountLimit" value="10" />
    <add key="serilog:write-to:Seq.serverUrl" value="http://localhost:5341" />

目前,logger 正在写入一个txt 文件,没有上述格式。如何确保完成上述任务?

【问题讨论】:

  • 当您说“Excel 格式”时,您是指实际的 OOXML Excel 文件 (*.xlsx) - 还是 CSV 文件?因为 CSV 文件不是“Excel 文件” - 您不能“追加”到 OOXML Excel 文件,因为它是一组包含在 PKZIP 容器中的单独 XML 文件。与支持增量写入的原始基于 OLE 的 Office 97-2003 文件格式不同(使用和理解起来非常复杂),后 Office 2007 OOXML 类型不支持。
  • @Dai 任何可以帮助我以上述格式写作的东西。该文件将一直打开,直到日志记录继续,并且必须相应地更新条目
  • “以上述格式书写” - 你错过了我的问题。我要求您说出哪种特定格式 - 您是在谈论 CSV 还是 OOXML?
  • OOXML 我相信。
  • @Dai 我什至可以使用 excel 打开一个 csv 文件,但日志记录应该采用上述格式,并且列标题应该在那里。需要详细的实现。对此非常陌生

标签: c# wpf logging serilog


【解决方案1】:

最简单的解决方案是将数据记录为 CSV,然后用 excel 打开它。因此,您可以简单地实现您自己的ITextFormatter 版本。检查RawFormatter 等默认实现以了解具体实现方式。

你只需要像这样编写自己的实现

public void Format(LogEvent logEvent, TextWriter output)
{
    output.write(logEvent.Timestamp.ToString("dd-MM-yyyy H:mm");
    output.write(";");
    output.write(logEvent.Level);
    output.write(";");
    output.write(logEvent.Properties["KEY"]);
    output.write(";");
    //...
    output.WriteLine();
}

要编写标题,您可以使用Serilog.Sinks.File.Header 包。基本上可以这样做

Func<string> headerFactory = () => "date time;logtype;...";

Log.Logger = new LoggerConfiguration()
    .WriteTo.File(new YourCsvFormatter(), "log.csv", hooks: new HeaderWriter(headerFactory))
    .CreateLogger();

【讨论】:

  • 如何将这些列作为标题?
  • App.Config中的配置呢?我也需要在那里进行更改吗?
  • 不,如果您不是在代码中这样做,则应该这样做。
  • 我正在尝试实施您的建议。对此真的很陌生。你能解释一下格式化方法吗?
  • 该方法只是将一些字符串写入您的日志文件。每个日志条目都会调用它。所以在这里你可以定义如何通过添加字符串来打印文件中的一行。
猜你喜欢
  • 2019-02-24
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多