2013-06-28 3 views
1

Я использую библиотеку предприятия 5.0 протоколирование в моем asp.net сайт,
Мой web.config файл следующим образом:журнала сообщений собираются ранее созданного файла журнала

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
     <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true"/> 
    </configSections> 
    <loggingConfiguration name="FlatFileLogging" tracingEnabled="true" 
     defaultCategory="General"> 
     <listeners> 
      <add name="Flat File Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       fileName="C:\Logs\2013-06-28 14-21-53.log" header="" footer="" 
       formatter="Text Formatter" traceOutputOptions="DateTime" /> 
     </listeners> 
     <formatters> 
      <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
       template="{timestamp}, {severity}, {message}" name="Text Formatter" /> 
     </formatters> 
     <categorySources> 
      <add switchValue="All" name="General"> 
       <listeners> 
        <add name="Flat File Trace Listener" /> 
       </listeners> 
      </add> 
     </categorySources> 
     <specialSources> 
      <allEvents switchValue="All" name="All Events" /> 
      <notProcessed switchValue="All" name="Unprocessed Category" /> 
      <errors switchValue="All" name="Logging Errors &amp; Warnings"> 
       <listeners> 
        <add name="Flat File Trace Listener" /> 
       </listeners> 
      </errors> 
     </specialSources> 
    </loggingConfiguration> 
    <appSettings/> 
    <connectionStrings/> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0"> 
     </compilation> 
     <authentication mode="Windows"/> 
     <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web> 
</configuration> 

Я меняю путь к файлу журнала с помощью следующей функции :

public static void SetLogFilePath(string filePath) 
{ 
    //string logdirectory = AppDomain.CurrentDomain.BaseDirectory + "Logs\\"; 
    //if (!Directory.Exists(logdirectory)) 
    // Directory.CreateDirectory(logdirectory); 
    //logFilePath = logdirectory + (string.IsNullOrWhiteSpace(txtBatchName.Text) ? "" : (txtBatchName.Text + " ")) + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".log"; 

    if (!File.Exists(filePath)) 
     File.Create(filePath); 

    ConfigurationFileMap objConfigPath = new ConfigurationFileMap(); 

    // App config file path. 
    string appPath = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
    objConfigPath.MachineConfigFilename = appPath; 

    Configuration entLibConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 

    LoggingSettings loggingSettings = (LoggingSettings)entLibConfig.GetSection(LoggingSettings.SectionName); 

    TraceListenerData traceListenerData = loggingSettings.TraceListeners.Get("Flat File Trace Listener"); 
    FlatFileTraceListenerData objFlatFileTraceListenerData = traceListenerData as FlatFileTraceListenerData; 

    objFlatFileTraceListenerData.FileName = filePath; 

    entLibConfig.Save(); 
} 

Всякий раз, когда я изменить путь к файлу журнала и отправки сообщений в файл, журналы не идут на вновь созданный файл. Сообщения журнала переходят к ранее заданному пути к файлу. кажется, что новая настройка не сразу отражается.

string path = "C:\\Logs\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".log"; 
SetLogFilePath(path); 
Logger.Write(message, "General", 1, 0, System.Diagnostics.TraceEventType.Information); 

Как быстро обновить новые настройки до кода?

+0

Вы пытались с Рэнди Леви ответить? используете ли вы *** Ent.Lib 5.0.414.0 ***? – Kiquenet

ответ

2

Как вы определяете "немедленно"? Если вы имеете в виду в середине исполняемого запроса, я не думаю, что вы можете сделать это через конфигурацию, так как конфигурация не будет обновлена ​​для этого запроса.

