• 日志模块


    日志模块

    对于一个系统来说,日志模块是必不可少的,它能给后面系统的维护和bug的修复,带来极大的方便。.net的日志模块有很多,比较流行的有Log4Net,NLog,还有微软企业库的日志模块,我采用的是Log4Net,

    1、接口

       由于日志是所有模块都要用到的,因此在核心模块(Core)中实现,为了解耦,自定义一个日志接口ILogger ,参照Log4Net的日志分级,也分为5级,每一级别有1-2个方法, 代码如下。

    /// <summary>
        /// 日志操作
        /// </summary>
        public interface ILogger
        {
    
            /// <summary>
            /// 写日志 日志级别为Debug
            /// </summary>
            /// <param name="message">消息</param>
            void Debug(string message);
            /// <summary>
            /// 写日志 日志级别为Debug
            /// </summary>
            /// <param name="format">消息格式字符串</param>
            /// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
            void Debug(string format, params object[] args);
            /// <summary>
            /// 写日志 日志级别为 Error
            /// </summary>
            /// <param name="message">消息</param>
            void Error(string message);
            /// <summary>
            /// 写日志 日志级别为 Error
            /// </summary>
            /// <param name="format">消息格式字符串</param>
            /// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
            void Error(string format, params object[] args);
            /// <summary>
            /// 写日志 日志级别为 Error
            /// </summary>
            /// <param name="message">消息</param>
            /// <param name="t">系统错误类</param>
            void Error(string message, Exception t);
    
            /// <summary>
            /// 写日志 日志级别为 Info
            /// </summary>
            /// <param name="message">消息</param>
            void Info(string message);
            /// <summary>
            /// 写日志 日志级别为 Info
            /// </summary>
            /// <param name="format">消息格式字符串</param>
            /// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
            void Info(string format, params object[] args);
    
            /// <summary>
            /// 写日志 日志级别为 Warning
            /// </summary>
            /// <param name="message">消息</param>
            void Warning(string message);
            /// <summary>
            /// 写日志 日志级别为 Warning
            /// </summary>
            /// <param name="format">消息格式字符串</param>
            /// <param name="args">一个对象数组,其中包含零个或多个要设置格式的对象</param>
            void Warning(string format, params object[] args);
        }

    2、实现:
    实现就比较简单了,直接调用Log4Net的相关方法即可,代码如下

    public class Log4NetLogger : ILogger
        {
            internal Log4NetLogger()
                : this(typeof(ILogger))
            {
            }
    
            internal Log4NetLogger(Type type)
            {
                log4net.Config.XmlConfigurator.Configure();
                Log = log4net.LogManager.GetLogger(type);
            }
    
            log4net.ILog Log;
    
    
            #region Implementation of ILogger
    
            public void Warning(string message)
            {
                Log.Warn(message);
            }
    
            public void Debug(string message)
            {
                Log.Debug(message);
            }
    
            public void Info(string message)
            {
                Log.Info(message);
            }
    
            public void Error(string message)
            {
                Log.Error(message);
            }
    
            public void Error(string message, Exception t)
            {
                Log.Error(message);
                Log.ErrorFormat("Error: {0}, exception: {1}", t.Message, t);
            }
    
            public void Debug(string format, params object[] args)
            {
                Log.DebugFormat(format, args);
            }
    
            public void Error(string format, params object[] args)
            {
                Log.ErrorFormat(format, args);
            }
    
            public void Info(string format, params object[] args)
            {
                Log.InfoFormat(format, args);
            }
    
            public void Warning(string format, params object[] args)
            {
                Log.WarnFormat(format, args);
            }
            #endregion
        }

    为了使用方便,增加一个工厂类,用于创建日志接口,代码如下

    /// <summary>
        /// 日志工厂
        /// </summary>
        public class LogFactory {
            /// <summary>
            /// 获得一个日志操作类
            /// </summary>
            /// <param name="type">类型</param>
            /// <returns>日志操作类</returns>
            public static ILogger GetLogger(Type type) {
                return new Log4NetLogger(type);
            }
        }

    为什么没有用设计的Ioc的方法呐?考虑到,如果用IOC的方式,万一在Ioc初始化之前以及初始化过程中,出现问题,会造成系统的崩溃,而此时日志接口也不能获得,也就无法记录错误日志。基于这个考虑,所有没有用Ioc的思想去是实现。Log4netLogger实例化方法是internal修饰的,不能在core外部实例化,这样就只有LogFactory 一个创建的入口了。

    3、使用

    比如我在另外一个项目里有一个 FrmView的窗体,要在这个里面写日志,只需要加入 ILogger Log = LogFactory.GetLogger(typeof(FrmView));用Log实例就可以了,这个项目也不要添加Log4Net的引用。有关Log4Net的配置,园子里有很多高手写的文章,都非常好,我在这里就不多说了。

    4、总结

    日志模块比较简单,没有什么复杂的业务逻辑,也没有高深的技术含量。但是确是最实用的一个模块。我也是根据我自己的理解设计的,欢迎各位高手指教。

     
     
  • 相关阅读:
    Java8 新特性default
    Java Map操作
    Java List操作
    Java Set操作
    Java集合 List,Set,Map
    Java final,static 关键字
    Java ConcurrentHashMap
    Java Synchronized的用法
    Linux 基本收集
    HashMap 扩容 加载因子
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3310377.html
Copyright © 2020-2023  润新知