c# - 如何创建私有(private)的非全局记录器

标签 c# compact-framework log4net

我在 .NET Compact Framework 上的应用程序中使用 log4net 进行程序日志记录,并且工作正常。

但是,我需要每隔几秒将数据输出到文本文件,并且想知道是否可以利用 log4net 来实现此目的。问题是,每次我指定一个新的附加程序时,我所有的程序日志记录也会附加到它。

所以,重申一下,我需要两个附加程序。一个是全局的,处理我的所有程序日志记录,第二个附加程序附加到类中的私有(private)成员记录器以输出数据。我不希望任何日志都出现在两个附加程序中。

这可能吗?我必须在代码中指定 log4net 配置,因为紧凑框架不支持配置文件。我当前的附加程序定义如下:

Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders(); //Remove any other appenders

RollingFileAppender fileAppender = new RollingFileAppender();
fileAppender.MaxFileSize = 10000000; //10MB in bytes
fileAppender.MaxSizeRollBackups = 10;
fileAppender.RollingStyle = RollingFileAppender.RollingMode.Size;
fileAppender.AppendToFile = true;
fileAppender.LockingModel = new FileAppender.MinimalLock();
fileAppender.File = @"C:\ProgramLog.txt";

log4net.Filter.LevelRangeFilter filter = new log4net.Filter.LevelRangeFilter();
filter.LevelMin = log4net.Core.Level.Warn;
filter.LevelMax = log4net.Core.Level.Fatal;
fileAppender.AddFilter(filter);

PatternLayout pl = new PatternLayout();
pl.ConversionPattern = "%utcdate [%thread] %-5level %logger - %message%newline";
pl.ActivateOptions();
fileAppender.Layout = pl;
fileAppender.ActivateOptions();

log4net.Config.BasicConfigurator.Configure(fileAppender);

最佳答案

我找到了一种使用存储库来做到这一点的方法。我写了一个类来封装所有log4net配置:

public class CustomLogger
{
    private readonly ILog log;

    public CustomLogger(string name)
    {
        var repository = LogManager.CreateRepository(name);
        Hierarchy hierarchy = (Hierarchy)repository;
        hierarchy.Root.RemoveAllAppenders(); //Remove any other appenders

        RollingFileAppender fileAppender = new RollingFileAppender();
        fileAppender.MaxFileSize = 10000000; //10MB in bytes
        fileAppender.MaxSizeRollBackups = 10;
        fileAppender.RollingStyle = RollingFileAppender.RollingMode.Size;
        fileAppender.AppendToFile = true;
        fileAppender.LockingModel = new FileAppender.MinimalLock();
        fileAppender.File = @"C:\" + name + "_LOG.txt";

        PatternLayout pl = new PatternLayout();
        pl.ConversionPattern = "%utcdate,%message%newline";
        pl.ActivateOptions();
        fileAppender.Layout = pl;
        fileAppender.ActivateOptions();

        log4net.Config.BasicConfigurator.Configure(repository, fileAppender);

        this.log = LogManager.GetLogger(name, name);
    }

    public void Log(string message)
    {
        this.log.Info(message);
    }
}

用法:

var logger1 = new CustomLogger("1111111");
var logger2 = new CustomLogger("2222222");
var logger3 = new CustomLogger("3333333");

logger1.Log("Test1");
logger2.Log("Test2");
logger3.Log("Test3");

关于c# - 如何创建私有(private)的非全局记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23408422/

相关文章:

c# - 在 Windows CE 6 上调试数据中止和预取中止异常

c# - NLog 不创建日志文件

log4net - Log4Net 2.0.14 中没有 EventLogAppender

c# - log4net 性能 : should i check log level before trying to log?

c# - 从多个 sql 表 Entity Framework web api 返回数据

c# - Visual Studio C# 交换字符

使用 List<> 的 C# Web API 响应处理

c# - 匹配仅包含特定字母的字符串的正则表达式

c# - WinCE 上的 SHBrowseForFolder 布局不正确

c# - 静态构造函数在同一个appdomain中被调用两次?