前言
网上貌似没有太多关于log4net过滤日志的资料,在研究过程中发现一点小问题,这里做下记录,希望对后续有用到的童鞋起到一丢丢帮助作用。
log4net日志过滤
由于是在.NET Core中使用,所以这里为了演示,我们创建一个.NET Core控制台程序,同时呢通过安装log4net最新稳定版本(2.0.8),好了,对于.NET Core而言,在开发时可直接配置web.config启用日志功能,此时会将不同级别日志直接放在同一文件中,在实际开发中无论我们使用log4net还是serilog或者自己写一个也好,大部分都会根据不同级别创建不同目录,这样更加易于后续跟踪和排查问题。但是也会存在特殊的需求,比如本文中,我们只需要创建两个日志文件,一个用于正常的信息文件记录,一个是审计信息记录,而且日志文件名可能不是日期格式,而是由我们自己根据配置给定,所以基于以上需求,我们来完成此项任务,首先,我们在控制台根目录下创建如下单独的log4net .config配置文件:
<?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="log.txt" /> <appendToFile value="true" /> <countDirection value="1"/> <maximumFileSize value="10MB" /> <maxSizeRollBackups value="-1" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <root> <level value="DEBUG"/> <appender-ref ref="RollingFileAppender" /> </root> </log4net>
接下来则是读取上述配置文件,在.NET Framework中我们需要在Properties文件夹下的AssemblyInfo类中添加读取上述日志配置文件类,如下:
[assembly: log4net.Config.XmlConfigurator(ConfigFile ="log4net.config", Watch = true)]
但是到了.NET Core中压根就没有了上述Properties文件夹,此时我能想到的办法只能根据日志配置文件所在的目录去读取(不知是否还有其他更好的办法),并按照所提供的api,创建控制台程序集仓储和读取配置文件中XML的根节点并最终写到log4net配置中,如下:
var log4netFullPath = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), @"..\..\..\")); var log4netConfig = new XmlDocument(); log4netConfig.Load(File.OpenRead(Path.Combine(log4netFullPath, "log4net.config"))); var repo = LogManager.CreateRepository(Assembly