如何解决使用最新版本的slf4net1.0.0在代码中进行的配置不会记录日志
我正在使用slf4net.log4net nuget包来处理项目中的日志记录。因为必须在运行时更改日志级别,所以我在代码中进行了配置。问题是该代码在slf4net.log4net 0.1.32.1版中可以正常工作,但是当我将其升级到1.0.0版时,会创建日志文件,但是日志文件中不存在日志。我创建了一个虚拟项目来显示此问题。我看不到如何在此处添加zip文件,因此我将在此处发布代码。它是Net Framework 4.7.2中的控制台应用程序;
class Program
{
private static string GetLoggingPath()
{
var path = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData,Environment.SpecialFolderOption.DoNotVerify),"LoggingTesting");
Directory.CreateDirectory(path);
return path;
}
static void Main(string[] args)
{
var layout = new PatternLayout
{
ConversionPattern = "%d{ABSOLUTE}: %message %newline"
};
layout.ActivateOptions();
var fileAppender = new RollingFileAppender();
fileAppender.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Date;
fileAppender.Layout = layout;
var path = GetLoggingPath();
fileAppender.File = path + System.IO.Path.DirectorySeparatorChar + "LISlogging_.txt";
fileAppender.AppendToFile = true;
fileAppender.PreserveLogFileNameExtension = true;
fileAppender.StaticLogFileName = false;
fileAppender.DatePattern = "yyyy-MM-dd";
fileAppender.MaxSizeRollBackups = 10;
fileAppender.ActivateOptions();
ILoggerRepository repository = log4net.LogManager.GetRepository(Assembly.GetCallingAssembly());
BasicConfigurator.Configure(repository,fileAppender);
var root = (repository as Hierarchy)?.Root;
if (root == null) return;
root.Level = log4net.Core.Level.All;
// Create log4net ILoggerFactory and set the resolver
var factory = new slf4net.log4net.Log4netLoggerFactory();
var resolver = new SimpleFactoryResolver(factory);
slf4net.LoggerFactory.SetFactoryResolver(resolver);
// trigger logging
var log = slf4net.LoggerFactory.GetLogger(typeof(Program));
log.Info("log this line");
}
}
public class SimpleFactoryResolver : IFactoryResolver
{
private readonly slf4net.ILoggerFactory _factory;
public SimpleFactoryResolver(slf4net.ILoggerFactory factory)
{
_factory = factory;
}
public slf4net.ILoggerFactory GetFactory()
{
return _factory;
}
}
此虚拟项目是在.net框架中创建的,但我在.net核心项目中需要此项目。这就是为什么我需要版本1.0.0的原因。 我还将这个问题发布在slf4net的github页面上(因为它看起来像个bug):https://github.com/ef-labs/slf4net/issues/6
我在堆栈溢出时遇到的主要问题是是否有解决方法,以便可以与slf4net.log4net 1.0.0版一起使用
解决方法
我已经找到解决方法。也许不是最干净的解决方案,但它可以工作。如果有人知道更清洁的解决方案,请在此处添加。
查看slf4net.log4net代码时,我发现,当它尝试配置log4net时,它将使用xml文件或配置文件,如果要在运行时设置日志级别,这将是一场噩梦。您可以传递一个customconfigurator作为Log4netLoggerFactory的参数。此customconfigurator需要实现IXmlConfigurator。 我制作的CustomConfigurator接受一个IAppender和一个日志级别(log4net.Core.Level)。在Configure(ICollection(ILoggerRepository信息库)方法的实现中。我已经设置了根日志级别,并使用BasicConfigurator进行了配置。 CustomConfigurator看起来像这样:
public class CustomConfigurator: IXmlConfigurator
{
private readonly IAppender _appender;
private readonly log4net.Core.Level _logLevel;
public CustomConfigurator(IAppender appender,log4net.Core.Level logLevel)
{
_appender = appender;
_logLevel = logLevel;
}
public ICollection Configure(ILoggerRepository repository)
{
var root = (repository as Hierarchy)?.Root;
if (root != null)
{
root.Level = _logLevel;
}
return BasicConfigurator.Configure(repository,_appender);
}
public ICollection Configure(ILoggerRepository repository,XmlElement element)
{
return XmlConfigurator.Configure(repository,element);
}
public ICollection Configure(ILoggerRepository repository,FileInfo configFile)
{
return XmlConfigurator.Configure(repository,configFile);
}
public ICollection ConfigureAndWatch(ILoggerRepository repository,FileInfo configFile)
{
return XmlConfigurator.ConfigureAndWatch(repository,configFile);
}
}
现在,您可以按照问题中所示的代码创建一个追加器(直到fileappender.ActivateOptions),然后在构造log4netLoggerFactory时,传递一个CustomConfigurator实例,该实例将fileAppender和loglevel作为参数。
var factory = new slf4net.log4net.Log4netLoggerFactory(new CustomConfigurator(fileAppender,Level.All));
var resolver = new SimpleFactoryResolver(factory);
slf4net.LoggerFactory.SetFactoryResolver(resolver);
这应该有效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。