目錄緩存
一個完整的項目工程離不開日誌文件的記錄,而記錄文件的方法也有不少,能夠本身經過Stream去實現文件的讀寫來完成日誌記錄,可是若是有個好的封裝類庫,那爲何不去用呢?架構
.net日誌記錄,NLog,log4均可以,用什麼均可以,根據本身喜愛,我經常使用log4,因此這裏仍是介紹Log4的引用及用法。app
這個log4從開發到如今,從netframework開始用,一個config文件就夠了,NLog沒用過,可是應該都是大差不差,畢竟名字都這麼類似嘛(手動滑稽)函數
工具->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這個文件夾,打開日誌文件。.net
這樣咱們就能夠在平常使用中記錄日誌,方便調試記錄,追蹤問題所在。debug
我這我的比較懶,而且我也不須要關心它是在哪運行,我只想要記錄的時候調用下方法,因此對日誌記錄作了封裝調整。
首先,新建類庫工程,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一直是這),更改代碼以下:
運行看下效果。
封裝的好處是爲了省事,哪裏須要寫(點)哪裏,咳咳,日誌的重要性在代碼裏面不言而喻,沒有日誌的工程是不健全的,程序猿能夠不會寫邏輯,不去考慮架構,不去優化性能,可是日誌的記錄,代碼的註釋是不可或缺的,畢竟若是想活着,這兩個地方仍是多注意吧。
下一節,開始緩存機制。