1

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";

この 2 番目の例では、例外はまったくスローされませんが、log.Info() 呼び出しは機能しません。log.Info() 行にブレークポイントを配置しました。その呼び出しですぐに壊れ、すべてが正常に実行されますが、ログファイルを確認すると、その行は書き込まれませんでした。

この特定の例では、 log.Info() 呼び出しを柔軟に配置できるので幸運です。この同じプロジェクトの他のクラスでは、そのような柔軟性はなく、呼び出しは特定の 1 つの場所にしかできません。

ここで何が起こっているのですか?とにかくこれを修正できますか?書き込みごとにファイルをフラッシュする必要がありますか? どんな助けでも大歓迎です!!

よろしく、

カイル

4

1 に答える 1

3

MessageBox.Show() がスレッドをブロックしていると思います。どうしてもポップアップが必要な場合は、非モーダル ダイアログを作成して MessageBox.Show() を置き換える必要があります。

私の個人的な意見では、プログラムの使用を継続するために何かをクリックする必要があるのは嫌いなので、これを NotifyIcon などに置き換えて、その上にメッセージを表示します。

于 2013-06-27T16:47:41.290 に答える