Dynamic log4net:如何动态设置日志文件名?

Dynamic log4net:如何动态设置日志文件名?,dynamic,log4net,filenames,Dynamic,Log4net,Filenames,这是一个非常常见的问题,但我一直无法找到工作的答案。这是我的配置文件: ,但当我尝试循环通过调用GetIterators()返回的集合时,我发现该集合为空 我需要将名称“CraneUserInterface.log”更改为“CraneUserInterface_1.log”或2或3,具体取决于程序在运行时读取的内容。我该怎么做 下面是我第一次使用该示例中提供的代码: 静态bool ChangeLogFileName(字符串AppenderName,字符串NewFilename) {

这是一个非常常见的问题,但我一直无法找到工作的答案。这是我的配置文件:


,但当我尝试循环通过调用GetIterators()返回的集合时,我发现该集合为空

我需要将名称“CraneUserInterface.log”更改为“CraneUserInterface_1.log”或2或3,具体取决于程序在运行时读取的内容。我该怎么做

下面是我第一次使用该示例中提供的代码:

静态bool ChangeLogFileName(字符串AppenderName,字符串NewFilename)
{           
//log4net.Repository.ILoggerRepository RootRep;
//RootRep=log4net.LogManager.GetRepository();
log4net.Repository.ILoggerRepository RootRep=m_logger.logger.Repository;
foreach(RootRep.GetAppenders()中的log4net.Appender.IAppender iApp)
{
字符串appenderName=iApp.Name;
if(iApp.Name.CompareTo(AppenderName)==0
&&iApp是log4net.Appender.FileAppender)
{
log4net.Appender.FileAppender fApp=(log4net.Appender.FileAppender)iApp;
fApp.File=NewFilename;
fApp.ActivateOptions();
返回true;//找到Appender并将名称更改为NewFilename
}
}
返回false;//未找到追加器
}

非常感谢

您可以使用此功能: 在该函数中,首先获取在webconfig中设置的文件位置,然后可以添加所需的任何路径!喜欢约会!我们的客户!或者

网络配置:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\\t4\\"/>
    <appendToFile value="true"/>
    <rollingStyle value="Composite"/>
    <datePattern value="_yyyy-MM-dd.lo'g'"/>
    <maxSizeRollBackups value="10"/>
    <maximumFileSize value="1MB"/>
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/>
    </layout>
</appender>
结果如下:C:\t4\TestProject\Customer1\Saturday,2013年8月31日。log

如何使用“%property”来定义文件名的动态“标记”(在运行时)



此处解释:

尽管读了两遍,但我不知道您为什么要这样做。这是用于退火厂起重机驾驶室中的笔记本电脑。工厂有3台起重机。由于我不在工厂,也不会在不久的将来,我有一个模拟器,假装是所有三只起重机。此程序将有3个实例同时运行。我需要分别跟踪3台起重机中的每台起重机的事件,我可能应该避免该程序的两个实例同时写入同一个日志文件的任何机会。那么正确的问题是什么呢?事实证明,问题根本不在这段代码中。问题是我对XmlConfigurator.ConfigureAndWatch()的调用指定了一个程序无法看到的文件。一旦我找到了,对GetAppenders()的调用就返回了我所期望的appender。感谢所有花时间阅读此问题的人。@MitchWheat,请您详细解释一下好吗?我正试图做类似的事情,但觉得可能有更好的选择,但我对任何选择都一无所知。你的评论似乎表明这是解决这个问题的错误策略。我知道这是一个旧的评论,我感谢任何回复。请不要发布多个问题的完全相同的答案-他们不是真的适合,或者问题是重复的,应该标记为这样
public static void ChangeFileLocation(string _CustomerName,string _Project)
{
    XmlConfigurator.Configure();
    log4net.Repository.Hierarchy.Hierarchy h =(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();

    foreach (IAppender a in h.Root.Appenders)
    {
        if (a is FileAppender)
        {
            FileAppender fa = (FileAppender)a;
            string sNowDate=  DateTime.Now.ToLongDateString();
            // Programmatically set this to the desired location here
            string FileLocationinWebConfig = fa.File;
            string logFileLocation = FileLocationinWebConfig + _Project + "\\" + _CustomerName + "\\" + sNowDate + ".log";

            fa.File = logFileLocation;
            fa.ActivateOptions();
            break;
        }
    }
}
<file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" />