从代码动态更改日志文件的路径后,Nlog 不创建日志文件

Nlog Not Creating log file after changing Path of log file dynamically from code

此代码无法正常工作。我正在尝试在运行时创建日志文件,但是当我更改日志路径时,需要重新启动应用程序才能创建日志路径。它在重新启动应用程序后创建日志文件。

我想在运行时创建日志文件。 请帮助我...

 private static void ChangeLogPath(string path)
 {
  try
    {
     var Formatpath = path.Replace(@"\", "/");
     XmlDocument xmlDoc = new XmlDocument();
     Logger.Info("FilePath config File " + 
     AppDomain.CurrentDomain.SetupInformation.ConfigurationFile.ToString()); 
     xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
     XmlNodeList nodes = xmlDoc.SelectNodes("configuration");
     foreach (XmlNode node in nodes)
     {
      var Childnods = node.LastChild.FirstChild.FirstChild.Attributes;
                for (int i = 0; i < Childnods.Count; i++)
                {
                    if (Childnods[i].Name == "fileName")
                    {
                        Childnods[i].Value = Formatpath + "/Loge.txt";
                    }
                    if (Childnods[i].Name == "archiveFileName")
                    {
                        Childnods[i].Value = Formatpath + "/Archives/{#}_Log.txt";
                    }
                }
            }  
     xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
           ConfigurationManager.RefreshSection("nlog");
        }
        catch (Exception e)
        {
            Logger.Error(e.ToString());
        }
    }

NLog 当前无法检测到 app.config 的文件更改。

您可以像这样尝试强制显式卸载和加载 NLog 配置:

ConfigurationManager.RefreshSection("nlog");
LogManager.Configuration = null;
var newLoadedConfig = LogManager.Configuration;

另请参阅:https://github.com/NLog/NLog/issues/2482

或者对 LogDirectory 使用 NLog 配置变量,然后只更改该变量。例如:

<nlog>
   <variable name="LogDirectory" value="C:/Users/DefaultUser/" />

   <targets>
       <target type="file" name="logfile" fileName="${var:LogDirectory}/Log.txt" fileName="${var:LogDirectory}/Archives/{#}_Log.txt" />
   </targets>

   <rules>
       <logger name="*" minlevel="Debug" writeTo="logfile" />
   </rules>
</nlog>

那么可能是这样的:

 private static void ChangeLogPath(string path)
 {
    try
    {
     var Formatpath = path.Replace(@"\", "/");
     XmlDocument xmlDoc = new XmlDocument();
     Logger.Info("FilePath config File " + 
     AppDomain.CurrentDomain.SetupInformation.ConfigurationFile.ToString()); 
     xmlDoc.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
     var variableList = root.SelectNodes("/configuration/nlog/variable");
     foreach (XmlNode variable in variableList)
     {
         var name = node.SelectSingleNode("@name").InnerText;
         if (name == "LogDirectory")
         {
             var value = node.SelectSingleNode("@value");
             value.InnerText = Formatpath;
         }
     }
     xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
     ConfigurationManager.RefreshSection("nlog");
     LogManager.Configuration.Variables["LogDirectory"] = Formatpath;
    }
    catch (Exception e)
    {
     Logger.Error(e.ToString());
    }
 }