使用Serilog for .NET将日志写入Excel文件

5

我在我的WPF应用程序中使用Serilog实现了日志记录。我希望生成的日志输出格式为Excel文件。 我想要Excel文件具有以下列标题,这样我就可以通过应用筛选器进行排序。

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文件中。我该如何确保实现上述任务?


1
当您说“Excel格式”时,您是指实际的OOXML Excel文件(*.xlsx)还是CSV文件?因为CSV文件不是“Excel文件”,并且您无法“追加”到OOXML Excel文件中,因为它是包含在PKZIP容器中的一组单独的XML文件。与原始基于OLE的Office 97-2003文件格式不同,后Office 2007 OOXML类型不支持增量写入(这些格式非常复杂,难以使用和理解)。 - Dai
@Dai 任何有助于我按照上述格式编写的工具。文件将保持打开状态,直到记录结束,并且条目必须相应更新。 - Apoorv
“按照上述格式编写” - 你错过了我的问题。我在问你要命名具体的格式 - 你是在谈论CSV还是OOXML? - Dai
我相信是OOXML。 - Apoorv
@Dai,我甚至可以使用Excel打开一个csv文件,但是日志记录应该按照规定的格式进行,并且列标题也应该存在。需要详细的实现过程。对此非常陌生。 - Apoorv
1个回答

3

最简单的解决方案是将数据记录为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();

如何将这些列作为标题? - Apoorv
App.Config 中的配置怎么样?我也需要在那里进行修改吗? - Apoorv
我正在尝试实现您所建议的内容。对此还很陌生。您能解释一下格式化方法吗? - Apoorv
在我的情况下,理想的YourCsvFormatter应该是什么? - Apoorv
所以,分号“;”会确保下一个条目进入下一个单元格?我需要按列写入数据。 - Apoorv
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接