gpt4 book ai didi

c# - 在 hangfire 中运行的 log4net 内部方法的线程错误

转载 作者:行者123 更新时间:2023-11-30 17:41:33 25 4
gpt4 key购买 nike

我用 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 并会销毁 worker,但对我来说,这似乎应该在 hangfire 子系统中进行管理。

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

最佳答案

我想出了解决其他问题的方法。所以最初,Hangfire 表和日志表与系统中的表位于同一个数据库中。我在几次测试中注意到我会遇到连接字符串池错误。我并不是很担心测试代码中的这一点,因为它简化了将要使用的架构版本。无论如何,我的测试是为了锤击数据库来模拟数百万笔交易。在这个测试中,我意识到要减轻一些冲击,我应该将 hangfire 移到它的 DB 上,这将节省连接字符串并移动一些 db 工作,同时我也可以将日志记录移到它的 DB,这将再次将连接字符串保存在池中。

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

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

关于c# - 在 hangfire 中运行的 log4net 内部方法的线程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32784925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com