NLog簡易使用說明

2021-09-17 02:22:17 字數 4880 閱讀 7996

install-package nlog.config
你現在就可以編譯你的程式然後開始使用nlog了。

note【譯者注】

log就是常說的日誌資訊。

為了從你的程式中建立你所需要的日誌訊息你需要使用日誌記錄api。loggerlogmanager這兩個類將會很經常的被使用到,它們都在nlog命名空間裡面。

logger代表了一些被命名的日誌源,而且他們有可以發出日誌訊息的成員方法。

logmanager則是用於建立和管理logger物件的例項。

有一點你必須要理解的很重要的是,logger並不代表任何特定的日誌輸出(因此,它並不與任何特定的日誌檔案等相關聯),它只是乙個源,它通常對應你**中的乙個類。

從日誌源到輸出型式的對映通過配置檔案和配置api分開定義。

保持這樣的分離是為了讓你可以在**中繼續寫日誌宣告,通過更新一處的設定可以簡單地變換日誌的輸出型式和輸出位置。

建議為每乙個類單獨建立乙個(private static)logger物件。就如我們之前所說的,你需要使用logmanager去建立logger的例項。

下面的**將會建立乙個和class有著相同名字的logger

namespace mynamespace

}

管理logger的名字也是可以的:

using nlog;

logger logger = logmanager.getlogger("myclassname");

因為logger物件是執行緒安全的,所以你可以簡單地建立它並存放在乙個static變數中。

每乙個日誌訊息都用乙個日誌級別來修飾,它們用來識別訊息的重要性和具體細節。nlog可以以logger物件的名稱和日誌級別為主,路由日誌訊息。

nlog支援下面的日誌級別:

你可以簡單地通過呼叫logger物件的其中乙個成員方法來書寫日誌訊息。logger類有六個成員函式,和它們的日誌級別相符合:trace(),debug(),info(),warn(),error(),fatal()

當然,也有乙個成員函式叫log(),你可以將日誌級別作為引數來呼叫這個方法。

using nlog;

public class myclass

}

日誌訊息也可以被引數化 - 你可以使用字串格式,就像你在console.writeline()string.format()中一樣:

using nlog;

public class myclass

, l=", k, l);

logger.debug("sample debug message, k=, l=", k, l);

logger.info("sample informational message, k=, l=", k, l);

logger.warn("sample warning message, k=, l=", k, l);

logger.error("sample error message, k=, l=", k, l);

logger.fatal("sample fatal error message, k=, l=", k, l);

logger.log(loglevel.info, "sample informational message, k=, l=", k, l);

}}

tip:你應當盡量避免自己進行字串格式化來替代使用nlog中內建的格式化方法(比如:連線,以及自行呼叫string.format())。具體原因表現在:

格式化日誌訊息需要花費很長時間,所以nlog嘗試將格式化操作推遲到了當日誌訊息需要被輸出的時候。如果訊息的最後處理被跳過了,由於日誌記錄配置,你將不需要花費時間在string.format()上。具體參見日誌記錄效能最優化。

雖然到現在為止我們已經學習了如何從**中建立日誌訊息,但是我們還沒有對我們的日誌進行任何的配置輸出。所以,當你執行你的測試應用程式時,你將會看到……好吧,啥都沒有。現在我們開啟nlog.config檔案然後新增一些日誌規則:

部分中,新增:

這將會定義乙個目標,日誌將會被輸出到乙個叫做file.txt的檔案中。

部分中,新增:

這個片段將會引導info級別以及更高階別(包括info,warn,errorfatal)的所有日誌(name="*")輸出到乙個已命名為logfile的目標。

注意,當你將這個在visual studio中輸入時,你應該可以看到intellisense會建議屬性名並且驗證他們的值。最後的配置檔案應該像這樣:

<?xml version="1.0" encoding="utf-8" ?>

讓我們來試試更複雜的東西吧。想象一下你想要將非常細節的日誌傳送到乙個檔案,而且你也希望在控制台視窗中看到他們,但是在控制台視窗中細節稍微少一些。下面的配置檔案可以實現這樣的需求:

<?xml version="1.0" encoding="utf-8" ?>

如你所見,我們現在有多個目標,而且有多個規則來路由日誌到目標。

<?xml version="1.0" encoding="utf-8" ?>

第乙個規則將會將以somenamespace.component開頭的logger物件的trace級別及以上級別的日誌傳送到日誌檔案。屬性final=true將會使得在寫入操作之後停止進一步處理。

第二個規則將會將剩下的日誌傳送到同乙個日誌檔案,但是這些日誌有乙個約束,那就是級別需要是info或更高。

nlog支援特殊型別的目標,從而不需要它們自己做任何日誌記錄,而是修改其他logger的行為。這些特殊的目標就稱之為封裝器。最常用的封裝器有:

fallbackgroup - 提供錯誤時回滾。

為了使用封裝器,簡單地使用一對括起來的元素用來表示封裝器,然後在部分中使用封裝器的名字,下面是乙個例子:

<?xml version="1.0" encoding="utf-8" ?>

這樣檔案的全部寫入操作都是非同步的了,將會提高呼叫執行緒的響應速度。

層級提供了乙個當日誌被寫入檔案時,指定日誌內容格式的方法。主要有兩種層級:

簡單層級就是乙個字串,在$中嵌入一些特殊的標記。比如下面的宣告將會使得每一條日誌訊息都是用乙個格式為yyymmddhhmmss:的日期字首:

當我們希望將logger物件展開到子物件的時候,我們可以使用下面的**:

class baseclass

protected logger log

}class exactclass : baseclass

...}

在父類(baseclass)的建構函式中,logmanger.getlogger()方法不應該使用type引數自變數,也就是:

protected baseclass()

這樣呼叫會引發乙個異常。

萬一exactclass有乙個預設的呼叫了baseclass建構函式的建構函式,那麼,system.stackoverflowexception就會被引發。這是因為在異常被引發之前,exactclass嘗試著呼叫了baseclassgetlogger(string, type)來構造exactclass

exactclass => baseclass => exactclass => baseclass => ...
exactclass不存在預設的建構函式時,getlogger(string, type)方法呼叫不知道如何去構造exactclass,則引發nlog.nlogconfigurationexception

JSONCPP 簡易使用

1 編譯jsoncpp mkdir usr jsoncpp cp r include usr jsoncpp cp r libs usr jsoncpp 2 jsoncpp簡單例項 1 反序列化json物件 比如乙個json物件的字串序列如下,其中 array 表示json物件中的陣列 那怎麼分別取...

hydra 簡易使用

暴力破解用的協議 rdp 個人筆記,邊使用hydra邊做,準確性無保障。安裝kali系統 安裝的kali linux 64 bit installer 版本2020.4 1.具體位置 2.hydra和hydra gtk hydra 點開直接是命令列介面,相當於直接使用命令列執行。可以直接開終端,使用...

git簡易使用

git是分布式版本控制系統,和其他版本控制系統的主要差別在於git 只關心檔案資料的整體是否發生變化,而大多數其他系統則只關心檔案內容的具體差異。git 並不儲存這些前後變化的差異資料。git 更像是把變化的檔案作快照後,記錄在乙個微型的檔案系統中。每次提交更新時,它會縱覽一遍所有檔案的指紋資訊並對...