zoukankan      html  css  js  c++  java
  • 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应用程序中使用日志

  • 相关阅读:
    centos7安装rabbitmq 总结
    python第六十三天-- 第十一周作业
    python第六十一天,第六十二天 redis
    python第六十天-----RabbitMQ
    python第五十四天--第十周作业
    python第五十三天--进程,协程.select.异步I/O...
    python第五十二天---第九周作业 类 Fabric 主机管理程序
    python第五十一天----线程,Event,队列
    Python基础之-面向对象编程(引言)
    Python中的模块
  • 原文地址:https://www.cnblogs.com/youngytj/p/5672306.html
Copyright © 2011-2022 走看看