c# - 设置 Serilog 以将日志写入 SQL Server 数据库表

标签 c# sql-server logging serilog

我正在尝试设置 Serilog 以将日志写入我的数据库表。

以下是我为尝试设置 SQL Server 日志记录所做的工作的细目。

1) 安装 Nuget 包、Serilog 和 Serilog.Sinks.MSSqlServer

2) 我设置了一个名为 Logger.cs 的类,其中包含 Serilog 的所有配置:

public static class Logger
{
    private static readonly ILogger _Logger;

    static Logger()
    {

        var connStr = "data source=DESKTOP-BLAH;Initial Catalog=DBNAME;Trusted_Connection=True;";

        _Logger = new LoggerConfiguration()
            .WriteTo.MSSqlServer(connStr, "ApplicationLogs", 
            columnOptions: GetSqlColumnOptions(), restrictedToMinimumLevel: LogEventLevel.Debug, batchPostingLimit: 1)
            .CreateLogger();

        Serilog.Debugging.SelfLog.Enable(msg => Debug.WriteLine(msg));

    }

    public static ColumnOptions GetSqlColumnOptions()
    {
        var colOptions = new ColumnOptions();

        colOptions.Store.Remove(StandardColumn.Properties);
        colOptions.Store.Remove(StandardColumn.MessageTemplate);
        colOptions.Store.Remove(StandardColumn.Message);
        colOptions.Store.Remove(StandardColumn.Exception);
        colOptions.Store.Remove(StandardColumn.TimeStamp);
        colOptions.Store.Remove(StandardColumn.Level);

        colOptions.AdditionalDataColumns = new Collection<DataColumn>
        {
            new DataColumn{DataType = typeof(DateTime), ColumnName = "LogTimeStamp"},
            new DataColumn{DataType = typeof(Int32), ColumnName = "RecordNum"},
            new DataColumn{DataType = typeof(string), ColumnName = "ComputerName"},
            new DataColumn{DataType = typeof(DateTime), ColumnName = "ProcessTimeStamp"},
            new DataColumn{DataType = typeof(string), ColumnName = "LogGroup"},
            new DataColumn{DataType = typeof(string), ColumnName = "Type"},
            new DataColumn{DataType = typeof(Int32), ColumnName = "EventId"},
            new DataColumn{DataType = typeof(string), ColumnName = "UserId"},
            new DataColumn{DataType = typeof(Int32), ColumnName = "Line"},
            new DataColumn{DataType = typeof(string), ColumnName = "Description"},
            new DataColumn{DataType = typeof(string), ColumnName = "Source"},
            new DataColumn{DataType = typeof(string), ColumnName = "Data"},
            new DataColumn{DataType = typeof(DateTime), ColumnName = "AddTimestamp"},
            new DataColumn{DataType = typeof(string), ColumnName = "DeviceID"}

        };
        return colOptions;
    }


    public static void WriteError(ApplicationLog infoToLog)
    {
        try
        {        
            _Logger.Error(LogEventLevel.Error,
                    "{LogTimestamp}{RecordNum}{ComputerName}{ProcessTimeStamp}{LogGroup}" +
                    "{Type}{EventId}{UserId}{Line}" +
                    "{Description}{Source}{Data}{AddTimestamp}{DeviceID}",
                    infoToLog.LogTimestamp, infoToLog.RecordNum,
                    infoToLog.ComputerName, infoToLog.ProcessTimestamp,
                    infoToLog.LogGroup, infoToLog.Type,
                    infoToLog.EventId, infoToLog.UserId,
                    infoToLog.Line, infoToLog.Description,
                    infoToLog.Source, infoToLog.Data,
                    infoToLog.AddTimestamp, infoToLog.DeviceId);
        }
        catch(Exception ex)
        {

        }
    }
}

3) 然后我相信我应该可以开始了,我这样设置:

ApplicationLog appLog = new ApplicationLog()
{
    LogTimestamp = DateTime.Now,
    RecordNum = 1,
    ComputerName = Environment.MachineName,
    ProcessTimestamp = DateTime.Now,
    LogGroup = "10",
    Type = "T",
    EventId = 23,
    UserId = Environment.UserName,
    Line = 0,
    Description = "Duplicate Failed to Upload",
    Source = "FooController.cs",
    Data = "DBNAME",
    AddTimestamp = DateTime.Now,
    DeviceId = "15"

};

Logger.WriteError(appLog);

4) 已经在我的数据库中创建了表,只是等待来自日志记录的数据进行填充。

但是,它似乎仍然没有保存在我的 SQL Server 数据库表中。

我想知道我是否遗漏了任何步骤或我在此处设置时做错了什么?

最佳答案

你能否尝试使用 serilog 的 self 记录来查看发生了什么:

如果您使用的是 .net core,请将以下内容放入 Program.main()

Serilog.Debugging.SelfLog.Enable(msg =>
{
Debug.Print(msg);
Debugger.Break();
});

关于c# - 设置 Serilog 以将日志写入 SQL Server 数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46941413/

相关文章:

c# - Composite Stream Wrapper 提供部分 MemoryStream 和完整的原始 Stream

javascript - 将资源文件数据从 Controller 传输到js文件

sql 将多行总计选择为每个 account_ID 一行

mysql - ActiveRecord 如何管理给定列的模型值到适当数据库格式的转换?

c++ - Electron :ui和后端进程在Windows上访问相同的日志文件

c# - 如何获取属性树的踪迹?

c# - 使用整数设置枚举属性并验证参数

sql - 在 SQL Server 中从 base64 字符串转换为 varbinary(max)

java - 如何使用 log4j2 只记录一个级别?

objective-c - 如何在 Dart 中记录当前函数名称?