我如何设置log4net每天将我的文件记录到不同的文件夹?

时间:2010-03-05 09:30:00

标签: c# configuration logging log4net

  1. 我想在每天将所有日志保存在名为YYYYMMdd的文件夹中 - log4net应该根据系统日期时间处理创建新文件夹 - 我如何设置它?
  2. 我希望将白天的所有日志保存到1MB的n个文件中 - 我不想重写旧文件,而是在一天内真正拥有所有日志 - 我如何设置它?
  3. 我在C#中使用

    此致 亚历

5 个答案:

答案 0 :(得分:17)

试试这个(应该没问题!):

<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="logs\\" />
  <appendToFile value="true" />
  <DatePattern value="yyyy\\\\MM\\\\dd'.inf.log'" />
  <rollingStyle value="Date" />
  <param name="StaticLogFileName" value="false" />
  <layout type="log4net.Layout.PatternLayout">
    <header value="[Header]&#13;&#10;" />
    <footer value="[Footer]&#13;&#10;" />
    <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />
  </layout>
</appender>

它将创建一个名为'logs \ 2010 \ 04 \ 02.inf.log'的日志文件(让日期为2010-04-02)

答案 1 :(得分:10)

谢谢大家。 我们创建了SortByFolderFileAppender,它继承自RollingFileAppender

最终结果示例: 某处\日志\ 20100305 \客户104615.0

namespace CustomLogging
{
  public class SortByFolderFileAppender : log4net.Appender.RollingFileAppender
  {
    protected override void OpenFile(string fileName, bool append)
    {
      //Inject folder [yyyyMMdd] before the file name
      string baseDirectory = Path.GetDirectoryName(fileName);
      string fileNameOnly = Path.GetFileName(fileName);
      string newDirectory = Path.Combine(baseDirectory, DateTime.Now.ToString("yyyyMMdd"));
      string newFileName = Path.Combine(newDirectory, fileNameOnly);

      base.OpenFile(newFileName, append);
    }
  }
}
<appender name="SortByFolderFileAppender" type="CustomLogging.SortByFolderFileAppender">
  <file type="log4net.Util.PatternString" value="Logs\Client"/>
  <appendToFile value="true"/>
  <rollingStyle value="Composite"/>
  <datePattern value="-HHmmss"/>
  <maxSizeRollBackups value="40"/>
  <maximumFileSize value="1MB"/>
  <countDirection value="1"/>
  <encoding value="utf-8"/>
  <staticLogFileName value="false"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
  </layout>
</appender>

答案 2 :(得分:1)

我相信,您可以根据FileAppender类创建自己的appender。您可能需要覆盖OpenFile方法以在正确的位置创建文件。

答案 3 :(得分:1)

您可以使用rollinglogfileappender创建按日期命名的文件,并在午夜开始新文件。然后编写一个脚本,将它们移动到00.01的正确地图。

至于在一天内记录所有文件,每个文件最多1 MB,这是一个例子:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="Logging\\MWLog"/>
  <appendToFile value="true"/>
  <rollingStyle value="Composite"/>
  <datePattern value="-yyyyMMdd"/>
  <maxSizeRollBackups value="-1"/>
  <maximumFileSize value="1MB"/>
  <countDirection value="1"/>
  <encoding value="utf-8"/>
  <staticLogFileName value="false"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
  </layout>
</appender>

答案 4 :(得分:1)

使用SortByFolderFileAppender从上面的答案构建。

这是我们使用日期文件名的滚动日期解决问题的方法。我将staticLogFileName更改为true,因此将整个文件名传递给OpenFile方法。

如果文件名以“.log”结尾,则无需附加任何内容。我猜测发生了某种锁定,我希望log4net再次尝试使用相同的文件名,希望以前的锁已被释放。

虽然,我不确定如果文件被锁定并且不会放弃它,这最终是否会导致对OpenFile的无限调用。我们确实使用生产者消费者模式创建了一个Web服务,以便将系统中所有应用程序的所有应用程序记录在一个位置,这些应用程序目前正在增长

我们不需要将log4net包含在任何其他应用程序中,但我们需要创建一个Web客户端类,所有应用程序都可以访问该类以用于登录Web服务。

文件名的结果是“Logs \ Client \ 2017 \ 11 \ 08.log”,并且每天都会发生变化。

protected override void OpenFile( string fileName, bool append )
{
    // append "\yyyy\mm\dd.log" to create the correct filename.
    if ( !fileName.EndsWith( ".log") )
        fileName = $@"{fileName}\{DateTime.Now:yyyy\\MM\\dd}.log";

    base.OpenFile( fileName, append );
}

从上面修改配置。

<appender name="xxxRollingFileAppender" type="namespace.xxxRollingFileAppender">
    <file value="Logs\Client"/>
    <staticLogFileName value="true"/>
    <appendToFile value="true"/>
    <maxSizeRollBackups value="40"/>
    <maximumFileSize value="1MB"/>
    <encoding value="utf-8"/>
    <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="%date{HH:mm:ss.fff}|%-5level|%message%newline"/>
    </layout>
</appender>