无法使用 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 从 HttpContext 访问用户声明以进行日志记录
解决错误 - 无法解析“Serilog.ILogger”类型的服务