简体   繁体   English

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

[英]How I can set log4net to log my files into different folders each day?

  1. I want to save all logs during each day in folder named YYYYMMdd - log4net should handle creating new folder depending on system datetime - how I can setup this? 我想每天将所有日志保存在名为YYYYMMdd的文件夹中-log4net应该根据系统日期时间处理创建新文件夹的方法-我该如何设置呢?
  2. I want to save all logs during the day to n files of 1MB - I don't want to rewrite old files but to really have all logs during one day - how I can setup this? 我想将当天的所有日志保存到1MB的n个文件中-我不想重写旧文件,但实际上要在一天中保留所有日志-我该如何设置?

I am usin C# 我是C#

Regards Alex 问候亚历克斯

Try this (It should be OK!): 试试这个(应该没问题!):

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

It will create a logfile named 'logs\\2010\\04\\02.inf.log' (let date be 2010-04-02) 它将创建一个名为“ logs \\ 2010 \\ 04 \\ 02.inf.log”的日志文件(日期为2010-04-02)

Thank you all. 谢谢你们。 We created SortByFolderFileAppender, which inherit from RollingFileAppender 我们创建了SortByFolderFileAppender,该继承自RollingFileAppender

Example of final result: somewhere\\Logs\\20100305\\Client-104615.0 最终结果示例:某处\\ Logs \\ 20100305 \\ Client-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>

I believe, you may create your own appender, based on the FileAppender class. 我相信,您可以基于FileAppender类创建自己的附加程序。 You may need to override the OpenFile method to create a file in the right location. 您可能需要覆盖OpenFile方法才能在正确的位置创建文件。

You could use the rollinglogfileappender which creates files named by date and starts a new file at midnight. 您可以使用rollinglogfileappender创建按日期命名的文件,并在午夜启动一个新文件。 Then just write a script that moves them to a correct map at 00.01. 然后只需编写一个脚本即可将其移动到00.01的正确地图。

As for logging all files during one day with a maximum of 1 MB per file, here's an example: 至于一天内记录所有文件,每个文件最多记录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>

To build from the answer above using the SortByFolderFileAppender. 使用SortByFolderFileAppender从以上答案构建。

This is how we resolved the issue using rolling date for log filenames. 这就是我们使用日志文件名的滚动日期来解决此问题的方式。 I changed the staticLogFileName to true so the entire filename is passed into the OpenFile method. 我将staticLogFileName更改为true,以便将整个文件名传递到OpenFile方法中。

If the filename ends in ".log" then nothing needs to be appended. 如果文件名以“ .log”结尾,则无需附加任何内容。 I'm guessing some kind of locking has occurred and I want log4net to try using the same filename again, hoping the previous lock has been released. 我猜想发生了某种锁定,我希望log4net再次尝试使用相同的文件名,希望以前的锁定已释放。

Although, I'm not sure if this could end up causing an infinite call to OpenFile if the file is locked and won't let go of it. 虽然,我不确定如果文件被锁定并且不会释放它,是否最终会导致对OpenFile的无限调用。 We did create a web service using the producer consumer pattern to log everything in one location from all applications in the system, which is currently ten and growing. 我们确实使用生产者使用者模式创建了一个Web服务,以将一个系统中所有应用程序中的所有内容记录到一个位置,该位置目前正在增加并且还在不断增长。

We don't need to include log4net into any of the other applications but we needed to create a web client class that is accessible by all applications to use for logging to the web service. 我们不需要将log4net包含在任何其他应用程序中,但是我们需要创建一个Web客户端类,所有应用程序都可以访问该客户端类,以用于登录到Web服务。

The result for the filename is "Logs\\Client\\2017\\11\\08.log" and obviously changes everyday. 文件名的结果为“ 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 );
}

Modification of the configuration from above. 从上面修改配置。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM