【发布时间】:2018-09-05 11:54:39
【问题描述】:
我正在为第三方应用程序开发一个插件,对于这个插件的每次“运行”,我都需要一个独占的日志文件。
我已经构建了以下类。
public class LogFileRepository
{
private readonly Common.Configuration.Settings _configSettings;
private const string InstanceName = "AutomationPlugin.Logging";
private readonly ILoggerRepository _repository;
public LogFileRepository (Common.Configuration.Settings configSettings)
{
_configSettings = configSettings;
var repositoryName = $"{InstanceName}.Repository";
_repository = LoggerManager.CreateRepository(repositoryName);
}
public ILog GetLog(string name)
{
var logger = LogManager.Exists(_repository.Name, name);
if (logger != null)
{
return logger;
}
var filter = new LevelMatchFilter {LevelToMatch = Level.All};
filter.ActivateOptions();
var appender = new RollingFileAppender
{
AppendToFile = false,
DatePattern = "yyyy-MM-dd",
File = String.Format(_configSettings.Paths.LogFileTemplate, name),
ImmediateFlush = true,
Layout = new PatternLayout("%n%date{ABSOLUTE} | %-7p | %m"),
LockingModel = new FileAppender.MinimalLock(),
MaxSizeRollBackups = 1,
Name = $"{InstanceName}.{name}.Appender",
PreserveLogFileNameExtension = false,
RollingStyle = RollingFileAppender.RollingMode.Once
};
appender.AddFilter(filter);
appender.ActivateOptions();
BasicConfigurator.Configure(_repository, appender);
return LogManager.GetLogger(_repository.Name, name);
}
}
我打算这个函数要做的是让GetLog方法返回一个日志文件(具有指定的名称)如果LogManager已经有一个;如果没有现有的日志文件,那么它应该实例化并返回它。
这确实发生了。在插件的第一次运行时,会创建一个日志文件并将其写入;在插件的第二次运行时,会创建并写入一个新的日志文件,但所有消息也会写入第一个日志文件。在第三次运行时,所有消息都写入两个现有日志文件以及新的第三个日志文件。
为什么? RollingFileAppender 中是否有我似乎误解/错误配置的内容?我想要每个name 参数的专属日志文件。
【问题讨论】:
-
每次调用都是同一个_repository实例吗?
-
这能完成你的工作吗:stackoverflow.com/a/18750639/982149 ?
-
@Fildor - 是的,
_repository是类上的私有成员变量,使用此类的代码是一个单例,它在其构造函数中实例化_repository的宿主类。所以有一个宿主类的实例,因此有相同的_repository实例。此外,日志的名称肯定不同 - 否则我永远不会看到创建第二个文件。