现在,每当我运行应用程序时,它都会创建一个文件(在 Web.Config 日志记录部分中指定的文件名)。
我想要的是在运行时更改文件的路径和名称(基于作为查询字符串传递的 GUID)。
我做了一些研究,但可用的例子对我不起作用。如果有人可以提供代码示例,将不胜感激。
现在,每当我运行应用程序时,它都会创建一个文件(在 Web.Config 日志记录部分中指定的文件名)。
我想要的是在运行时更改文件的路径和名称(基于作为查询字符串传递的 GUID)。
我做了一些研究,但可用的例子对我不起作用。如果有人可以提供代码示例,将不胜感激。
正如您所发现的,您的要求并不适合企业库的基于配置的方法。这并不是说它不能完成。
完成您想要的一种方法是使用日志记录块的编程配置。
一种方法是创建一个 IDictionary 来保存 ID 到 LogWriters 的映射。当一个 ID 进来时,检查 IDictionary 中是否已经存在一个 LogWriter。如果是,则使用它,如果不是,则创建一个新的 LogWriter。
下面是一些示例代码,它使用Logging Fluent 接口配置 UnityContainer,然后解析 LogWriter 并将其保存到 Dictionary:
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;
这只是一个示例,不是线程安全的或抽象的,但希望能有所帮助。
如果您只需要在运行时更改跟踪日志文件,您可以使用简单地删除当前的跟踪侦听器
System.Diagnostics.Trace.Listener.Remove("Listener1");
然后添加一个新的监听器,新的日志文件名为,
System.Diagnostics.Trace.Listener.Add(new System.Diagnostics.TextWriterTraceListener("NewLogFileName.txt","Listener2");
现在您的日志将记录到 NewLogFileName.txt