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


前言

一個完整的項目工程離不開日志文件的記錄,而記錄文件的方法也有很多,可以自己通過Stream去實現文件的讀寫來完成日志記錄,但是如果有個好的封裝類庫,那為什么不去用呢?

.net日志記錄,NLog,log4都可以,用什么都可以,根據自己喜好,我常用log4,所以這里還是介紹Log4的引用及用法。

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這個文件夾,打開日志文件。

log
這樣我們就可以在日常使用中記錄日志,方便調試記錄,追蹤問題所在。

整合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

小結

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

下一節,開始緩存機制


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM