net core Webapi基礎工程搭建(四)——日誌功能log4net

前言

一個完整的項目工程離不開日誌文件的記錄,而記錄文件的方法也有不少,能夠本身經過Stream去實現文件的讀寫來完成日誌記錄,可是若是有個好的封裝類庫,那爲何不去用呢?架構

.net日誌記錄,NLog,log4均可以,用什麼均可以,根據本身喜愛,我經常使用log4,因此這裏仍是介紹Log4的引用及用法。app

log4net

這個log4從開發到如今,從netframework開始用,一個config文件就夠了,NLog沒用過,可是應該都是大差不差,畢竟名字都這麼類似嘛(手動滑稽)函數

依然是,NuGet引用第三方類庫

工具->NuGet包管理器->管理解決方案的NuGet程序包…
在瀏覽中查找"log4",選擇項目工程,點擊安裝。
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>

建立完成後,仍是要對比下你的配置文件目錄與實際目錄是否一致。
log4
OK,所有確認完成後,能夠在須要用到Log的地方,添加如下代碼:測試

private ILog log = LogManager.GetLogger(Startup.repository.Name, "Name");
    …
    log.Info("測試");

例如咱們繼續拿Values這個控制器開刀。
測試優化

寫好以後咱們運行代碼,運行後咱們能夠看到工程目錄已經有了logs這個文件夾,打開日誌文件。.net

log
這樣咱們就能夠在平常使用中記錄日誌,方便調試記錄,追蹤問題所在。debug

整合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一直是這),更改代碼以下:

Values
運行看下效果。

log

小結

封裝的好處是爲了省事,哪裏須要寫(點)哪裏,咳咳,日誌的重要性在代碼裏面不言而喻,沒有日誌的工程是不健全的,程序猿能夠不會寫邏輯,不去考慮架構,不去優化性能,可是日誌的記錄,代碼的註釋是不可或缺的,畢竟若是想活着,這兩個地方仍是多注意吧。

下一節,開始緩存機制

相關文章
相關標籤/搜索