1

我正在尝试使用 log4net 彻底检查一个应用程序(用 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 回答