C# 实体框架日志重复
我们正在运行EntityFramework6,有一个DatabaseLogFormatter来格式化数据,它通过NLOGAsyncTargetTrapper记录到一个文件中。该应用程序是一个MVC5 web应用程序 DatabaseLogFormatter大部分是空存根,除了LogCommand和LogResult。两者都能正确格式化数据。到目前为止,非直瞄测井一直没有问题 我们遇到的问题是,在正常运行数小时后(似乎是随机的,无法找到模式),它将创建几乎重复的日志行。一旦启动,它将继续记录每行两到三次。有时它会随机返回到一行 这些行在DatabaseLogFormatter中读取的经过时间上会有所不同,这意味着请求正在重新格式化(而不是NLog问题) 日志输出如何显示的示例C# 实体框架日志重复,c#,entity-framework,nlog,C#,Entity Framework,Nlog,我们正在运行EntityFramework6,有一个DatabaseLogFormatter来格式化数据,它通过NLOGAsyncTargetTrapper记录到一个文件中。该应用程序是一个MVC5 web应用程序 DatabaseLogFormatter大部分是空存根,除了LogCommand和LogResult。两者都能正确格式化数据。到目前为止,非直瞄测井一直没有问题 我们遇到的问题是,在正常运行数小时后(似乎是随机的,无法找到模式),它将创建几乎重复的日志行。一旦启动,它将继续记录每行两
2017-10-22 23:47:22.0611|Debug|REQUEST|Example.Page|POST|/example/page
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|APP|No order or session, creating new session|123456789
Cataklysim的评论以正确的方式指出了这一点 问题是对请求链的所有部分的处理都不正确,存在一个不匹配的情况,即没有处理DbContext对象,并且即使创建了新的DbContext(以及新的记录器),也会使现有记录器保持活动状态,然后两者都会捕获事件并记录日志。测试时它没有在本地显示,因为服务器需要时间来降速和启动新线程以创建多个DBContext
请确保手动(并确保处理整个链)或使用(一次性)处置一次性物品,在其块的末尾调用Dispose。
NLog日志记录到目前为止一直没有问题。
-发生了什么变化?@MarkC。我的措辞不好;它在EF日志记录之外仍然可以正常工作。@muddymess EF引入了重试机制,如果事务超时,它将重试,您应该检查重试设置的默认值。数据库是在同一台服务器上还是在远程服务器上?它是在共享服务器上还是在专用服务器上?@muddymess如果您注意到,Chrome browser等会在HTTP请求超时时重新启动HTTP请求,因此,如果服务器占用率很高,并且没有发送第一个字节,则在超时后,浏览器会重试。这也可以生成相同的EF日志,因为一切都是一样的。如果您扫描HTTP日志,您可能会得到更多帮助。如果可能,可以尝试处置未使用的对象,或者甚至使用使用。您是否尝试记录EF设置的事务?例如:this.DbContext.Database.Log=l=>builder.Append(l)代码>
public class EfDbConfiguration : DbConfiguration
{
public EfDbConfiguration()
{
SetDatabaseLogFormatter((context, action) => new NLogFormatter(context, action));
}
}
public class EfFunctions
{
private readonly EfEntities _db = new EfEntities { Database = { Log = Logger.LogEfRequest } };
//Function calls etc
}
2017-10-22 23:47:22.0611|Debug|REQUEST|Example.Page|POST|/example/page
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.0611|Debug|DB|COMMAND|EXEC [Test].[GetOrder] @OrderNumber = '123456789', @ErrorCode = null,
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|DB|COMPLETED|[Test].[GetOrder]|149ms
2017-10-22 23:47:22.2111|Debug|APP|No order or session, creating new session|123456789