【问题标题】:Log4net issue with RollingFileAppenderRollingFileAppender 的 Log4net 问题
【发布时间】:2026-01-30 01:30:01
【问题描述】:

以下是代码:

  <log4net debug="lse">
    <!-- Define some output appenders -->
    <appender name="trace" type="log4net.Appender.TraceAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n"/>
      </layout>
    </appender>
    <!-- Add StrcuturedFN logger-->
    <appender name="StructuredFNLoggerAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\Log.txt"/>
      <param name="AppendToFile" value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="10MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p %d{yyyy-MM-dd hh:mm:ss:ff} - %m%n"/>
      </layout>
    </appender>

    <!-- Setup the root category, add the appenders and set the default priority -->
    <root>
      <priority value="WARN"/>
      <appender-ref ref="StructuredFNLoggerAppender"/>
    </root>

    <logger name="StructuredFNLogger.Logging">
      <level value="ALL"/>
      <appender-ref ref="StructuredFNLoggerAppender"/>
    </logger>

  </log4net>

记录器正在记录,但当文件大小超过 10MB 时不会创建新文件。

【问题讨论】:

  • 为什么要引用根中的appender和StructuredFNLogger.Logging logger?

标签: asp.net configuration log4net


【解决方案1】:

这是一个滚动文件附加程序的工作示例:

<log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="../Logs/Web-Log.xml"/>
        <appendToFile value="true"/>
        <rollingStyle value="Size"/>
        <maxSizeRollBackups value="10"/>
        <maximumFileSize value="10MB"/>
        <layout type="log4net.Layout.XmlLayout">
            <param name="Prefix" value=""/>
        </layout>
    </appender>

    <root>
        <level value="ALL"/>
        <appender-ref ref="FileAppender"/>
    </root>
</log4net>

【讨论】:

  • 仅供参考,您的代码块隐藏了 appender 定义,所以在发布之前我没有注意到它。你的 appender 和我的很相似,所以这可能没什么帮助。
【解决方案2】:

也许这会有所帮助;这是使用 RollingFileAppender 的工作应用配置的一部分。

<log4net>
        <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="child" />
            <param name="CountDirection" value="1" />
            <param name="MaximumFileSize" value="10MB" />
            <param name="MaxSizeRollBackups" value="-1" />
            <param name="DatePattern" value=".yyyy-MM-dd" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="Header" value="DateTime    Thread  Level   Logger  Message%newline" />
                <param name="ConversionPattern" value="%d   %t  %-5p    %c  %m%n" />
            </layout>
        </appender>
        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <param name="File" value="delivery.log" />
            <param name="AppendToFile" value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="Header" value="DateTime    Thread  Level   Logger  Message%newline" />
                <param name="ConversionPattern" value="%d   %t  %-5p    %c  %m%n" />
            </layout>
        </appender>
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
            </layout>
        </appender>
        <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
            <param name="Threshold" value="ERROR" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="[%thread] %-5level %logger%newline%message" />
            </layout>
        </appender>     
        <!--
        <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender" >
            <param name="Threshold" value="FATAL" />
            <param name="SmtpHost" value="-fill in-" />
            <param name="Subject" value="FUSION RIS Delivery Service " />
            <param name="To" value="-fill in-" />
            <param name="From" value="-fill in-" />
            <param name="Lossy" value="false" />
            <param name="BufferSize" value="1" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%newline%d [%thread] %-5level %logger%newline%message" />
            </layout>
        </appender>     
        -->
        <root>
            <level value="WARN" />
            <appender-ref ref="ConsoleAppender" />
            <appender-ref ref="RollingFileAppender" />
            <appender-ref ref="EventLogAppender" />
            <!--<appender-ref ref="LogFileAppender" />-->
            <!--<appender-ref ref="SmtpAppender" />-->
        </root>
    </log4net>

【讨论】:

    【解决方案3】:

    打开内部调试,看看是否有不应该发生的事情。

    来自log4net FAQ

    有 2 种不同的方式来启用 log4net 中的内部调试。这些 下面列出。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <appSettings>
            <add key="log4net.Internal.Debug" value="true"/>
        </appSettings>
    </configuration>
    

    首选方法 是指定 log4net.Internal.Debug 选项中的 应用程序的配置文件。

    也可以启用内部调试 通过在 应用程序的配置文件(不是 log4net 配置文件,除非 log4net 配置数据嵌入在 应用程序的配置文件)。这 log4net.Internal.Debug 应用程序 设置必须设置为值 true。 例如: 立即读取此设置 启动将导致所有内部 调试要发出的消息。

    启用 log4net 的内部调试 以编程方式,您需要设置 log4net.Util.LogLog.InternalDebugging 属性为真。显然越早 这是设置的更多调试将 产生。内部调试消息 被写入控制台和 System.Diagnostics.Trace 系统。如果 该应用程序没有 控制台记录在那里的消息将 迷失。请注意,应用程序可以 通过设置重定向控制台流 System.Console.Out。痕迹 系统默认发送 发送到附加调试器的消息(其中 消息将出现在输出中 窗户)。如果进程没有 附加的调试器,然后是消息 被发送到系统调试器。一种 像 DebugView 这样的实用程序 http://www.sysinternals.com 可能是 用于捕获这些消息。

    由于 log4net 内部调试消息是 写给 System.Diagnostics.Trace 系统 可以将这些消息重定向到 一个本地文件。您可以定义跟踪 通过将以下内容添加到侦听器 您的应用程序的 .config 文件:

    <configuration>
        ...
    
        <system.diagnostics>
            <trace autoflush="true">
                <listeners>
                    <add 
                        name="textWriterTraceListener" 
                        type="System.Diagnostics.TextWriterTraceListener"
    
                        initializeData="C:\tmp\log4net.txt" />
                </listeners>
            </trace>
        </system.diagnostics>
    
        ... </configuration> 
    

    确保运行您的进程 应用程序有权写入 这个文件。

    【讨论】: