无法使用 Serilog 登录 MS SQL

Posted

技术标签:

【中文标题】无法使用 Serilog 登录 MS SQL【英文标题】:Unable to log in MS SQL using Serilog 【发布时间】:2016-05-12 17:32:04 【问题描述】:

我正在使用带有 MSSqlServer 接收器的 Serilog。即使我遵循了Serilog.Sinks.MSSqlServer 中提到的所有步骤,我仍然无法在 SQL 表中记录任何消息。如果您能告诉我我错过了哪些部分或配置不正确,我真的很感激?

这是我项目中的配置代码部分:

public ILogger Logger = null;

private ColumnOptions _columnOptions = new ColumnOptions

    AdditionalDataColumns = new Collection<DataColumn>
    
        new DataColumn()  AllowDBNull = true, ColumnName = "CreatedBy",DataType = typeof (Guid) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "CreatedDate",DataType = typeof (DateTime),
        new DataColumn()  AllowDBNull = true, ColumnName = "StatusID",DataType = typeof (byte),
        new DataColumn()  AllowDBNull = true, ColumnName = "ModifiedBy",DataType = typeof (Guid) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "ModifiedDate",DataType = typeof (DateTime) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "Version",DataType = typeof (Guid) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "SessionID", DataType = typeof(string) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "Username", DataType = typeof(string) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "IsAuthenticated", DataType = typeof(bool) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "ClientIPAddress", DataType = typeof(string) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "ControllerName", DataType = typeof(string) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "ActionName", DataType = typeof(string) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "GetParameters", DataType = typeof(string) ,
        new DataColumn()  AllowDBNull = true, ColumnName = "Request", DataType = typeof(string) ,
    ,
;

Logger = new LoggerConfiguration().WriteTo.MSSqlServer(
                connectionString: ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString(),
                period: TimeSpan.Zero,
                batchPostingLimit: 5,
                autoCreateSqlTable: false,
                tableName: "Logs",
                restrictedToMinimumLevel: LogEventLevel.Verbose,
                columnOptions: _columnOptions)
            .CreateLogger();

这是我正在使用的消息模板:

public const string AuditMessageTemplate = "SessionID, Username, IsAuthenticated, ClientIPAddress, ControllerName, ActionName, GetParameters, Request, CreatedBy, CreatedDate, StatusID, ModifiedBy, ModifiedDate, Version";

为了测试它,我编写了以下代码:

for (int i = 0; i < 200; i++)

    AuditLogger.Instance.Information(LoggerParameters.AuditMessageTemplate, auditLog.SessionID,auditLog.Username, auditLog.IsAuthenticated, auditLog.ClientIPAddress, auditLog.ControllerName,auditLog.ActionName, auditLog.GetParameters, auditLog.Request, auditLog.CreatedBy, auditLog.CreatedDate, auditLog.StatusID, auditLog.ModifiedBy, auditLog.ModifiedDate, auditLog.Version);

这是一些运行时信息:

这是我正在使用的程序集:

Serilog 1.5.0.0 Serilog.FullNetFx 1.5.0.0 Serilog.Sinks.MSSqlServer 3.0.0.0

【问题讨论】:

你能连接SelfLog 并从那里附加任何输出吗?说明:github.com/serilog/serilog/wiki/Debugging-and-Diagnostics - 谢谢! 感谢您的评论@NicholasBlumhardt,我已经设法找到了根本原因并解决了问题。这是记录的异常: System.ArgumentException: Guid 应包含 32 位数字和 4 个破折号 (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。无法在 CreatedBy 中存储 柱子。再次感谢。 @NicholasBlumhardt 我连接到自我日志,它根本没有输出任何东西。 (我有同样的问题)。你遇到过什么吗? 【参考方案1】:

早安,

向我的数据库中的日志表添加其他列时,我遇到了同样的问题。我发现,在定义日期类型 Guid 的数据列对象时,它不会记录。一旦我将数据类型更改为字符串,它就可以正常工作了。

例子:

new DataColumn()  AllowDBNull = true, ColumnName = "CreatedBy",DataType = typeof (Guid) ,

new DataColumn()  AllowDBNull = true, ColumnName = "CreatedBy",DataType = typeof (string) ,

我知道这并不理想,因为我也想使用 Guid 而不是字符串。

【讨论】:

以上是关于无法使用 Serilog 登录 MS SQL的主要内容,如果未能解决你的问题,请参考以下文章

SeriLog 使用经典 .net 框架从 sql server 读取属性值

Serilog 的 AddSerilog 无法识别

无法使用 Serilog 从 HttpContext 访问用户声明以进行日志记录

解决错误 - 无法解析“Serilog.ILogger”类型的服务

如何使用 serilog 在 kibana 中通过身份验证将日志设置为 ELK

无法将类型字符串隐式转换为 serilog.formatting.ITextformatter