我已经使用.NET 4.5& amp为我的worker角色设置了log4net fileappender。 VS2013。
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a" /> </configSections>
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
<file value="Log.txt" />
<appendToFile value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<levelMax value="FATAL" />
</filter>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="FileAppender"/>
</root>
</log4net>
然后使用以下步骤(简要地)在运行时设置日志文件路径。
private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod()。DeclaringType);
设置日志文件路径 - FileAppender.File = RoleEnvironment.GetLocalResource(&#34; LogFileStore&#34;)。RootPath +&#34; Log.txt&#34;
一切正常,日志文件生成成功,消息在工作者角色存储文件夹中写入(LogFileStore - 在.csdef中定义10MB)。
但是当我尝试将日志文件附加到代码中的邮件附件时,它会抛出异常 - &#34;您无法访问该文件,因为它正被另一个进程使用。如何解决?
MailMessage mail = new MailMessage(FromAddress, ToAddress);
SmtpClient client = new SmtpClient();
client.Port = 25;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = true;
client.Host = Host;
mail.Subject = "Error in the Data Load";
mail.IsBodyHtml = true;
var htmlBody = string.Empty;
htmlBody = "Error in Data Load and the Error is : </br></br>";
htmlBody += ErrorMessage;
mail.Body = htmlBody;
mail.Attachments.Add(new Attachment(RoleEnvironment.GetLocalResource("LogFileStore").RootPath + "Log.txt"));
client.Send(mail);
请帮忙。 感谢
巴努•
答案 0 :(得分:0)
您需要使用File.Copy并创建日志文件的副本。发送电子邮件后,删除您创建的临时文件。
File.Copy(RoleEnvironment.GetLocalResource("LogFileStore").RootPath + "Log.txt", RoleEnvironment.GetLocalResource("LogFileStore").RootPath + "LogTemp.txt", true);
编辑:
如果File.Copy不起作用,您可以尝试以下两个选项之一:
1 - 在app.config中log4net配置的“appender”部分,添加
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
这有一些性能开销,因为它需要在每次写入时打开并锁定文件,而不是一直持有锁。
2 - 使用FileShare.ReadWrite将文件内容复制到流中,并将流附加到电子邮件或写入新文件并附加
string logFileText using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (StreamReader streamReader = new StreamReader(fileStream))
{
//read stream to file or directly to memory stream and attach
}