2

我想使用 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;
    }
}
4

3 回答 3

2

似乎没有等价物(或者我没能找到它),你无论如何都可以“作弊”并自己处理替换:

...
var pId = System.Diagnostics.Process.GetCurrentProcess().Id;
fileLogRoot.File = string.Format(@"C:\Log\MyLogFile.{0}.txt", pId);
...        
于 2013-11-11T12:41:14.093 回答
1

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

fileLogRoot.File = new PatternString(@"C:\Log\MyLogFile.[%processid].txt").Format();
于 2015-06-26T00:47:27.253 回答
-1

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

这是一个链接:

使用代码中的 XML 配置 log4net 或 NLog

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

于 2013-11-11T15:53:58.460 回答