1

log4netを使用して、1つのアプリケーション(VB.NETで記述されたコンソールアプリ)のログシステムをオーバーホールしようとしています。このCodeProjectチュートリアル
に従ってlog4netを構成しました。構成後、次のログの初期化によって空のログが作成されることがわかりました(結果のフォルダー構造は正しく、正しい日付のテキストファイルが作成されますが、ファイルは空です)。

Private ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(Reflection.MethodBase.GetCurrentMethod().DeclaringType)

ただし、次の行を使用すると、正しくログに記録されます。

Private ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger("VSED")

私のメインモジュールでは、次のようなエラーをログに記録しています。

log.Error("Test error!")

そして、私は次のようにアセンブリをロードしています:

<Assembly: log4net.Config.XmlConfigurator(Watch:=True)> 

以下は私のapp.configファイルです:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
      <file value="logs\" />
      <datePattern value="dd.MM.yyyy'.log'" />
      <appendToFile value="true" />
      <rollingStyle value="Composite" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="100KB" />
      <staticLogFileName value="false" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] – %message%newline" />
      </layout>
    </appender>
    <logger name="VSED">
      <level value="DEBUG"/>
      <appender-ref ref="RollingFileAppender"/>
    </logger>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="INFO"/>
      <levelMax value="FATAL"/>  
    </filter>
  </log4net>
    <system.diagnostics>
        <sources>
            <!-- This section defines the logging configuration for My.Application.Log -->
            <source name="DefaultSource" switchName="DefaultSwitch">
                <listeners>
                    <add name="FileLog"/>
                    <!-- Uncomment the below section to write to the Application Event Log -->
                    <!--<add name="EventLog"/>-->
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="DefaultSwitch" value="Information" />
        </switches>
        <sharedListeners>
            <add name="FileLog"
                 type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" 
                 initializeData="FileLogWriter"/>
            <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
            <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
        </sharedListeners>
    </system.diagnostics>
</configuration>

これも問題ですか?リフレクションではなく、このロガー(名前を明示的に示す)を複数のクラスで使用すると、問題が発生しますか?

基本的に、私はそれが好ましい方法で機能しない理由を知りたいだけです。app.configが正しくありませんか?私は何か他のことを間違ってやっていますか?

皆さん、ありがとうございました!

4

1 に答える 1

1

VSEDからのメッセージのみをログに記録しています。Reflection.MethodBase.GetCurrentMethod().DeclaringTypeおそらく、VSEDではありませんがsomething.VSED。これが、ロガーが出力を提供しない理由です。が何であるかReflection.MethodBase.GetCurrentMethod().DeclaringTypeを確認し、その名前でロガーを作成します。

これにより、すべてのロガーからの出力が得られます。

<root>
    <level value="DEBUG" />
    <appender-ref ref="RollingLogFileAppender" />
</root>
于 2013-03-26T16:54:21.737 に答える