在运行时期间更改日志文件的名称几次

Koe*_*oen 6 log4net log4net-configuration log4net-appender

是否可以在应用程序运行时更改fileappender的日志文件名称?它将每天完成几次.

我将尝试更多地阐述自己:我的应用程序在设备上写入固件.用户已经处理过的所有设备都在网格中.用户可以启动新的写入向导,也可以在已启动的设备上恢复或重新启动操作.我想要做的是记录用户为某个设备执行的所有步骤.

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

我已经读过可以使用context-property(这里这里以及很多其他帖子),但你必须在创建记录器之前设置属性.因此,我不是在类中创建一个记录器,而是在设置属性后在我的方法中创建一个.但到目前为止,没有任何记录.

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

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>
Run Code Online (Sandbox Code Playgroud)

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));
}
Run Code Online (Sandbox Code Playgroud)

AssemblyInfo.cs中:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
Run Code Online (Sandbox Code Playgroud)

Koe*_*oen 7

彼得的答案让我朝着正确的方向前进,但我最终在代码中进行,而不是编辑和保存配置文件.

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));
}
Run Code Online (Sandbox Code Playgroud)