首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何以编程方式强制log4net释放日志文件以便访问?

如何以编程方式强制log4net释放日志文件以便访问?
EN

Stack Overflow用户
提问于 2019-05-23 00:52:33
回答 2查看 967关注 0票数 1

我需要在大型进程执行后发送一封电子邮件,并将日志文件作为附件,以便用户可以识别任何问题。我们使用log4net来处理所有的日志记录,但我还没能让log4net释放该文件,以便将其作为附件添加。

到目前为止,我关注了这个问题的结果:How to stop log4net from logging and release the last file关于将附加器阈值设置为"Off",但由于DLL没有释放日志文件,我继续收到异常。我可以在调试器中验证附加器实际上处于“关闭”状态,但是进程资源管理器确认我的exe仍然持有对该文件的锁定。

下面是我从链接问题中得到的方法:

 private static void SetThreshold(string appenderName, log4net.Core.Level threshold)
        {
            foreach (log4net.Appender.AppenderSkeleton appender in log4net.LogManager.GetRepository().GetAppenders())
            {
                if (appender.Name == appenderName)
                {
                    appender.Threshold = threshold;
                    break;
                }
            }
        }

任何如何强制释放此日志的想法都将非常有帮助。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-23 03:33:48

使用我从同事那里得到的以下代码块,我能够获得对日志的只读访问权限(需要写权限才能用作电子邮件中的附件):

 var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            var lines = new List<string>();
            using (var sr = new StreamReader(fs))
            {
                while(!sr.EndOfStream)
                {
                    lines.Add(sr.ReadLine());
                }
            }

我可以把这个列表写到一个临时文件中,并用它来发送我们的附件,而不必担心修改log4net和危及其他以同一log4net DLL为目标的程序集的依赖关系。

感谢分享他们想法的两个人!

票数 1
EN

Stack Overflow用户

发布于 2019-05-23 01:00:43

日志是为写入而打开的,因此释放锁的唯一方法是停止应用程序。您确实可以选择: 1)使用maximumFileSize设置将日志文件分成块,以便只有最新的日志不可用;2)将消息记录到数据库(log4net提供了这样的接口,请参阅https://www.c-sharpcorner.com/article/configure-log4net-with-database-tutorial-for-beginners/)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56261659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档