我在 .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/