Log4Net不会100%记录日志

时间:2013-06-27 16:29:09

标签: c# .net wpf logging log4net

我遇到一些问题,让log4net记录我告诉它的所有内容。看来这真的取决于我拨打log.Info()电话的位置;如果我把它放在正确的地方,它可以工作,有时则不然。

这是我的配置文件:

<?xml version="1.0"?>
    <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
        </configSections>
        <appSettings>
            <add key="log4net.Internal.Debug" value="true" />
            <add key="ClientSettingsProvider.ServiceUri" value="" />
        </appSettings>
        <log4net>
            <root>
                <level value="ALL" />
                <appender-ref ref="rollingFileAppender" />
            </root>
            <appender name="rollingFileAppender" type="log4net.Appender.RollingFileAppender">
                <file value="C:\binoptics\VICLogs\VICLog.txt" />
                <appendToFile value="true" />
                <rollingStyle value="Size" />
                <maxSizeRollBackups value="50" />
                <maximumFileSize value="50MB" />
                <staticLogFileName value="true" />
                 <layout type="log4net.Layout.PatternLayout">
                     <conversionPattern value="%date %-5level - %message - %exception - %newline" />
                 </layout>
             </appender>
         </log4net>
         <system.web>
             <membership defaultProvider="ClientAuthenticationMembershipProvider">
                 <providers>
                     <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
                 </providers>
             </membership>
             <roleManager enabled="true" defaultProvider="ClientRoleProvider">
                 <providers>
                     <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
                 </providers>
             </roleManager>
         </system.web>
         <startup>
             <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
         </startup>
</configuration>

以下是调用log.Info()方法的客户端类:

在使用中:

using System.Reflection;
using log4net;

在我的字段声明中:

private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

调用方法(这非常有效):

    MessageBox.Show(
        "Hello " + LoginManager.CurrentUserData[1].ToString() + "!\n\n" +
        "Welcome to the BinOptics Visual Inspection Console.",
        "Login Successful!", MessageBoxButton.OK, MessageBoxImage.Exclamation);
    WaferTrackerWindow wtw = new WaferTrackerWindow();
    wtw.Show();
    log.Info(
        LoginManager.CurrentUserData[1].ToString() +
        " has successfully logged in. ");
    return "Exit";

之前的方式(这不起作用):

    log.Info(
        LoginManager.CurrentUserData[1].ToString() +
        " has successfully logged in. ");
    MessageBox.Show(
        "Hello " + LoginManager.CurrentUserData[1].ToString() + "!\n\n" +
        "Welcome to the BinOptics Visual Inspection Console.",
        "Login Successful!", MessageBoxButton.OK, MessageBoxImage.Exclamation);
    WaferTrackerWindow wtw = new WaferTrackerWindow();
    wtw.Show();
    return "Exit";

在第二个示例中,根本没有抛出异常,但log.Info()调用不起作用。我甚至在log.Info()行上放置了一个断点;它在那次调用中正常运行,一切正常,但随后我检查了我的日志文件并且该行从未写过。

在这个具体的例子中,我很幸运,因为我有一些灵活性来放置log.Info()调用;在同一个项目的其他课程中,我没有那种灵活性,而且电话只能在一个特定的位置。

这里发生了什么?无论如何我可以解决这个问题吗?每次写入后我是否需要刷新文件?任何帮助将不胜感激!!

此致

凯尔

1 个答案:

答案 0 :(得分:3)

我认为正在发生的事情是MessageBox.Show()阻塞了你的线程。如果你绝对需要一个弹出窗口,你应该尝试创建一个非模态对话框来替换MessageBox.Show()

在我个人看来,我不喜欢点击任何东西继续使用某个程序,所以我会用NotifyIcon或类似的东西替换它并在其上显示消息。