通过电子邮件发送log4net日志作为System.Net.Mail.Attachment抛出IOException(进程已锁定)

Ian*_*ien 7 .net c# system.net.mail email-attachments

我想将当前log4net日志作为电子邮件附件发送,System.Net.Mail.Attachment但是当我传入文件路径时,IOException会抛出一个.

Attachment mailAttachment = new Attachment(logPath);
Run Code Online (Sandbox Code Playgroud)

该进程无法访问文件'C:\ Log\log4net.log',因为它正由另一个进程使用

appender配置如下所示:

<appender name="RootRollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="C:\Log\log4net.log" />
    <param name="AppendToFile" value="true" />
    <param name="MaxSizeRollBackups" value="10" />
    <param name="MaximumFileSize" value="10024KB" />
    <param name="RollingStyle" value="Size" />
    <param name="StaticLogFileName" value="true" />
    <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date [%username|%thread] %-5level %logger: %message%newline" />
    </layout>
</appender>
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题?我可以复制出日志文件或以某种方式从锁定过程中释放它吗?

Des*_*tar 16

<appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="${TMP}\log-file.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>
Run Code Online (Sandbox Code Playgroud)

使用<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />将告诉log4net仅在执行实际写入时将文件锁定一小段时间.有一点性能损失,但允许你做一些事情,比如将它作为附件添加更容易.

否则,log4net将在进程运行时无限期地锁定文件.