我们的日志有这种奇怪的行为。我们正在使用log4net,这是我们的配置:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
</configSections>
<log4net>
<appender name="LogAppenderinfo" type="log4net.Appender.RollingFileAppender">
<file value="..\log\filename.log" />
<appendToFile value="true" />
<maxSizeRollBackups value="0" />
<maximumFileSize value="10MB" />
<rollingStyle value="Size" />
<staticLogFileName value="true" />
<lockingmodel type="log4net.Appender.FileAppender+MinimalLock"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{MMM dd HH:mm:ss,fffffff}|: %message%newline%exception" />
</layout>
</appender>
<root>
<level value="ALL" />
</root>
<logger name = "filename.log">
<level value="ALL" />
<appender-ref ref="LogAppenderinfo" />
</logger>
</log4net>
</configuration>
以下是我们在代码中使用它的示例:
internal static ILog logm = LogManager.GetLogger("filename.log");
public void WebServerFunction()
{
logm.DebugFormat("INFO |Web server call WebServerFunction for: {0}", param);
logm.DebugFormat("START | WebServerFunction started for: {0}", param);
//some code here then another logging in the end of the function call
logm.DebugFormat("FINISH | WebServerFunction finished for: {0}", param);
}
现在这里是filename.log中的示例输出日志:
Nov 22 17:31:25,6183343|: INFO |Web server call WebServerFunction for: NET_10.10.11.0_24
Nov 22 17:31:25,6183343|: FINISH | WebServerFunction finished for: NET_10.10.11.0_24
Nov 22 17:31:27,6331853|: INFO |Web server call WebServerFunction for: NET_10.10.11.0_24
Nov 22 17:31:27,6488043|: START | WebServerFunction started for: NET_10.10.11.0_24
Nov 22 17:31:27,6488043|: FINISH | WebServerFunction finished for: NET_10.10.11.0_24
正如您在前两行中所述,在记录INFO之后,下一行是FINISH,它跳过了START。然后,对于下一行,START将显示相应的顺序,但有时不会。 INFO将始终显示,但START和FINISH有时不会显示相应的订单。那可能是什么原因呢?
这是基于Stefan回复的更新输出...
Nov 24 12:59:45,2113366|11 : INFO |Web server call WebServerFunction() for: NET_10.191.20.0_24
Nov 24 12:59:45,2113366|11 : START | WebServerFunction started for: NET_10.191.20.0_24
Nov 24 12:59:45,2113366|11 : FINISH | WebServerFunction finished for: NET_10.191.20.0_24
Nov 24 12:59:47,2268842|11 : INFO |Web server call WebServerFunction() for: NET_10.191.20.0_24
Nov 24 12:59:47,2268842|11 : FINISH | WebServerFunction finished for: NET_10.191.20.0_24
Nov 24 12:59:47,2425086|11 : INFO |Web server call WebServerFunction() for: NET_10.191.20.0_24
Nov 24 12:59:47,2425086|11 : FINISH | WebServerFunction finished for: NET_10.191.20.0_24
Nov 24 12:59:49,2580562|11 : INFO |Web server call WebServerFunction() for: NET_10.191.20.0_24
Nov 24 12:59:49,2736806|11 : FINISH | WebServerFunction finished for: NET_10.191.20.0_24
正如你所看到的,只有一个线程正在运行......仍然没有记录START,但始终记录了INFO和FINISH ... BTW,INFO和START只是相邻的陈述,彼此也注意到他们的时间同时记录INFO和FINISH,而在此期间未记录START ...
希望你能就这一个推荐更多的想法...
第二次更新: 我们最终确定了这个原因,原因是没有记录某些日志是因为FileSystemWatcher只是在监听我们的Web服务函数写的相同日志...
以下是代码:
watcher = new FileSystemWatcher(logDirectory, FileName)
{
NotifyFilter = NotifyFilters.LastWrite /*| NotifyFilters.LastAccess | NotifyFilters.Size*/
};
watcher.Changed += OnFileSystemChanged;
watcher.EnableRaisingEvents = true;
对于OnFileSystemChanged:
private static void OnFileSystemChanged(object source, FileSystemEventArgs e)
{
try
{
if (e.ChangeType == WatcherChangeTypes.Changed)
{
var data = ReadFromFileWithRetries(e.FullPath);
if (data != null && data != _prevData)
{
if (data.Length > _prevData.Length)
{
_prevData = data.Remove(0, _prevData.Length);
}
Console.WriteLine(_prevData);
_prevData = data;
}
}
}
catch (Exception exception)
{
var msg = exception.Message;
}
}
所以它基本上只是监听日志文件,然后将日志写入输出......有没有办法在没有FileSystemWatcher干预Web服务日志记录的情况下有序地记录这些日志?
答案 0 :(得分:0)
也许有超过1个线程在工作。将%thread
添加到转换模式中,然后重试。如果您看到不同的线程ID,那么您将知道发生了什么......
答案 1 :(得分:0)
您正在作为Web服务运行,可能在IIS下运行。这是一个Log4Net FAQ,基本答案是:
在你开始尝试提供的任何替代方案之前,先问问自己是否真的需要让多个进程登录到同一个文件,然后不要这样做; - )。
即使使用MinimalLock
,您也会遇到锁争用和丢失消息。这比使用ExclusiveLock的可能性要小。
答案 2 :(得分:0)
唉!我们准确地确定了间歇测井的原因。原因主要是每次有文件打开和关闭文件。谢谢大家的帮助,这对我们有所帮助。