Изменить значение переключателя на слушателе трассировки во время выполнения - PullRequest
3 голосов
/ 28 октября 2010

Привет Можно ли изменить уровни TraceEventType, которые прослушиватель трассировки должен регистрировать без перезапуска службы WCF? Я позволяю пользователю настроить то, что трассировка должна регистрировать, отправляет в службу, а затем записывает в файл конфигурации. Это решение требует перезапуска службы до того, как изменение вступит в силу ...

Лучший Даниэль

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

Это было проще, чем я думал. Я отслеживаю TraceSources и устанавливаю их уровень коммутации, когда пользователь хочет, чтобы он изменился.

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 получал тот же уровень коммутации.

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;
    }
}
0 голосов
/ 28 октября 2010

Насколько я знаю, это невозможно.Но если ваша служба использует PerCall InstanceContextMode, вы должны иметь минимальное влияние на пользователей во время перезапуска.

Наличие службы аварийного переключения или балансировщика нагрузки сделает время простоя невидимым для пользователей.

Кстати, я думаю, что трассировка не должна быть изменена удаленным вызовом, а должна быть доступна только локально администраторам по соображениям безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...