我在一个有多个线程的类中使用log4net,我有一个简单的问题。在log4net.ILog接口上检查属性和调用方法时,是否需要输入readlock/writelock?
我使用的是log4net示例中建议的方法,所以在上述类的顶部,我有:
Private Shared ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(decType) 由于该类涉及多个线程与其交互,因此我有一个ReaderWriterLockSlim实例,我使用它来确保我的变量不会遇到任何争用条件。总而言之,如果我想确保我在练习安全的线程,我需要这样做:
If Me.ReaderWriterLockSlim.TryEnterUpgradableReadLock(-1) Then
If log.IsWarnEnabled Then
If Me.ReaderWriterLockSlim.TryEnterWriteLock(-1) Then
log.Warn("Log Message Here")
Me.ReaderWriterLockSlim.ExitWriteLock()
End If
End If
Me.ReaderWriterLockSlim.ExitUpgradeableReadLock()
End If或者,我可以简单地这样做:
If log.IsWarnEnabled Then log.Warn("Log Message Here")附注:是的,这是一个粗糙的伪代码,实际上我没有一个名为'ReaderWriterLockSlim‘的ReaderWriterLockSlim实例。
发布于 2009-08-27 20:41:21
所以你基本上想知道log4net是否是线程安全的?
从FAQ
是的,log4net是线程安全的。
所以你可以简单地这样做:
If log.IsWarnEnabled Then log.Warn("Log Message Here")发布于 2009-09-11 09:54:16
在上面的示例中,您不需要输入写锁,因为您没有更改IsWarnEnabled的值。此外,调用具有无限超时的TryEnterWriteLock也没有任何意义--您也可以调用ReaderWriterLockSlim.EnterWriteLock。因此,即使Log4Net不是线程安全的(正如其他人所提到的,它是线程安全的),您也只需要编写:
readerWriterLock.EnterReadLock();
try
{
if(log.IsWarnEnabled)
log.Warn("log message here");
}
finally
{
readerWriterLock.ExitReadLock();
}然后,您可以在更改log.IsWarnEnabled的值时输入写锁定。
https://stackoverflow.com/questions/1343602
复制相似问题