2016-11-15 3 views
1

У меня есть надстройка C# для Outlook (надстройка Express), из которой я пытаюсь сохранить некоторые данные журнала, но не создается файл журнала даже если вызовы регистратора не прерываются. Я использую VS 2013 в среде Win 10.NLog не записывается в файл журнала при вызове из надстройки Outlook

Мой NLog.Config файл (хранится в папке OutlookAddin \ Bin \ Debug, в том же месте, что и OutlookAddIn.dll.config) выглядит следующим образом:

<?xml version="1.0" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<targets> 
    <target name="file" xsi:type="File" 
     layout="${longdate} ${logger} ${message}" 
     fileName="${specialfolder:ApplicationData}\FindAlike\NewMails.txt" 
     keepFileOpen="false" 
     encoding="iso-8859-2" /> 
</targets> 

<rules> 
    <logger name="*" writeTo="file" /> 
</rules> 

код в Add-In это заявление:

public AddinModule() 
    { 
     Application.EnableVisualStyles(); 
     InitializeComponent(); 
     // Please add any initialization code to the AddinInitialize event handler 
    } 

    private ADXOutlookAppEvents adxOutlookEvents; 
    private DateTime LastReceivedDate = DateTime.Now; 
    private Timer mailCheckTimer; 
    public static RegistryKey SoftwareKey = Registry.CurrentUser.OpenSubKey("Software", true); 
    public static RegistryKey AppNameKey = SoftwareKey.CreateSubKey("FindAlike"); 
    public static Logger logger = LogManager.GetCurrentClassLogger(); 

И процедура для записи файла журнала тестирования:

public static void TestNLog() 
    { 
     try 
     { 
      NLog.LogManager.ThrowExceptions = true; 

      logger.Info("test1"); 
      logger.Warn("test2"); 
      logger.Error("test3"); 

      var fileTarget1 = (FileTarget)NLog.LogManager.Configuration.FindTargetByName("file"); 
      var logEventInfo = new LogEventInfo { TimeStamp = DateTime.Now }; 
      string fileName = fileTarget1.FileName.Render(logEventInfo); 
      if (!System.IO.File.Exists(fileName)) 
       throw new Exception("Log file does not exist."); 
     } 
     catch (Exception Ex) 
     { 
      MessageBox.Show(Ex.Message); 
     } 
    } 

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

Тот же код работает, как ожидается, если он включен в исполняемый файл.

+0

Пожалуйста, отметьте один, как ответ :) – Julian

ответ

1

В дополнение к @ ответ SimonKarvis'S, расположение nlog.config может быть сложно. Это одинаково для модульных тестов.

Я бы рекомендовал:

  1. Создание конфигурации из C#, например,

    var target = new FileTarget 
    { 
         FileName = logfile, 
         ReplaceFileContentsOnEachWrite = true, 
         CreateDirs = createDirs 
    }; 
    var config = new LoggingConfiguration(); 
    
    config.AddTarget("logfile", target); 
    
    config.AddRuleForAllLevels(target); 
    
    LogManager.Configuration = config; 
    
  2. Или загрузить конфиг из строки:

    string configXml = "<nlog>...<nlog>"; 
    XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(configXml); 
    var config = new XmlLoggingConfiguration(doc.DocumentElement, Environment.CurrentDirectory); 
    LogManager.Configuration = config; 
    
  3. Или наименьшую, но не последний, найти правильный путь nlog.config и «кормить» его NLog.

    var pathToNlogConfig = "c:\.."; 
    var config = new XmlLoggingConfiguration(pathToNlogConfig); 
    LogManager.Configuration = config; 
    
+0

Попробованная вариант подхода 2 - успешно авторизовались из надстройки Outlook без копирования Nlog.config. Используемый код, показанный в ответе – SimonKravis

0

Другой вопрос StackOverflow (How to use NLog for a DLL) предполагает, что NLog.config должен быть помещен в тот же каталог, что и исполняемый файл, который вызывает надстройку. Это поставило проблему. Однако это затрудняет распределение, так как расположение исполняемого файла Outlook будет меняться в соответствии с версией Outlook, и для копирования файла в него потребуется привилегия администратора. Возможно, другой регистратор не потребует этого.

Благодаря предложению от @Julian следующий код программно определены конфигурации NLog и успешно бежал из Надстройка:

using NLog; 
    using NLog.Config; 
    using NLog.Targets; 
    using System.Xml; 
... 

public static Logger logger = LogManager.GetCurrentClassLogger(); 

.... 
    public static void ConfigNLog() 
      { 

      string xml = @" 
      <nlog xmlns=""http://www.nlog-project.org/schemas/NLog.xsd"" 
       xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""> 
       <targets> 
        <target name=""file"" xsi:type=""File"" 
          layout=""${longdate} ${logger} ${message}"" 
          fileName=""${specialfolder:ApplicationData}\FindAlike\NewMails.txt"" 
          keepFileOpen=""false"" 
          encoding=""iso-8859-2"" /> 
       </targets> 
       <rules> 
        <logger name=""*"" writeTo=""file"" /> 
       </rules> 
      </nlog>"; 

      StringReader sr = new StringReader(xml); 
      XmlReader xr = XmlReader.Create(sr); 
      XmlLoggingConfiguration config = new XmlLoggingConfiguration(xr, null); 
      NLog.LogManager.Configuration = config; 
     }