Вот реализация, которая, по-видимому, работает для меня на основе сообщения блога Enterprise Library Programmatic Configuration. Я не записываю изменение конфигурации обратно на диск, но вместо этого меняю его в памяти.

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     EnterpriseLibraryContainer.Current.GetInstance<LogWriter>() 
      .Write("test", "General"); 

     string path = "C:\\Logs\\anotherlogfile.log"; 
     SetLogFilePath(path); 

     EnterpriseLibraryContainer.Current.GetInstance<LogWriter>() 
      .Write("Another test", "General"); 
    } 

    public void SetLogFilePath(string filePath) 
    { 
     ConfigurationFileMap objConfigPath = new ConfigurationFileMap(); 

     // App config file path. 
     string appPath = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
     objConfigPath.MachineConfigFilename = appPath; 

     Configuration entLibConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 

     LoggingSettings loggingSettings = (LoggingSettings)entLibConfig.GetSection(LoggingSettings.SectionName); 

     TraceListenerData traceListenerData = loggingSettings.TraceListeners.Get("Flat File Trace Listener"); 
     FlatFileTraceListenerData objFlatFileTraceListenerData = traceListenerData as FlatFileTraceListenerData; 

     objFlatFileTraceListenerData.FileName = filePath; 

     IUnityContainer container = new UnityContainer(); 
     container.AddNewExtension<EnterpriseLibraryCoreExtension>(); 

     // Configurator will read Enterprise Library configuration 
     // and set up the container 
     UnityContainerConfigurator configurator = new UnityContainerConfigurator(container); 

     var loggingXmlConfigSource = new SerializableConfigurationSource(); 
     loggingXmlConfigSource.Add(LoggingSettings.SectionName, loggingSettings); 

     // Configure the container with our own custom logging 
     EnterpriseLibraryContainer.ConfigureContainer(configurator, loggingXmlConfigSource); 

     // Wrap in ServiceLocator 
     IServiceLocator locator = new UnityServiceLocator(container); 

     // Release lock(s) on existing file(s) 
     EnterpriseLibraryContainer.Current.GetInstance<LogWriter>().Dispose(); 

     // And set Enterprise Library to use it 
     EnterpriseLibraryContainer.Current = locator; 
    } 
} 

public class SerializableConfigurationSource : IConfigurationSource 
{ 
    Dictionary<string, ConfigurationSection> sections = new Dictionary<string, ConfigurationSection>(); 

    public SerializableConfigurationSource() 
    { 
    } 

    public ConfigurationSection GetSection(string sectionName) 
    { 
     ConfigurationSection configSection; 

     if (sections.TryGetValue(sectionName, out configSection)) 
     { 
      SerializableConfigurationSection section = configSection as SerializableConfigurationSection; 

      if (section != null) 
      { 
       using (StringWriter xml = new StringWriter()) 
       using (XmlWriter xmlwriter = System.Xml.XmlWriter.Create(xml)) 
       { 
        section.WriteXml(xmlwriter); 
        xmlwriter.Flush(); 

        MethodInfo methodInfo = section.GetType().GetMethod("DeserializeSection", BindingFlags.NonPublic | BindingFlags.Instance); 
        methodInfo.Invoke(section, new object[] { XDocument.Parse(xml.ToString()).CreateReader() }); 

        return configSection; 
       } 
      } 
     } 

     return null; 
    } 

    public void Add(string sectionName, ConfigurationSection configurationSection) 
    { 
     sections[sectionName] = configurationSection; 
    } 

    public void AddSectionChangeHandler(string sectionName, ConfigurationChangedEventHandler handler) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Remove(string sectionName) 
    { 
     sections.Remove(sectionName); 
    } 

    public void RemoveSectionChangeHandler(string sectionName, ConfigurationChangedEventHandler handler) 
    { 
     throw new NotImplementedException(); 
    } 

    public event EventHandler<ConfigurationSourceChangedEventArgs> SourceChanged; 

    public void Dispose() 
    { 
    } 
} 
+0

все же происходит то же самое, когда я сначала создаю имя файла и устанавливаю файл журнала, используя вышеописанную функцию «SetLogFilePath», он отлично работает, во второй раз я создаю путь к файлу журнала и задаю файл журнала, журнал переходит к ранее созданному файлу журнала. –

+0

Кажется, что все в порядке для меня: https://docs.google.com/file/d/0BxqRN7e0EfKRUEJsZkgxdk1zN3M/ –

+0

Я использую ** Ent.Lib 5.0.414.0 ** Какие _ (все) сборки необходимы для использования код? Какие сборки мне нужны для использования *** UnityContainerConfigurator, EnterpriseLibraryContainer, IServiceLocator *** и т. Д.? Большое спасибо. – Kiquenet