如何访问Azure辅助角色中的log4net日志文件?

时间:2016-07-20 15:43:13

标签: azure azure-worker-roles

我已经使用.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);

请帮忙。 感谢

巴努•

1 个答案:

答案 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
}