gpt4 book ai didi

c# - Log4Net 不释放资源

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:13 24 4
gpt4 key购买 nike

我有一个 DLL 文件,它将 Log4Net 记录到一个文件中。有一个加载 DLL 并可以创建 DLL 的多个实例的进程。

DLL 的每个实例都必须创建一个单独的日志文件。因此,我以编程方式进行所有 Log4Net 配置。

我使用了来自 here. 的一些帮助

这是我的代码:

public class LogHelper
{
private PatternLayout _layout = new PatternLayout();
private const string LOG_PATTERN = "%date %-5level - %message%newline";
private String Configuration;

public static string DefaultPattern
{
get { return LOG_PATTERN; }
}

public ILog log = null;

public LogHelper(String configuration)
{
Configuration = configuration;

InitialiseLogger();

_layout.ConversionPattern = DefaultPattern;
_layout.ActivateOptions();

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

hierarchy.Configured = true;
hierarchy.LevelMap.Add(log4net.Core.Level.Debug);
hierarchy.LevelMap.Add(log4net.Core.Level.Critical);
hierarchy.LevelMap.Add(log4net.Core.Level.Info);
hierarchy.LevelMap.Add(log4net.Core.Level.Warn);
hierarchy.LevelMap.Add(log4net.Core.Level.Error);
hierarchy.LevelMap.Add(log4net.Core.Level.Fatal);
}

~LogHelper()
{
log.Debug("Closing myself down");
IAppender[] appenders = log.Logger.Repository.GetAppenders();
//appenders are empty
log.Logger.Repository.Shutdown();
}

public void InitialiseLogger()
{
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
Logger newLogger = hierarchy.GetLogger(Configuration) as Logger;

PatternLayout patternLayout = new PatternLayout();
patternLayout.ConversionPattern = LOG_PATTERN;
patternLayout.ActivateOptions();

RollingFileAppender roller = new RollingFileAppender();
roller.Layout = patternLayout;
roller.AppendToFile = true;
roller.RollingStyle = RollingFileAppender.RollingMode.Size;
roller.MaxSizeRollBackups = 4;
roller.MaximumFileSize = "10MB";
String name = String.Format("-{0:yyyy-MM-dd_HH-mm-ss}", DateTime.Now);
roller.File = "C:\\Logs\\" + Configuration + name + ".log";
roller.ImmediateFlush = true;
roller.ActivateOptions();

newLogger.AddAppender(roller);

log = LogManager.GetLogger(Configuration);
}

问题是 log.Debug("Closing myself down");未记录到日志文件;我知道它正在被调用。日志文件永远不会被释放,除非我停止加载我的 DLL0 的进程,而我不想停止它。

来自 here 的链接解释了如何关闭附加程序。但问题是在我的析构函数中调用了 log.Logger.Repository.GetAppenders();返回一个空数组。

我该如何解决?

请注意:加载我的 DLL 的过程来自第 3 方,我不知道它的内部结构。

最佳答案

您正在使用 LogHelper 的析构函数来释放文件

根据 the language specification 中的 1.6.7.6 析构函数析构函数将被调用,但你不知道什么时候。您只知道它会在进程终止之前被调用。

最明显的做法是将析构函数的逻辑移至将被显式调用的方法(例如 Dispose)

这样您就可以调用方法并释放文件。

关于c# - Log4Net 不释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15382063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com