В log4net я пытаюсь добавить appenders программно для каждого экземпляра, используя следующий код.
Я бы понял, почему для RollingFileAppender
мне нужно написать:
((Logger)log.Logger).AddAppender(newFileAppender);
, а дляAdoNetAppenders
Я должен написать:
hierarchy.Root.AddAppender(newAdoNetAppender);
Если я напишу:
hierarchy.Root.AddAppender(newFileAppender);
, он будет регистрировать каждую строку дважды.
Если я напишу:
((Logger)log.Logger).AddAppender(newAdoNetAppender);
он не будет входить в базу данных.
Или, может быть, есть и другие ошибки?
Global.asax :
XmlConfigurator.ConfigureAndWatch(new FileInfo("Foo.xml"));
Определение свойства:
LogicalThreadContext.Properties["InstanceName"] = instance;
Код :
public static void SetLog4NetAppenderOptions(ILog log, string instanceName)
{
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy;
if (hierarchy != null)
{
RollingFileAppender genericFileAppender = (RollingFileAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(RollingFileAppender) && x.Name == "RollingFile");
if (genericFileAppender != null)
{
genericFileAppender.Threshold = defaultLevel;
genericFileAppender.ActivateOptions();
if (!String.IsNullOrEmpty(instanceName))
{
RollingFileAppender specificFileAppender = (RollingFileAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(RollingFileAppender) && x.Name == "RollingFile_" + instanceName);
if (specificFileAppender == null)
{
RollingFileAppender newFileAppender = new RollingFileAppender();
newFileAppender.Threshold = defaultLevel;
newFileAppender.AppendToFile = genericFileAppender.AppendToFile;
newFileAppender.MaximumFileSize = genericFileAppender.MaximumFileSize;
newFileAppender.MaxFileSize = genericFileAppender.MaxFileSize;
newFileAppender.LockingModel = genericFileAppender.LockingModel;
newFileAppender.Layout = genericFileAppender.Layout;
newFileAppender.Name = String.Format("RollingFile_{0}", instanceName);
newFileAppender.File = genericFileAppender.File.Replace("_log", "_" + instanceName); newFileAppender.ActivateOptions(); ((Logger)log.Logger).AddAppender(newFileAppender);
}
}
}
if (!String.IsNullOrEmpty(instanceName))
{
AdoNetAppender specificDbAppender = (AdoNetAppender)hierarchy.GetAppenders().FirstOrDefault(x => x.GetType() == typeof(AdoNetAppender) && x.Name == "AdoNetAppender_" + instanceName);
if (specificDbAppender == null)
{
AdoNetAppender newAdoNetAppender = new AdoNetAppender();
newAdoNetAppender.ConnectionType = "Foo";
newAdoNetAppender.CommandText = "Foo";
newAdoNetAppender.Name = String.Format("AdoNetAppender_{0}", instanceName);
newAdoNetAppender.AddParameter(new AdoNetAppenderParameter
{
ParameterName = "@log_date",
DbType = DbType.DateTime,
Layout = new RawTimeStampLayout()
});
// add other parameters
newAdoNetAppender.ConnectionString = ConfigurationManager.ConnectionStrings[Settings.Default.ConnectionStringBaseKey + instanceName].ConnectionString;
newAdoNetAppender.ActivateOptions();
hierarchy.Root.AddAppender(newAdoNetAppender);
}
}
}
}
РЕДАКТИРОВАТЬ: я должен добавить, если я запускаю этот код дважды, второй раз он будетфильтр игнорирования журнала.