• Prism6下的MEF:添加Logger


    上篇已经简单的构建了一个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_LogErrorErrorLog.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_LogInfoInfoLog.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_LogDebugDebugLog.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_LogWarnWarnLog.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应用程序中使用日志

  • 相关阅读:
    nginx proxy_cache_revalidate
    博客园快速转载的方法,复制html的内容直接粘贴
    理解http浏览器缓存
    github 搜索技巧
    nginx缓存配置及开启gzip压缩
    音乐播放器的显示与隐藏
    寒假近半个月的收获
    javascript编程习惯总结
    关于域名服务器获取流程问题
    云盘WEB资料下载链接
  • 原文地址:https://www.cnblogs.com/youngytj/p/5672306.html
Copyright © 2020-2023  润新知