前言
一個完整的項目工程離不開日志文件的記錄,而記錄文件的方法也有很多,可以自己通過Stream去實現文件的讀寫來完成日志記錄,但是如果有個好的封裝類庫,那為什么不去用呢?
.net日志記錄,NLog,log4都可以,用什么都可以,根據自己喜好,我常用log4,所以這里還是介紹Log4的引用及用法。
log4net
這個log4從開發到現在,從netframework開始用,一個config文件就夠了,NLog沒用過,但是應該都是大差不差,畢竟名字都這么相似嘛(手動滑稽)
依然是,NuGet引用第三方類庫
工具->NuGet包管理器->管理解決方案的NuGet程序包…
在瀏覽中查找"log4",選擇項目工程,點擊安裝。
安裝完成后,依然是來Startup.cs,這次在構造函數直接聲明實例化。
public Startup(IConfiguration configuration)
{
Configuration = configuration;
repository = LogManager.CreateRepository("AprilLog");
XmlConfigurator.Configure(repository, new FileInfo("Config/log4net.config"));//配置文件路徑可以自定義
BasicConfigurator.Configure(repository);
}
//log4net日志
public static ILoggerRepository repository { get; set; }
配置文件的創建可以在工程目錄下新建一個config文件,配置信息如下,需要標注的信息基本上都在文件注釋中,不過多闡述:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- This section contains the log4net configuration settings -->
<log4net debug="false">
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--很關鍵的一句,讓日志文件不被占用-->
<file value="logs/" /> <!-- 日志生成文件路徑 -->
<appendToFile value="true" />
<rollingStyle value="Composite" />
<staticLogFileName value="false" />
<datePattern value="yyyyMMdd'.log'" /> <!-- 日志文件名稱格式 -->
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" /> <!-- 最大文件大小,達到后生成新文件 -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> <!-- 生成日志格式 -->
</layout>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="ALL" /> <!-- 日志等級 -->
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
</configuration>
創建完成后,還是要對比下你的配置文件目錄與實際目錄是否一致。
OK,全部確認完成后,可以在需要用到Log的地方,添加以下代碼:
private ILog log = LogManager.GetLogger(Startup.repository.Name, "Name");
…
log.Info("測試");
例如我們繼續拿Values這個控制器開刀。
寫好之后我們運行代碼,運行后我們可以看到工程目錄已經有了logs這個文件夾,打開日志文件。
這樣我們就可以在日常使用中記錄日志,方便調試記錄,追蹤問題所在。
整合LogUtil
我這個人比較懶,並且我也不需要關心它是在哪運行,我只想要記錄的時候調用下方法,所以對日志記錄做了封裝調整。
首先,新建類庫工程,Apirl.Util(這個工程應該剛開始都創建的-,-||)。
類庫工程新建完成的第一件事,干掉Class.cs(我要這示例有何用)
將log4net通過NuGet引入Util工程,過程不過多說了,引用的介紹已經可以了。
引用完成后,在WebApi工程引入Util。
選中Util這個類庫工程。
題外話,其實NuGet引入第三方類庫在一個項目工程即可,其他工程只要引用對應的項目工程,也可以使用對應的第三方類庫,即我在Util引入log4,我就沒必要在WebApi工程再引入,這里只是為了講解說明。
新建LogUtil這個類,代碼如下。
public class LogUtil
{
private static readonly ILog log = LogManager.GetLogger("AprilLog", typeof(LogUtil));
/// <summary>
/// 調試日志
/// </summary>
/// <param name="msg"></param>
/// <param name="obj"></param>
public static void Debug(string msg, object obj = null)
{
if (log.IsDebugEnabled && !string.IsNullOrEmpty(msg))
{
if (obj == null)
{
log.Debug(msg);
}
else
{
log.DebugFormat(msg, obj);
}
}
}
/// <summary>
/// 日常日志
/// </summary>
/// <param name="msg"></param>
/// <param name="obj"></param>
public static void Info(string msg, object obj = null)
{
if (log.IsInfoEnabled && !string.IsNullOrEmpty(msg))
{
if (obj == null)
{
log.Info(msg);
}
else
{
log.InfoFormat(msg, obj);
}
}
}
/// <summary>
/// 錯誤日志
/// </summary>
/// <param name="msg"></param>
/// <param name="obj"></param>
public static void Error(string msg, object obj = null)
{
if (log.IsErrorEnabled && !string.IsNullOrEmpty(msg))
{
if (obj == null)
{
log.Error(msg);
}
else
{
log.ErrorFormat(msg, obj);
}
}
}
/// <summary>
/// 重要日志
/// </summary>
/// <param name="msg"></param>
/// <param name="obj"></param>
public static void Fatal(string msg, object obj = null)
{
if (log.IsFatalEnabled && !string.IsNullOrEmpty(msg))
{
if (obj == null)
{
log.Fatal(msg);
}
else
{
log.FatalFormat(msg, obj);
}
}
}
}
下完之后,繼續ValuesController(Why一直是這),更改代碼如下:
運行看下效果。
小結
封裝的好處是為了省事,哪里需要寫(點)哪里,咳咳,日志的重要性在代碼里面不言而喻,沒有日志的工程是不健全的,程序猿可以不會寫邏輯,不去考慮架構,不去優化性能,但是日志的記錄,代碼的注釋是不可或缺的,畢竟如果想活着,這兩個地方還是多注意吧。
下一節,開始緩存機制。