log4net:在代码中使用PatternString,而不是在配置文件中

时间:2013-11-11 11:49:32

标签: c# log4net

我想使用PatternString在C#中使用log4net在RollingFileAppender的文件名中指定一个模式。这可以在配置文件中轻松完成,并且有许多在线示例。但是,我想在C#代码中做同样的事情。

这是在配置文件中完成的:

 <file type="log4net.Util.PatternString" value="C:\Log\MyLogFile.[%processid].txt" />

下面的代码完成了有关在没有配置文件的情况下设置log4net的所有操作。 除了上面的PatternString行。如何为代码中的RollingFileAppender 指定PatternString?

我的代码如下所示:

public class Log4NetInitializer
{
    public static void Setup()
    {
        Hierarchy hierarchy = (Hierarchy) LogManager.GetRepository();

        PatternLayout patternLayout = new PatternLayout();
        patternLayout.ConversionPattern = "%date %-5level %logger [%ndc] %thread %newline%message%newline%exception";
        patternLayout.ActivateOptions();

        RollingFileAppender fileLogRoot = new RollingFileAppender();
        fileLogRoot.AppendToFile = true;
        fileLogRoot.File = @"C:\Log\MyLogFile.txt";
        fileLogRoot.Layout = patternLayout;
        fileLogRoot.MaxSizeRollBackups = 5;
        fileLogRoot.Encoding = Encoding.UTF8;
        fileLogRoot.LockingModel = new FileAppender.MinimalLock();
        fileLogRoot.ActivateOptions();
        hierarchy.Root.AddAppender(fileLogRoot);

        hierarchy.Root.Level = Level.Info;
        hierarchy.Configured = true;
    }
}

3 个答案:

答案 0 :(得分:2)

似乎没有相应的(或者我没有找到它),你可能无论如何“欺骗”并自己照顾替换:

...
var pId = System.Diagnostics.Process.GetCurrentProcess().Id;
fileLogRoot.File = string.Format(@"C:\Log\MyLogFile.{0}.txt", pId);
...        

答案 1 :(得分:1)

log4net.Util中的PatternString类允许您解析模式字符串,就像在xml配置文件中编写它们一样。

fileLogRoot.File = new PatternString(@"C:\Log\MyLogFile.[%processid].txt").Format();

答案 2 :(得分:-1)

这可能不会直接回答您的问题,但您可以在代码中通过XML配置log4net(和NLog)(而不是将XML放在配置文件中)。我在一段时间后发布了一个问题/答案。

这是一个链接:

Configure log4net or NLog with XML from code

我的帖子是从某处预定义/存储XML的角度出发的(在我的例子中,我们的项目正考虑定义XML配置并将其存储在数据库中),读取XML(作为字符串)并设置它直接在log4net或NLog配置对象上。我们从来没有实际使用这种方法来实现任何东西,但在我的有限测试中,它确实似乎工作正常。