zoukankan      html  css  js  c++  java
  • 日志与工厂模式(一)

    关键字:日志 微软企业库 Log4net 工厂模式

    日志是一个成熟系统必不可少的组成部分,而大部分常用的日志无非就是记录时间与发生的消息,日志可以输出到文件,WINDOWS事件以及控制台等等,先来看下面一个简单的日志组件。

    首先定义一个 ISimpleLog 接口

    public interface ISimpleLog {
        void AddLog(string text);
        void AddLog(string text, DateTime time);
    }

    接口包含一个方法名称的两个重载,然后在此接口上写一个实现类,如下:

    public class SimpleTxtFileLog : ISimpleLog {
            public void AddLog(string text) {
                AddLog(text, DateTime.Now);
            }
            public void AddLog(string text, DateTime time) {
                string msg = string.Format("时间:{0}   消息:{1}\r\n", time.ToString(), text);
                string path = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Log.txt");
                File.AppendAllText(path, msg);
            }
        }

    SimpleTxtFileLog 类是将日志记录到文本文件中,文件的路径是当前运行程序的路径,文件名是Log.txt,每行输出格式形如:“时间:2009-6-11 18:18:34   消息:测试日志消息”。

    再来实现一个控制台日志类 SimpleConsoleLog,将日志输出到控制台:

    public class SimpleConsoleLog : ISimpleLog {
        public void AddLog(string text) {
            Console.WriteLine(text, DateTime.Now);
        }
        public void AddLog(string text, DateTime time) {
            string msg = string.Format("时间:{0}   消息:{1}\r\n", time.ToString(), text);
            Console.WriteLine(msg);
        }
    }

    再来实现一个SimpleEventLog类,将日志输出到WINDOWS事件当中。

    public class SimpleEventLog : ISimpleLog {

        public void AddLog(string text) {
            AddLog(text, DateTime.Now);
        }

        public void AddLog(string text, DateTime time) {
            string Source = "SimpleEventLog";
            string Log = "Application";
            if (!EventLog.SourceExists(Source))
                EventLog.CreateEventSource(Source, Log);
            EventLog.WriteEntry(Source, text);
        }
    }

    客户端使用代码:

    ISimpleLog log = new SimpleEventLog();
    log.AddLog("test");
    ISimpleLog log2 = new SimpleConsoleLog();
    log2.AddLog("test");
    ISimpleLog log3 = new SimpleTxtFileLog();
    log3.AddLog("test");

    当然,现实中一般你就会记录到一个日志的位置。如果将来需要记录到数据库中的话,在扩展实现ISimpleLog接口即可。

    现在你会发现,客户端的代码中仍然在使用 new 进行实例化日志类,而这块可能是会变化的,能不能通过修改配置文件并且不用修改客户端代码就可以替换呢,当然可以,用如下的代码就能做到这点:

    public class SimpleLogWrapper {
        public readonly string SimpleLogClassName = ConfigurationManager.AppSettings["SimpleLogClassName"];

        public void AddLog(string text) {
            ISimpleLog log = (ISimpleLog)Assembly.Load("IVSoft.Log.SimpleLog").CreateInstance(SimpleLogClassName);
            log.AddLog(text);
        }

        public void AddLog(string Msg, DateTime time) {
            ISimpleLog log = (ISimpleLog)Assembly.Load("IVSoft.Log.SimpleLog").CreateInstance(SimpleLogClassName);
            log.AddLog(Msg, time);
        }
    }

    需要在你的配置文件中增加一个配置:

    <appSettings>
        <add key="SimpleLogClassName" value="IVSoft.Log.SimpleTxtFileLog" />
    </appSettings>

    这样,客户端就可以使用SimpleLogWrapper 来使用了。

    以上代码都比较简单,实现了一个日志记录的简单方法,但是突然有一天,你发现了微软企业库中的日志组件,觉着这个挺好用的,想在系统中使用它,结果呢?你不得不修改大量的代码,造成了高度的耦合,怎么办?下一篇我们就会使用工厂模式来实现一个比较通用的日志组件,包括企业库中的日志和Log4net组件。

  • 相关阅读:
    Keras猫狗大战二:加载模型预测单张图片
    Keras猫狗大战一:小样本4层卷积网络,74%精度
    用fastai ResNet50训练CIFAR10,85%准确度
    Windows10安装cuda、cudnn、pytorch、jupyter、fastai
    Windows10安装anaconda
    pytorch识别CIFAR10:训练ResNet-34(自定义transform,动态调整学习率,准确率提升到94.33%)
    yolov3和darknet opencv版编译安装及基本测试
    pytorch错误:RuntimeError: received 0 items of ancdata解决
    pytorch错误:Missing key(s) in state_dict、Unexpected key(s) in state_dict解决
    pytorch识别CIFAR10:训练ResNet-34(数据增强,准确率提升到92.6%)
  • 原文地址:https://www.cnblogs.com/codehunter008/p/1501882.html
Copyright © 2011-2022 走看看