2016-11-15 10 views
1

ログデータを保存しようとしているのに、ログファイルを作成しようとしていないOutlook用アドイン(アドインエクスプレス)がありますロガーへの呼び出しは失敗しません。私はWin 10環境でVS 2013を使用しています。Outlookアドインから呼び出されたときにNLogがログファイルに書き込まない

マイNLog.Configは以下のとおりである(フォルダOutlookAddin \ binに\デバッグ、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> 

コードアドイン内宣言された:テスト・ログ・ファイル書き込み用の

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

答えとして1をマークしてください:)アプローチ2の – Julian

答えて

1

、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

試みたバリアントを - 成功したアドインNlog.configをコピーせずにOutlookからログイン。 Answerで使用されているコード – SimonKravis

0

StackOverflowの別の質問(How to use NLog for a DLL)では、NLog.configをアドインを呼び出す実行可能ファイルと同じディレクトリに配置する必要があることが示唆されています。これで問題は解決しました。ただし、Outlookの実行可能ファイルの場所はOutlookのバージョンによって異なり、ファイルをファイルにコピーするには管理者特権が必要であるため、配布が非常に困難になります。おそらく別のロガーはこれを必要としないでしょう。次のコード@Julianからの提案へ

おかげで、プログラムNLogの設定を指定し、アドインから正常に実行された:SimonKarvisの答え@に加えて

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; 
     } 
関連する問題