log4net - 在运行时多次更改日志文件的名称

标签 log4net log4net-configuration log4net-appender

应用程序运行时是否可以更改 fileappender 的日志文件名称? 每天会进行几次。

我会尝试更详细地阐述自己:我的应用程序在设备上写入固件。用户已经使用过的所有设备都位于网格中。用户可以启动新的写入向导,或者可以在已启动的设备上恢复或重新启动操作。 我想做的是保留用户在特定设备上执行的所有步骤的日志。

例如:当用户在设备 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)]

最佳答案

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 - 在运行时多次更改日志文件的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17142258/

相关文章:

log4net - 使用自定义主题配置或扩展 log4net SmtpAppender

.net - 在log4net中,如何仅调用一次Config.XmlConfigurator以获得解决方案?

.net - 使用 log4net 创建记录器库的最佳实践。是

.net - 如何追踪 log4net 问题

logging - Log4Net:旋转日志文件名

powershell - 尝试让 log4net 与 PowerShell 一起工作(混合使用 log4net 配置文件)

.net - 诊断磁盘I/O瓶颈?

c# - Log4net 缓冲区大小不起作用

asp.net - 如何在 SQL Server 的 log4net 配置中使用存储过程进行日志记录

asp.net - NHibernate 的 log4net 未将任何内容写入 ASP.NET 跟踪