【发布时间】:2012-06-01 18:17:25
【问题描述】:
我有一个 WCF 服务,其中我使用 Log4Net 将信息记录到 Sql Server 数据库。我使用 Log4Net 的 GlobalContext 来记录一些额外的信息,例如事务名称、状态、消息和其他一些内容。该系统中的一些重要事务是读取、写入和登录。
日志应如下所示:
- “读取”--------“成功”--------“读取 xxx 客户数据”
- “写入”--------“成功”--------“写入 xxx 客户的数据”
- “登录”--------“失败”--------“用户会话已存在。”
当我运行正常测试时,一切正常 - 日志完美地写入数据库。但是,最近我使用 JMeter 进行了负载测试。上面提到的三个事务在 100 个并发线程中测试了 3 分钟。当我查看数据库日志时,我发现有些信息被错误地记录了。
例如:
- “读取”--------“成功”--------“用户会话已存在。”
- “写入”--------“成功”--------“读取 xxx 客户数据”
这是 Log4Net GlobalContext 不是线程安全的问题吗?我尝试使用 ThreadContext 而不是 GlobalContext,但似乎没有记录很多信息。
【问题讨论】:
-
看起来消息在写入数据库期间混淆了,因为您确实同时写入数据库。您需要使用调试器仔细查看并检查整个链。
-
GlobalContext 根据 doc logging.apache.org/log4net/release/manual/contexts.html 是线程安全的
-
@Mark:我已经看到了。但是,我面临的问题迫使我思考不同!!!
-
可以发一些示例代码吗?
-
我一直认为线程安全意味着这些方法在从多个线程调用时不会崩溃或抛出异常,但由于存储是全局的,一个线程中的更改会影响其他线程。所以你的结果是我所期望的。至于 threadContext 也不起作用,我认为这是一个常见问题,由 thread agility 引起,您认为单个进程可以在线程之间切换。你可以在这里阅读更多内容blog.marekstoj.com/2011/12/…。
标签: c# wcf log4net log4net-appender