我在asp.net 2.0应用程序中使用NLog;它可以获得大量流量并记录大量数据(平均每天约5000条日志记录),用于错误记录和统计目的。它使用两个不同的数据库目标,每个目标调用一个存储过程,并且都使用相同的连接字符串(SQL Server)。
从某些文档中复制了目标定义后,两个目标都将 keepConnection 设置为“true”,我知道这是默认值。我的问题是,这是可取的吗?我经常看到NLog在数据库上打开了很多打开的连接(查看活动监视器中的打开进程),而且,我有时会遇到连接失败NLOG;我很想尝试关闭keepConnection,但我也担心大量的开启和关闭操作。我没有查看源代码,我不确定我是否能够回答我自己的问题,所以我不确定连接相对于其父应用程序所在的池是如何工作的。
有任何想法,警告或建议吗?我知道我的问题有点模糊 - 它只是帽子我找不到这个属性的简单文档,并希望得到一些反馈的优缺点 - 即,为什么它被放入NLog中第一名? 谢谢。
答案 0 :(得分:2)
传统上,keepConnection已经启用,因为你说的确切原因,快速打开/关闭大量连接会很糟糕。如果禁用,NLog将打开一个连接,写一个单独的日志语句,并关闭每个连接。
如果要关闭连接,可以始终使用包装器通过批量编写日志来提高日志记录性能
检查异步缓冲区:https://github.com/nlog/nlog/wiki/AsyncWrapper-target
默认批量大小为100,这对您来说可能很好。在这种情况下,可以禁用keepConnection。有了这个,NLog将排队100条日志消息,然后打开一个连接,全部写入,然后关闭连接。
此外,每天5000对于日志记录来说真的很低,达到4对数/分钟,当然不是重负荷。听起来像是其他错误。
首先想到的是您使用的SQL Server通常需要进行交易。默认情况下,它在NLog中被禁用,因此请务必在日志配置中明确启用事务。
useTransactions=true