【问题标题】:Change name of logfile a few times during runtime在运行时更改日志文件的名称几次
【发布时间】:2013-06-17 07:20:09
【问题描述】:

是否可以在应用程序运行时更改文件附加器的日志文件名称? 每天会执行几次。

我将尝试更详细地说明自己:我的应用程序在设备上编写固件。用户已经使用过的所有设备都在一个网格中。用户可以启动新的写入向导,或者可以在已启动的设备上恢复或重新启动操作。 我想做的是记录用户为特定设备执行的所有步骤。

例如:当用户在设备 AB0124 上工作时,我想写入一个名为 AB0124.log 的日志文件。当他结束在该设备上的工作并在设备 XY5618 上开始时,我想在 XY5618.log 中记录这些操作

我读到可以使用上下文属性(herehere 以及许多其他帖子),但您必须在创建记录器之前设置属性。 因此,我没有在类中创建一个记录器,而是在设置属性后在我的方法中创建一个。 但到目前为止,没有任何记录。

当我在配置中设置硬编码的文件名时,它正在工作。 我在这里错过了什么吗?

Log4Net.config:

<appender name="StepsLogAppender" type="log4net.Appender.FileAppender">
  <filter  type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="INFO"/>
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
  <file type="log4net.Util.PatternString" value="%property{LogPathModifier}" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{dd/MM/yyyy  -  HH:mm:ss} - %message%newline" />
  </layout>
</appender>

<root>
  <level value="ALL" />
  <appender-ref ref="StepsLogAppender" />
</root>

C#:

public void WriteStepInfo(string device, int step)
{
    log4net.ThreadContext.Properties["LogPathModifier"] = string.Format("D:\\StepsDevice_{0}.txt", device);
    var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    log.Info(string.Format("Device {0} - step {1}.", device, step));
}

并且在 AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

【问题讨论】:

    标签: log4net log4net-configuration log4net-appender


    【解决方案1】:

    Peter 的回答给我带来了正确的方向,但我最终用代码而不是编辑和保存配置文件。

    public void WriteStepInfo(string device, int step)
    {
        var h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
        foreach (IAppender a in h.Root.Appenders)
        {
            if (a.Name == "StepsLogAppender")
            {
                FileAppender fa = (FileAppender)a;
                var logFileLocation = string.Format(".\\Logs\\Device_{0}.log", device);
    
                fa.File = logFileLocation;
                fa.ActivateOptions();
                break;
            }
        }
    
        Log.Info(string.Format("Device {0} - step {1}. Different file for each device", device, step));
    }
    

    【讨论】:

    • 感谢您的示例。正是我需要的!
    • 我已经尝试过你的方法,但是 log4net 没有重命名文件,而是使用新名称创建了一个新文件。我试过使用 RollingFileAppender:stackoverflow.com/questions/49345372/… 但它似乎也不起作用。这是你的期望吗?
    • 我确实需要每次都创建一个新文件。 Log4Net 无法重命名现有文件。这是你必须自己(或通过代码)做的事情。
    【解决方案2】:

    您可以从您的应用程序中打开 log4net.config 文件并更改名称。然后保存文件(log4net.config),日志文件将被更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多