Как вы обнаружили, ваши требования не совсем подходят для подхода на основе конфигурации Enterprise Library.Это не значит, что это невозможно.
Один из способов выполнить то, что вы хотите, - это использовать программную конфигурацию блока ведения журнала.
Один из подходов заключается в создании IDictionary дляпровести сопоставление идентификаторов с LogWriters.Когда приходит идентификатор, проверьте, существует ли уже LogWriter в IDictionary.Если это так, используйте его, а если нет, то создайте новый LogWriter.
Вот пример кода, который использует Logging Fluent Interface для настройки UnityContainer, а затем разрешает LogWriterи сохраняет его в Словаре:
int id = 123123;
Dictionary<int, LogWriter> loggers = new Dictionary<int, LogWriter>();
ConfigurationSourceBuilder builder = new ConfigurationSourceBuilder();
builder.ConfigureLogging()
.WithOptions
.DoNotRevertImpersonation()
.SpecialSources.LoggingErrorsAndWarningsCategory.SendTo.FlatFile("Flat File Listener").ToFile(@"trace.log")
.LogToCategoryNamed("General")
.WithOptions.SetAsDefaultCategory()
.SendTo.FlatFile("AppSpecificFlatFile" + id)
.ToFile("logging" + id + ".log")
;
DictionaryConfigurationSource configSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace(configSource);
coreExtension = new EnterpriseLibraryCoreExtension(configSource);
IUnityContainer container = new UnityContainer();
container.AddExtension(coreExtension);
var logger = container.Resolve<LogWriter>();
loggers[id] = logger;
Это всего лишь пример, который не является потокобезопасным или абстрагированным, но, надеюсь, поможет.