Sitecore自定义日志,如何每天只写入一个文件?

Sitecore自定义日志,如何每天只写入一个文件?,sitecore,log4net,sitecore7.2,Sitecore,Log4net,Sitecore7.2,我们已经实现了一个自定义日志并将其写入自定义日志文件。 问题是,日志一天创建几次,文件名如下: MyCustom.log.20161208.165109 MyCustom.log.20161208.165845 MyCustom.log.20161208.175134 MyCustom.log.20161208.184432 <appender name="MyCustomLogAppender" type="log4net.Appender.SitecoreLogFileApp

我们已经实现了一个自定义日志并将其写入自定义日志文件。 问题是,日志一天创建几次,文件名如下:

MyCustom.log.20161208.165109
MyCustom.log.20161208.165845
MyCustom.log.20161208.175134
MyCustom.log.20161208.184432
    <appender name="MyCustomLogAppender" type="log4net.Appender.SitecoreLogFileAppender, Sitecore.Logging">
  <file value="$(dataFolder)/logs/MyCustom.log.{date}.txt" />
  <appendToFile value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%4t %d{ABSOLUTE} %-5p %m%n" />
  </layout>
  <encoding value="utf-8" />
</appender>
定义如下:

MyCustom.log.20161208.165109
MyCustom.log.20161208.165845
MyCustom.log.20161208.175134
MyCustom.log.20161208.184432
    <appender name="MyCustomLogAppender" type="log4net.Appender.SitecoreLogFileAppender, Sitecore.Logging">
  <file value="$(dataFolder)/logs/MyCustom.log.{date}.txt" />
  <appendToFile value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%4t %d{ABSOLUTE} %-5p %m%n" />
  </layout>
  <encoding value="utf-8" />
</appender>


谁能告诉我需要配置什么,以便每天只接收一个文件?或者换句话说,什么时候创建新文件?

如果覆盖SitecoreLogFileAppender的标准行为并创建从FileAppender继承的新CustomLogFileAppender类,则可以轻松克服此问题。遗憾的是,SitecoreLogFileAppender不允许您仅覆盖您需要根据需要修改的特定方法。因此,您需要将所有代码从SitecoreLogFileAppender复制到新创建的文件appender中

名称空间MyProject.Core
{
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Runtime.InteropServices;
使用System.Web;
使用log4net.Appender;
使用log4net.spi;
/// 
///自定义日志文件追加器
/// 	
公共类CustomLogFileAppender:FileAppender
{
/// 
///m_当前日期
/// 
私有日期时间m_currentDate;
/// 
///m_原始文件名
/// 
私有字符串m_originalFileName;
/// 
///初始化类的新实例。
/// 
公共CustomLogFileAppender()
{
this.m_currentDate=DateTime.Now;
}
/// 
///获取或设置该文件。
/// 
/// 
///档案。
/// 
公共重写字符串文件
{
得到
{
返回base.File;
}
设置
{
if(this.m_originalFileName==null)
{
字符串str=值;
Dictionary variables=ConfigReader.GetVariables();
foreach(variables.Keys中的字符串索引)
{
字符串oldValue=“$(“+index+”);
str=str.Replace(oldValue,变量[索引]);
}
this.m_originalFileName=this.MapPath(str.Trim());
}
base.File=this.m_originalFileName;
}
}
/// 
///走这条路。
/// 
///第1部分。
///第二部分。
///分离器。
/// 
///完整路径。
/// 
公共静态字符串生成路径(字符串部分1、字符串部分2、字符分隔符)
{
if(string.IsNullOrEmpty(part1))
{
返回第2部分??字符串。空;
}
if(string.IsNullOrEmpty(第2部分))
{
返回第1部分??字符串。空;
}
if((int)part1[part1.Length-1]=(int)分隔符)
{
part1=part1.子字符串(0,part1.长度-1);
}
if((int)part2[0]==(int)分隔符)
{
第2部分=第2部分。子字符串(1);
}
返回part1+(对象)分隔符+part2;
}
/// 
///追加指定的日志记录事件。
/// 
///日志记录事件。
受保护的覆盖无效附加(LoggingEvent LoggingEvent)
{
DateTime now=DateTime.now;
如果(this.m_currentDate.Day!=now.Day | this.m_currentDate.Month!=now.Month | this.m_currentDate.Year!=now.Year)
{
锁(这个)
{
这个.CloseFile();
this.m_currentDate=DateTime.Now;
this.OpenFile(string.Empty,false);
}
}
base.Append(loggingEvent);
}
/// 
///打开文件。
/// 
///文件名。
///如果设置为true[append]。
受保护的覆盖void OpenFile(字符串文件名,bool append)
{
fileName=this.m_originalFileName;
fileName=fileName.Replace(“{date}”),this.m_currentDate.ToString(“yyyyMMdd”);
fileName=fileName.Replace(“{time}”),this.m_currentDate.ToString(“HHmmss”);
fileName=fileName.Replace(“{processid}”,CustomLogFileAppender.GetCurrentProcessId().ToString());
base.OpenFile(文件名,追加);
}
/// 
///获取当前进程标识符。
/// 
/// 
///进程Id。
/// 
[DllImport(“kernel32.dll”,SetLastError=true)]
私有静态外部程序int GetCurrentProcessId();
/// 
///获取定时文件的名称。
/// 
///文件名。
/// 
///带有时间戳的文件名。
/// 
私有字符串GetTimedFileName(字符串文件名)
{
int num=fileName.LastIndexOf('.');
if(num<0)
{
返回文件名;
}
返回
字符串。Concat(
新对象[4]
{
(对象)fileName.Substring(0,num),(对象)'.',(对象)this.m_currentDate.ToString(“HHmmss”),
(对象)fileName.Substring(num)
});
}
/// 
///确定指定的文件名是否已锁定。
/// 
///文件名。
/// 
///锁不锁。
/// 
私有布尔值已锁定(字符串文件名)
{
如果(!System.IO.File.Exists(fileName))
{
返回false;
}
尝试
{
FileStream FileStream=System.IO.File.OpenWrite(文件名);
if(fileStream==null)