Core的配置
一、创建core包含控制和视图的项目以及Log4Net引用
二、创建Log4Net配置文件
右击项目->添加文件 Log4Net.config
2
复制以下代码
以下配置可做参考:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <!--添加自定义节点:log4net type:解析类名,程序集名(log4net.dll)--> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <root> <!--<level value="DEBUG"/>--> <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录--> <level value="ALL"/> <!--根据log级别记录到不同的日志文件--> <appender-ref ref="DebugLogger" /> <appender-ref ref="InfoLogger" /> <appender-ref ref="WarnLogger" /> <appender-ref ref="ErrorLogger" /> <appender-ref ref="FatalLogger" /> </root> <!--Debug文件日志记录器--> <appender name="DebugLogger" type="log4net.Appender.RollingFileAppender"> <!--日志存放文件夹--> <file value="LogDebug"/> <!--是否追加到文件--> <appendToFile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--使用UTF-8编码--> <Encoding value="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxSizeRollBackups value="-1"/> <!--是否只写到一个文件中--> <StaticLogFileName value="false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date" /> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <param name="datePattern" value="yyyy/yyyy-MM/yyyy-MM-dd.'log'" /> <!--过滤设置,LevelRangeFilter为使用的过滤器。--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="DEBUG" /> <levelMax value="DEBUG" /> </filter> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <!-- 输出格式 日期,日志级别,消息,换行--> <param name="ConversionPattern" value="%date [%-5p] %message%n" /> </layout> </appender> <!--InfoLog文件日志记录器--> <appender name="InfoLogger" type="log4net.Appender.RollingFileAppender"> <!--日志存放文件夹--> <file value="LogInfo"/> <!--是否追加到文件--> <appendToFile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--使用UTF-8编码--> <Encoding value="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxSizeRollBackups value="-1"/> <!--是否只写到一个文件中--> <StaticLogFileName value="false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date" /> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <param name="datePattern" value="yyyy/yyyy-MM/yyyy-MM-dd.'log'" /> <!--过滤设置,LevelRangeFilter为使用的过滤器。--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="INFO" /> <levelMax value="INFO" /> </filter> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <!-- 输出格式 日期,日志级别,消息,换行--> <param name="ConversionPattern" value="%date [%-5p] %message%n" /> </layout> </appender> <!--WarnLog文件日志记录器--> <appender name="WarnLogger" type="log4net.Appender.RollingFileAppender"> <!--日志存放文件夹--> <file value="LogWarn"/> <!--是否追加到文件--> <appendToFile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--使用UTF-8编码--> <Encoding value="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxSizeRollBackups value="-1"/> <!--是否只写到一个文件中--> <StaticLogFileName value="false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date" /> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <param name="datePattern" value="yyyy/yyyy-MM/yyyy-MM-dd.'log'" /> <!--过滤设置,LevelRangeFilter为使用的过滤器。--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="WARN" /> <levelMax value="WARN" /> </filter> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <!-- 输出格式 日期,日志级别,消息,换行--> <param name="ConversionPattern" value="%date [%-5p] %message%n" /> </layout> </appender> <!--ErrorLog文件日志记录器--> <appender name="ErrorLogger" type="log4net.Appender.RollingFileAppender"> <!--日志存放文件夹--> <file value="LogError"/> <!--是否追加到文件--> <appendToFile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--使用UTF-8编码--> <Encoding value="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxSizeRollBackups value="-1"/> <!--是否只写到一个文件中--> <StaticLogFileName value="false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date" /> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <param name="datePattern" value="yyyy/yyyy-MM/yyyy-MM-dd.'log'" /> <!--过滤设置,LevelRangeFilter为使用的过滤器。--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR" /> <levelMax value="ERROR" /> </filter> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <!-- 输出格式 日期,日志级别,消息,换行--> <param name="ConversionPattern" value="%date [%-5p] %message%n" /> </layout> </appender> <!--FatalLog文件日志记录器--> <appender name="FatalLogger" type="log4net.Appender.RollingFileAppender"> <!--日志存放文件夹--> <file value="LogFatal"/> <!--是否追加到文件--> <appendToFile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--使用UTF-8编码--> <Encoding value="UTF-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxSizeRollBackups value="-1"/> <!--是否只写到一个文件中--> <StaticLogFileName value="false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <rollingStyle value="Date" /> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <param name="datePattern" value="yyyy/yyyy-MM/yyyy-MM-dd.'log'" /> <!--过滤设置,LevelRangeFilter为使用的过滤器。--> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="FATAL" /> <levelMax value="FATAL" /> </filter> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <!-- 输出格式 日期,日志级别,消息,换行--> <param name="ConversionPattern" value="%date [%-5p] %message%n" /> </layout> </appender> </log4net> </configuration>
三、添加自定义log4net使用类
using log4net; using log4net.Config; using System; using System.IO; namespace mytest { /// <summary> /// Logger是直接和应用程序交互的组件。Logger只是产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。 /// </summary> public class Logger { private static ILog logger; static Logger() { if (logger == null) { var repository = LogManager.CreateRepository("NETCoreRepository"); //log4net从log4net.config文件中读取配置信息 XmlConfigurator.Configure(repository, new FileInfo("log4net.config")); logger = LogManager.GetLogger(repository.Name, "InfoLogger"); } } /// <summary> /// (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。 下面演示根据每个日志等级生成对应的一个文件。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Debug(string message, Exception exception = null) { if (exception == null) logger.Debug(message); else logger.Debug(message, exception); } /// <summary> /// INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Info(string message, Exception exception = null) { if (exception == null) logger.Info(message); else logger.Info(message, exception); } /// <summary> /// WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Warn(string message, Exception exception = null) { if (exception == null) logger.Warn(message); else logger.Warn(message, exception); } /// <summary> /// (一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Error(string message, Exception exception = null) { if (exception == null) logger.Error(message); else logger.Error(message, exception); } /// <summary> /// FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Fatal(string message, Exception exception = null) { if (exception == null) logger.Fatal(message); else logger.Fatal(message, exception); } } }
四、使用
public IActionResult Index() { Logger.Fatal("这是Fatal级日志");//此处调用日志记录函数记录日志 Logger.Error("这是Error级日志"); Logger.Warn("这是Warn级日志"); Logger.Info("这是Info级日志"); Logger.Debug("这是Debug级日志"); return View(); }
具体步骤:
1、项目创建Core web项目
2、引用log4net
3、右击项目选择创建Log4Net.config 并配置
4、创建辅助类。
5、在控制器内使用。
.FrameWork的配置
1、创建基于.FrameWork的空的MVC项目并添加Log4Net的Nuget包
加入
二、创建Log4Net.config类。,参考以上配置即可。
三、创建辅助对LogNet.config类操作的辅助类,参考以上配置即可
(区别-其他没有什么改变:Core是自动加载Log4Net对象,FrameWordk则是通过指定方式-具体需要第四步注册AssemblyInfo.cs并具体指定Log4Net对象)。
using log4net; using log4net.Config; using System; using System.IO; namespace mytest { /// <summary> /// Logger是直接和应用程序交互的组件。Logger只是产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。 /// </summary> public class Logger { private static ILog logger; static Logger() { if (logger == null) { XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)); logger = LogManager.GetLogger(typeof(Logger)); } } /// <summary> /// (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。 下面演示根据每个日志等级生成对应的一个文件。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Debug(string message, Exception exception = null) { if (exception == null) logger.Debug(message); else logger.Debug(message, exception); } /// <summary> /// INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Info(string message, Exception exception = null) { if (exception == null) logger.Info(message); else logger.Info(message, exception); } /// <summary> /// WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Warn(string message, Exception exception = null) { if (exception == null) logger.Warn(message); else logger.Warn(message, exception); } /// <summary> /// (一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Error(string message, Exception exception = null) { if (exception == null) logger.Error(message); else logger.Error(message, exception); } /// <summary> /// FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Fatal(string message, Exception exception = null) { if (exception == null) logger.Fatal(message); else logger.Fatal(message, exception); } } }
四、在AssemblyInfo.cs中注册这个Log4Net.config,不然是不会自动生成text文件的。
只需要添加一行代码:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
五、简单使用
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace mytest.Controllers { public class HomeController : Controller { // GET: Home public ActionResult Index() { Logger.Fatal("这是Fatal级日志");//此处调用日志记录函数记录日志 Logger.Error("这是Error级日志"); Logger.Warn("这是Warn级日志"); Logger.Info("这是Info级日志"); Logger.Debug("这是Debug级日志"); return View(); } } }
即可
具体目录结构
注意:如果不行 则Log4Net.config类属性设置始终复制 即可
Log4net在类库中的用法
一、创建Common类库,并分别向项目和类库中添加Log4net包。
二、log4net的配置文件如上,设置此文件的属性复制到输出目录为:始终复制。注意这一项很重要。
也可以系统配置文件Web.config,普通应用的配置文件 为App.config,asp.net的配置文件为Web.config。
三、添加引用到程序集——在Global.asax的Application_Start事件中加入初始化代码:
public class MvcApplication : System.Web.HttpApplication { private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); } }
四、log4net配置文件放在项目内,并且在项目的AssemblyInfo.cs里面加上[assembly: log4net.Config.XmlConfigurator()],这样项目工程和log4net就 建立了关联
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
五、类库内仅仅放入对log4net操作类即可。
using log4net; using log4net.Config; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Common { /// <summary> /// Logger是直接和应用程序交互的组件。Logger只是产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。 /// </summary> public class Logger { public static ILog logger => LogManager.GetLogger("MMISLogger"); /// <summary> /// (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。 下面演示根据每个日志等级生成对应的一个文件。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Debug(string message, Exception exception = null) { if (exception == null) logger.Debug(message); else logger.Debug(message, exception); } /// <summary> /// INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Info(string message, Exception exception = null) { if (exception == null) logger.Info(message); else logger.Info(message, exception); } /// <summary> /// WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Warn(string message, Exception exception = null) { if (exception == null) logger.Warn(message); else logger.Warn(message, exception); } /// <summary> /// (一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Error(string message, Exception exception = null) { if (exception == null) logger.Error(message); else logger.Error(message, exception); } /// <summary> /// FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。 /// </summary> /// <param name="message"></param> /// <param name="exception"></param> public static void Fatal(string message, Exception exception = null) { if (exception == null) logger.Fatal(message); else logger.Fatal(message, exception); } } }
六、使用方式
调用com类库的方法
Logger.Fatal("这是Fatal级日志");//此处调用日志记录函数记录日志 Logger.Error("这是Error级日志"); Logger.Warn("这是Warn级日志"); Logger.Info("这是Info级日志"); Logger.Debug("这是Debug级日志");