[英]How do I clone a log4net Appender?
I want to create many different loggers each writing to their own file.我想创建许多不同的记录器,每个记录器都写入自己的文件。
How can I go about cloning my already configured appender, just change the name and file it uses, such that I can control all of them from my configuration in one place?我怎样才能克隆我已经配置的 appender,只需更改它使用的名称和文件,这样我就可以在一个地方从我的配置中控制所有这些?
What I have so far looks like:我到目前为止看起来像:
public Client(string host, int port, string sessionId, TimeSpan timeoutMilliseconds, TimeSpan reconnectAttemptInterval)
{
//SNIP
// Create an individual logger for each client
string loggerName = "Client #" + _id.ToString();
string logFilename = loggerName + ".log";
var hierarchy = (Hierarchy)LogManager.GetRepository();
var logger = hierarchy.LoggerFactory.CreateLogger((ILoggerRepository)hierarchy, loggerName);
logger.Hierarchy = hierarchy;
// Get the appenders from config
var consoleAppender = (ConsoleAppender)LogManager.GetRepository().GetAppenders().First(x => x.Name == "Console");
var rollingAppender = (RollingFileAppender)LogManager.GetRepository().GetAppenders().First(x => x.Name == "RollingFile");
// Create the per client appenders
// TODO - Instead, clone this from the rolling appender in the config and change its name and its file.
// That way we can configure all appenders without a rebuild
var fileAppender = new RollingFileAppender
{
Name = loggerName + "Appender",
File = logFilename,
LockingModel = new FileAppender.MinimalLock(),
AppendToFile = false,
RollingStyle = RollingFileAppender.RollingMode.Size,
MaxSizeRollBackups = 20,
MaximumFileSize = "50MB",
StaticLogFileName = true,
Layout = new log4net.Layout.PatternLayout("%-5p %d [%t] %m %n")
};
fileAppender.ActivateOptions();
logger.AddAppender(fileAppender);
logger.AddAppender(consoleAppender);
logger.Level = Level.All; // See appender for filtering
hierarchy.Threshold = Level.Fatal;
logger.Repository.Configured = true;
_log = new LogImpl(logger);
_log.Debug(string.Format("{0} has been created.", loggerName));
}
One user has suggested this is a duplicate question Deep cloning objects一位用户建议这是一个重复的问题Deep cloning objects
I don't see how any of the solutions listed are applicable, because log4net is a 3rd party library and I cannot implement ICloneable or ISerializable in a third party's source.我看不出列出的任何解决方案如何适用,因为 log4net 是第 3 方库,我无法在第三方源中实现 ICloneable 或 ISerializable。
AppenderCollection implements ICloneable
so you could do: AppenderCollection实现了
ICloneable
因此您可以执行以下操作:
// Copies the appenders in the default repository
AppenderCollection copyAppenders = new AppenderCollection(LogManager.GetRepository().GetAppenders()).Clone() as AppenderCollection;
foreach (IAppender appender in copyAppenders)
{
// Assuming we only have a RollingFileAppender
RollingFileAppender file = appender as RollingFileAppender;
file.Name = "FooBar";
...
file.ActivateOptions();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.