Prism6下的MEF:添加Logger

来源:http://www.cnblogs.com/youngytj/archive/2016/07/15/5672306.html
-Advertisement-
Play Games

上篇已經簡單的構建了一個Prism的程式,現在我們需要添加一個Logger,Prism本身自帶一個功能簡單的TextLogger,但是我們希望能用.Net常用的Log4net。所以我們需要重載掉Bootstrapper中的CreateLogger方法。 新建一個PrismSample.Infrast ...


上篇已經簡單的構建了一個Prism的程式,現在我們需要添加一個Logger,Prism本身自帶一個功能簡單的TextLogger,但是我們希望能用.Net常用的Log4net。所以我們需要重載掉Bootstrapper中的CreateLogger方法。

新建一個PrismSample.Infrastructure.Logger項目

從nuget中引用log4net的,添加配置文件logging.confing:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    </configSections>
    <log4net>
        <logger name="logerror">
        <level value="ERROR" />
        <appender-ref ref="ErrorAppender" />
        </logger>
        <logger name="loginfo">
        <level value="INFO" />
        <appender-ref ref="InfoAppender" />
        </logger>
        <logger name="logwarn">
        <level value="WARN" />
        <appender-ref ref="WarnAppender" />
        </logger>
        <logger name="logdebug">
        <level value="DEBUG" />
        <appender-ref ref="DebugAppender" />
        </logger>
        <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="App_Log\Error\ErrorLog.log" />
        <param name="AppendToFile" value="true" />
        <param name="MaxSizeRollBackups" value="100" />
        <param name="MaximumFileSize" value="1MB" />
        <param name="RollingStyle" value="Size" />
        <param name="StaticLogFileName" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
        </layout>
        </appender>
        <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="App_Log\Info\InfoLog.log" />
        <param name="AppendToFile" value="true" />
        <param name="MaxSizeRollBackups" value="100" />
        <param name="MaximumFileSize" value="1MB" />
        <param name="RollingStyle" value="Size" />
        <param name="StaticLogFileName" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
        </layout>
        </appender>
        <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="App_Log\Debug\DebugLog.log" />
        <param name="AppendToFile" value="true" />
        <param name="MaxSizeRollBackups" value="100" />
        <param name="MaximumFileSize" value="1MB" />
        <param name="RollingStyle" value="Size" />
        <param name="StaticLogFileName" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
        </layout>
        </appender>
        <appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
        <param name="File" value="App_Log\Warn\WarnLog.log" />
        <param name="AppendToFile" value="true" />
        <param name="MaxSizeRollBackups" value="100" />
        <param name="MaximumFileSize" value="1MB" />
        <param name="RollingStyle" value="Size" />
        <param name="StaticLogFileName" value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
        </layout>
        </appender>
    </log4net>
</configuration>

新建Logger類:

using log4net;
using log4net.Config;
using Prism.Logging;
using System;
using System.IO;

namespace PrismSample.Infrastructure.Logger
{
    public class Logger : ILoggerFacade
    {
        private ILog _debugLogger;
        private ILog _errorLogger;
        private ILog _infoLogger;
        private ILog _warnLogger;

        public Logger()
        {
            var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "logging.config");
            XmlConfigurator.ConfigureAndWatch(logCfg);

            _debugLogger = LogManager.GetLogger("logdebug");
            _errorLogger = LogManager.GetLogger("logerror");
            _infoLogger = LogManager.GetLogger("loginfo");
            _warnLogger = LogManager.GetLogger("logwarn");
        }

        public void Log(string message, Category category, Priority priority)
        {
            switch(category)
            {
                case Category.Debug:
                    _debugLogger.Debug(message ?? "");
                    break;
                case Category.Exception:
                    _errorLogger.Error(message ?? "");
                    break;
                case Category.Info:
                    _infoLogger.Info(message ?? "");
                    break;
                case Category.Warn:
                    _warnLogger.Warn(message ?? "");
                    break;
            }
        }
    }
}

PrismSample添加Logger項目的引用,並重載掉Bootstrapper中的CreateLogger方法:

protected override ILoggerFacade CreateLogger()
{
    return new Logger();
}

Logger之所以不使用導入的方式是因為Logger的初始化在容器的初始化之前,我們預期Logger在程式已啟動就配置完成,這樣我們能記錄容器初始化的過程。

測試Logger

修改ShellViewModel的構造函數如下:

[ImportingConstructor]
public ShellViewModel([Import("ShellView", typeof(IView))]IView view, [Import]ILoggerFacade logger)
{
    this.View = view;
    this._text = "Hello World";
    this.View.DataContext = this;


    logger.Log("ShellViewModel Created", Category.Info, Priority.None);
}

運行後打開Logger文件:
Image

現在整個項目的組織結構如下:
Image

小結

本文演示了log4net在Prism中的簡單應用。
源碼下載

參考信息

[Prism框架實用分享]如何在Prism應用程式中使用日誌


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL 不同於與其他編程語言的最明顯特征是處理代碼的順序。在大數編程語言中,代碼按編碼順序被處理,但是在SQL語言中,第一個被處理的子句是FROM子句,儘管SELECT語句第一個出現,但是幾乎總是最後被處理。 每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用 ...
  • 其中tablename為表的名稱,num為要設置的新的自動遞增值,此時再Insert一條數據,自動遞增值即為num,不過num必須要大於等於現在已有的自動遞增值,否則SQL語句會執行成功,但是實際上不起作用。 ...
  • 1. 決定壓縮哪些對象 通過sp_estimate_data_compression_savings 評估在ROW和PAGE壓縮時分別節省的空間量。 表包含如下數據模式時,會有較好的壓縮效果: 數字類型的列和固定長度的字元類型數據,但兩者的大多數值都不會用到此類型的所有位元組。如INT列的值大多數少於 ...
  • 在Linux中無論是管理系統還是在Linux環境下編程,內嵌的手冊man都是一個很好用的工具,“Linux下不懂得就找man”(man是manual的意思)。本文將介紹我所知道的所有關於man的知識(這麼說也是為了後續如果有所補充的話,能夠更加完備)。 一、man手冊的組成 man涉及的內容廣泛,另 ...
  • 最近剛接觸Linux,整理了一些常用的命令和快捷鍵 Tab補全命令 當命令記不清了,輸入記得的前幾個用Tab就可以將該命令自動補全。 啟動tomcat服務用$startup.sh 停止tomcat服務通$shtdown.sh,請註意,$符一般已有的,只需要$後面的命令行就可以啦。 查看埠使用狀態n ...
  • 最近根據夢織未來論壇的驅動教程學習了一下Windows下的驅動編程,做個筆記備忘。這是第03課《驅動的編程規範》。驅動部分包括基本的驅動卸載函數、驅動打開關閉讀取寫入操作最簡單的分發常式。代碼如下: 1 //CreateDevice.c 2 //2016.07.14 3 4 #include "nt ...
  • 死鎖的定義:如果一組進程中的每一個進程都在等待僅由該組進程中的其他進程才能引發的時間,那麼該組進程是死鎖的。 產生死鎖的必要條件:(產生死鎖必須同時具備下麵四個必要條件) 互斥條件:簡單的說就是進程搶奪的資源必須是臨界資源,一段時間內,該資源只能同時被一個進程所占有 請求和保持條件:當一個進程持有了 ...
  • 我們操作文件,終究離不開編輯文件,對文件內容的編輯,Linux系統下,我們通常使用VI/VIM來編輯文件。VI是每個Linux都會自帶的文本編輯器,VIM是VI的增強版,可能有些發行版本沒有自帶,可以使用sudo apt-get install vim命令安裝vim ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...