log4net簡介:
log4net庫是Apache log4j框架在Microsoft .NET平臺的實現,是一個幫助程序員將日誌信息輸出到各種目標(控制檯、文件、數據庫等)的工具。
log4net記錄日誌的功能非常強大。它可以將日誌分不同的等級,以不同的格式,輸出到不同的媒介。下面介紹如何在Visual Studio2013中使用log4net快速創建系統日誌,如何擴展以輸出自定義字段。
1.新建log4net_test_01控制檯應用程序>右擊項目>管理NuGet程序包>輸入log4>安裝Apache log4net
2.在項目中添加log4net.config文件,設置文件屬性複製到輸出目錄爲始終複製,在裏面添加配置項如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<!--記錄正常日誌-->
<logger name="logerror">
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="ALL" />
<appender-ref ref="ErrorAppender" />
</logger>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<!--日誌路徑-->
<param name="File" value="./App_Log\Info\InfoLog.log" />
<!--是否是向文件中追加日誌-->
<param name="AppendToFile" value="true" />
<!--log保留天數-->
<param name="MaxSizeRollBackups" value="100" />
<!--log單個文件最大-->
<param name="MaximumFileSize" value="1MB" />
<!--日誌根據大小滾動-->
<param name="RollingStyle" value="Size" />
<!--日誌文件名是否是固定不變的-->
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>
<!--記錄異常日誌-->
<logger name="loginfo">
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="ALL" />
<appender-ref ref="InfoAppender" />
</logger>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!--日誌路徑-->
<param name="File" value="./App_Log\Error\ErrorLog.log" />
<!--是否是向文件中追加日誌-->
<param name="AppendToFile" value="true" />
<!--log保留天數-->
<param name="MaxSizeRollBackups" value="100" />
<!--log單個文件最大-->
<param name="MaximumFileSize" value="1MB" />
<!--日誌根據大小滾動-->
<param name="RollingStyle" value="Size" />
<!--日誌文件名是否是固定不變的-->
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>
</log4net>
</configuration>
3.應用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using log4net.Config;
namespace log4net_test_01
{
class Program
{
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
static void Main(string[] args)
{
InitLog4Net();
if (loginfo.IsInfoEnabled)
{
loginfo.Info("寫正常運行日誌");
}
if (logerror.IsInfoEnabled)
{
logerror.Error("發生異常",new Exception("這裏發生了異常"));
}
Console.ReadLine();
}
static void InitLog4Net()
{
XmlConfigurator.Configure(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
Console.WriteLine("加載成功Log4Net成功");
}
}
}
4.運行後檢查程序目錄中多出了App_Log文件夾,並且裏面有Error和Info文件夾,存放着記錄的日子文件。
5.在MVC項目中使用log4net記錄日子方法也是一樣,先添加引用弄log4net庫文件,然後添加log4net.config配置文件,區別在於讀取配置初始化在Global.asax中的Application_Start()方法內完成,注意log4net.config文件屬性複製到輸出目錄爲始終複製:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using log4net.Config;
namespace log4net_test02
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
//自動配置基於應用程序的配置設置log4net系統
XmlConfigurator.Configure(new System.IO.FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
}
}
}
6.記錄日誌的方法同上:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace log4net_test02.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
Write("記錄普通日誌");
Write("記錄錯誤日誌",new Exception("自定義異常"));
return Content("在web mvc 中使用 log4net");
}
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
/// <summary>
/// 普通的文件記錄日誌
/// </summary>
/// <param name="info"></param>
private static void Write(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
/// <summary>
/// 錯誤日誌
/// </summary>
/// <param name="info"></param>
/// <param name="se"></param>
private static void Write(string info, Exception se)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info, se);
}
}
}
}
注:這裏記錄普通日誌和記錄錯誤日誌的對象和方法沒有獨立出來,在實際項目開發中應該進行封裝起來統一使用。