install-package nlog.config
你現在就可以編譯你的程式然後開始使用nlog了。
note【譯者注】為了從你的程式中建立你所需要的日誌訊息你需要使用日誌記錄api。log就是常說的日誌資訊。
logger
和logmanager
這兩個類將會很經常的被使用到,它們都在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
,error
和fatal
)的所有日誌(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
嘗試著呼叫了baseclass
的getlogger(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 更像是把變化的檔案作快照後,記錄在乙個微型的檔案系統中。每次提交更新時,它會縱覽一遍所有檔案的指紋資訊並對...