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

时间:2020-06-10 11:30:43

标签: c# logging 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);
     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());
        }
    }

enter image description here

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

或者将NLog Config变量用于LogDirectory,然后仅更改该变量。例如:

<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());
    }
 }