【发布时间】:2020-01-16 17:48:03
【问题描述】:
有谁知道为什么 Serilog(SQL 接收器)在发布时失败,但在开发中工作?
在我的 .NET 4.7 应用程序中,我想使用 Serilog 将日志记录到 SQL 数据库。过去,只有文件记录可以正常工作。
在开发过程中,我已经开始在我的启动文件中添加以下代码。当我在调试中运行它时,一切正常,并且记录已添加到 SQL 表中。
Serilog 版本:Serilog 2.9.0、Serilog.Sinks.MSSqlServer 5.1.3
ColumnOptions option = new ColumnOptions
{
DisableTriggers = true,
AdditionalColumns = new List<SqlColumn>() { new SqlColumn() { ColumnName = "TraceIdentifier", DataType = SqlDbType.VarChar, DataLength = 50 }, new SqlColumn() { ColumnName = "Action", DataType = SqlDbType.VarChar, DataLength = -1 }, new SqlColumn() { ColumnName = "AppName", DataType = SqlDbType.VarChar, DataLength = 50 }, new SqlColumn() { ColumnName = "UserName", DataType = SqlDbType.VarChar, DataLength = -1 } }
};
option.Store.Remove(StandardColumn.MessageTemplate);
option.Store.Remove(StandardColumn.Properties);
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.MSSqlServer(ConfigurationManager.AppSettings["SqlLogging"], "Logs",
autoCreateSqlTable: true, batchPostingLimit: 1000, period: new TimeSpan(0, 0, 0, 0, 15), columnOptions: option)
//.Enrich.WithProperty("AppName", "Catalogs")
.WriteTo.File(@"D:\Apps\LogCatalog.txt")
.CreateLogger();
一旦代码发布并托管在 IIS 中,它就会返回运行时错误。当我删除 WriteTo.MSSqlServer 时,它运行良好。所以调试之间没有任何变化,但是一旦在服务器上发布,它就会失败。
【问题讨论】:
-
您的问题不清楚您是否也在开发中使用 IIS 进行测试。您也没有提及您的运行时错误的实际细节——错误是什么?在 IIS 中运行的事物与在您的计算机上运行的事物之间的一个主要明显区别是 IIS 应用程序池通常在专用或匿名凭据下运行,这些凭据需要被授予对您要使用的任何数据库的显式权限。特别是,将创建表的权限授予运行网站的帐户并不常见。查看失败的请求跟踪。
-
检查项目的工作 bin 文件夹中是否有 dll 文件。然后查看发布的结果,看是否相同的dll在同一个文件夹和exe文件中。
-
@JeroenMostert 来自 VS2017 我在 IIS Express 中运行。该错误只不过是运行时错误(处理您的请求时发生异常。此外,在执行第一个异常的自定义错误页面时发生另一个异常。请求已终止。)。从服务器访问 SQL 数据库不是问题
-
@jdweng 这些文件都是一样的!
-
发布时,dll 在机器上得到更新,因此它们与构建机器兼容。所以发布必须在管理员模式下完成。文件系统在 IIS 上的访问受限。因此,除非您授予 GUEST Accounts 权限(这是用户授予的默认权限),否则无法访问像 D: 这样的驱动器。因此,与 IIS 机器相比,使用具有完全存储数据权限的网络驱动器可能会更好。
标签: c# .net sql-server serilog