Log4Net从Mvc转到.Net Core
原项目用的Log4Net,不过版本比较旧,在Core里新版也进行了支持,本文用的是现在最新版本2.0.8
1、LogHelper帮助类放另一个类库中 Log/LogHelper.cs
2、单独建的配置文件放在主项目下,LogConfig/Log4Net.config
具体位置如下图:
LogHelper.cs内容
升级版本后本来的LogManager.GetLogger()方法要指定Repository 看文章都是要CreateRepository一个.
private static readonly ILoggerRepository Repository = LogManager.CreateRepository(Assembly.GetEntryAssembly(), typeof(Hierarchy))
不过我这样写就是不行,没有报错日志也不会写入.后面研究半天用GetRepository解决.
private static readonly ILoggerRepository Repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Collections.Concurrent; using System.IO; using System.Reflection; using log4net; using log4net.Config; using log4net.Repository; using log4net.Repository.Hierarchy; //指定log4net使用的config文件来读取配置信息 [assembly: XmlConfigurator(ConfigFile = @"LogConfig\Log4Net.config", Watch = true)] namespace C.Until { /// <summary> /// 日志帮助类 /// </summary> public class LogHelper { #region 旧版本 //private static readonly ILog Loginfo = LogManager.GetLogger("loginfo"); //private static readonly ILog LogError = LogManager.GetLogger("logerror"); #endregion private static readonly ILoggerRepository Repository = LogManager.GetRepository(Assembly.GetCallingAssembly()); private static readonly ILog Loginfo = LogManager.GetLogger(Repository.Name, "loginfo"); private static readonly ILog LogError = LogManager.GetLogger(Repository.Name, "logerror"); public static void Error(string errorMsg, Exception ex = null) { if (ex != null) { LogError.Error(errorMsg, ex); } else { LogError.Error(errorMsg); } } public static void Info(string msg) { Loginfo.Info(msg); } } }
Log4Net.config
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!--添加自定义节点:log4net type:解析类名,程序集名(log4net.dll)--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender"> <!--定义文件存放位置--> <file value="Log\\LogInfo\\" /> <encoding value="utf-8" /> <!--是否追加到文件,默认为true,通常无需设置--> <appendToFile value="true"/> <RollingStyle value="Date"/> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <DatePattern value=""log"yyyyMM".log"" /> <!--日志文件名是否为静态--> <StaticLogFileName value="false"/> <!--多线程时采用最小锁定--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--布局(向用户显示最后经过格式化的输出信息)--> <layout type="log4net.Layout.PatternLayout"> <ConversionPattern value="记录时间:%date %n错误描述:%message%newline %n" /> </layout> </appender> <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender"> <!--定义文件存放位置--> <file value="Log\\LogError\\" /> <encoding value="utf-8" /> <!--是否追加到文件,默认为true,通常无需设置--> <appendToFile value="true"/> <RollingStyle value="Date"/> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <DatePattern value=""log"yyyyMM".log"" /> <!--日志文件名是否为静态--> <StaticLogFileName value="false"/> <!--多线程时采用最小锁定--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--布局(向用户显示最后经过格式化的输出信息)--> <layout type="log4net.Layout.PatternLayout"> <ConversionPattern value="记录时间:%date %n错误描述:%message%newline %n" /> </layout> </appender> <logger name="logerror"> <level value="ERROR" /> <appender-ref ref="Log4Net_ERROR" /> </logger> <logger name="loginfo"> <level value="INFO" /> <appender-ref ref="Log4Net_INFO" /> </logger> </log4net> </configuration>
这里因为不同消息放在不同文件 分类处理用的“ogger name="logerror" 此种属性.
ps:在LogHelper.cs文件中用[assembly: XmlConfigurator(ConfigFile = @"LogConfig\Log4Net.config", Watch = true)]来读取配置文件,也可以在Startup.cs中注册文件路径.不过为了独立性 方便移植到别的项目中就没用此方法.