在运行时更改跟踪侦听器上的switchvalue

时间:2010-10-28 09:01:21

标签: wcf

您好 是否可以在不重新启动WCF服务的情况下更改跟踪侦听器应记录的TraceEventType级别?我让用户配置跟踪应该记录的内容,将其发送到服务然后将其写入配置文件。此解决方案要求在更改生效之前重新启动服务...

最佳

丹尼尔

2 个答案:

答案 0 :(得分:3)

这比我想象的容易。我跟踪TraceSources并在用户想要更改时设置他们的switchlevel。

private static void SetLogLevel(TraceSource traceSource, LogLevel logLevel)
    {
        switch (logLevel)
        {
            case LogLevel.Verbose:
                traceSource.Switch.Level = SourceLevels.Verbose;
                break;
            case LogLevel.Information:
                traceSource.Switch.Level = SourceLevels.Information;
                break;
            case LogLevel.Warning:
                traceSource.Switch.Level = SourceLevels.Warning;
                break;
            case LogLevel.Error:
                traceSource.Switch.Level = SourceLevels.Error;
                break;
            case LogLevel.Critical:
                traceSource.Switch.Level = SourceLevels.Critical;
                break;
            default:
                throw new ArgumentOutOfRangeException("logLevel");
        }
    }

我也在配置文件中写入,因此下次启动服务时,tracesource将获得相同的switchlevel。

public TraceSourceConfiguration SetLogConfiguration(TraceSourceConfiguration traceSourceConfiguration)
{
    lock (_lock)
    {
        Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ConfigurationSection configurationSection = appConfig.GetSection(ConfigurationSectionName);
        PropertyInformation traceSourceSection =
            configurationSection.ElementInformation.Properties[TraceSourcesSectionName];
        if (traceSourceSection != null)
        {
            ConfigurationElementCollection traceSources =
                (ConfigurationElementCollection)traceSourceSection.Value;
            foreach (ConfigurationElement traceSource in traceSources)
            {
                string name = (string)traceSource.ElementInformation.Properties[LogLevelNameElementName].Value;
                if (traceSourceConfiguration.Name == name)
                {
                    traceSource.ElementInformation.Properties[LogLevelValueElementName].Value =
                        traceSourceConfiguration.SwitchValue;
                    appConfig.Save();
                    ConfigurationManager.RefreshSection(ConfigurationSectionName);
                    TraceSourceHandler.SetTraceSourceSwitchLevel(traceSourceConfiguration.Name, traceSourceConfiguration.SwitchValue);
                    return traceSourceConfiguration;
                }

            }
        }
        return null;
    }
}

答案 1 :(得分:0)

据我所知,这是不可能的。但是,如果您的服务使用PerCall InstanceContextMode,则在重新启动期间对用户的影响应该很小。

使用故障转移服务或负载均衡器会使用户看不到停机时间。

顺便说一句,我认为远程调用不应修改跟踪,但出于安全原因,管理员只能在本地访问该跟踪。