【问题标题】:Threading error with log4net inside method running in hangfire在hangfire中运行的log4net内部方法的线程错误
【发布时间】:2015-09-25 14:51:59
【问题描述】:

我用hangfire运行进程,重复任务。这些任务设置为每分钟启动一次,并处理数据库中的数千行。

我让它们在我的测试环境中顺利运行,直到我在这些方法中添加了 log4net 日志记录。现在 log4net 抛出一个线程错误。

log4net:ERROR Failed to append to appender [AdoNetAppender]
System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken)
   at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken)
   at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
log4net:ERROR Exception while logging
System.Threading.ThreadAbortException: Thread was being aborted.
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
   at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
log4net:ERROR Failed to append to appender [AdoNetAppender]
System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken)
   at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken)
   at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
log4net:ERROR Exception while logging
System.Threading.ThreadAbortException: Thread was being aborted.
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
   at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)

不确定如何解决这个问题?

我已经读过,对于后台线程,您可以设置 IsBackground=true 并将销毁工作人员,但对我来说,这似乎是在 hangfire 子系统中管理。

我更关心从 log4net 修复它或以不同的方式编写方法。请注意,这是测试项目,但在真实环境中我不会直接调用 log4net,它将被包装在 LoggingService 中。对于这个测试,我只是想保持简单。除非我别无选择。

【问题讨论】:

    标签: c# multithreading log4net hangfire


    【解决方案1】:

    我想通了这个办法。所以最初,Hangfire 表和日志表与系统中的表一起在同一个数据库中。我注意到在几次测试中我会遇到连接字符串池错误。我并没有真正担心测试代码中的这一点,因为它简化了架构的简化版本。无论如何,我的测试旨在敲击数据库以模拟数百万笔交易。在这个测试中,我意识到为了减轻一些锤击,我应该将hangfire移动到它的数据库上,这将节省连接字符串并移动一些数据库工作,同时我也可以将日志记录移动到它的数据库,这将再次将连接字符串保存在池中。

    我说我偶然发现了这一点,因为当我决定这样做时,我并没有考虑记录。所以当我再次运行我的测试代码时,我决定取消注释我在hangfire执行的方法中的直接日志记录,它按照我最初提出问题时的预期方式工作。

    长话短说,请记住连接字​​符串在不同的线程上运行,将 DB 分开会带来隐藏的线程优势。这是一个非常简单的测试应用程序,而不是我将在生产中运行的代码,但我也可能在那里遇到同样的问题。很快就会发现,因为真正的架构开发几乎可以进行测试了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多