根据QueryString中传递的GUID,在运行时更改日志文件的位置和名称

时间:2012-03-27 15:03:55

标签: c# enterprise-library enterprise-library-5

现在每当我运行应用程序时它会创建一个文件(在Web.Config Logging Section中指定的文件名)。

我想要的是在运行时更改文件的路径和名称(基于GUID作为查询sting传递)。

我做了一些研究,但可用的例子对我不起作用。如果有人可以提供代码示例,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

正如您所发现的,您的要求并不适合基于配置的企业库方法。这并不是说它无法完成。

实现所需目标的一种方法是使用日志记录块的编程配置。

一种方法是创建一个IDictionary来保存ID到LogWriters的映射。当ID进入时,检查IDictionary中是否已存在LogWriter。如果是,则使用它,如果没有,则创建一个新的LogWriter。

以下是一些示例代码,它使用Logging Fluent Interface配置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;

这只是一个示例,并非线程安全或抽象,但应该有所帮助。

答案 1 :(得分:0)

如果您只需要在运行时更改跟踪日志文件,则可以使用

删除当前的tracelistener。

System.Diagnostics.Trace.Listener.Remove(&#34; Listener1&#34);

然后添加一个新的监听器,其新日志文件名为

System.Diagnostics.Trace.Listener.Add(new System.Diagnostics.TextWriterTraceListener(&#34; NewLogFileName.txt&#34;,&#34; Listener2&#34;);

现在您的日志将记录到NewLogFileName.txt