组件介绍和合作开发

http://www.cnblogs.com/MrHuo/p/MrHuoControls.html

日志记录组件功能介绍

  通过基类Logger,实现了文本记录日志和数据库记录日志两种方式。

    1、文本记录:即记录日志到指定的文本文件下。

    2、数据库记录:数据库记录,给定数据库连接字符串,指定数据库名称,即可实现自动建立数据库、根据配置自动分表记录、通过配置可自动发送Warn级别的日志到Email、短信接口以实现日志的及时预警。

    3、不久会推出专门针对此日志记录组件的日志查看工具。敬请期待。

日志基类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MrHuo.Controls.Log;
using System.Web;
using System.Diagnostics;
using System.Threading;
using MrHuo.Controls.SMS;
using System.Reflection;

namespace MrHuo.Controls.Log
{
    /// <summary>
    /// 日志基类
    /// </summary>
    public abstract class Logger : IDisposable
    {
        /// <summary>
        /// 默认构造函数
        /// </summary>
        public Logger() { }

        #region [属性和字段]
        private string _User = "Not Login";
        /// <summary>
        /// 获取或者设置一个值,该值表示当前操作进行的用户
        /// </summary>
        public String User
        {
            get
            {
                return _User;
            }
            set
            {
                _User = value;
            }
        }
        /// <summary>
        /// 获取或者设置一个值,该值表示当前操作所在的类
        /// </summary>
        public String Page { get; set; }
        #endregion

        #region [静态方法]
        /// <summary>
        /// 日志记录组件配置文件
        /// </summary>
        protected static LogConfig LogConfig = new LogConfig();
        /// <summary>
        /// 静态方法,根据当前操作的类创建日志
        /// </summary>
        /// <param name="page"></param>
        /// <returns></returns>
        public static Logger CreateLogger(String page)
        {
            return CreateLogger(page, "Not Login");
        }
        /// <summary>
        /// 静态方法,根据当前操作的类的类型创建日志
        /// </summary>
        /// <param name="page"></param>
        /// <returns></returns>
        public static Logger CreateLogger(Type page)
        {
            return CreateLogger(page.ToString());
        }
        /// <summary>
        /// 静态方法,根据当前操作的类和当前操作人创建日志
        /// </summary>
        /// <param name="page"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public static Logger CreateLogger(String page, string user)
        {
            Logger ret = null;
            switch (LogConfig.LogType)
            {
                case LogType.File:
                    ret = new FileLogger();
                    break;
                case LogType.DataBase:
                    ret = new DataBaseLogger();
                    break;
            }
            if (ret != null)
            {
                ret.Page = page != null ? page : "unkown";
                ret.User = user;
            }
            return ret;
        }
        #endregion

        #region [记录方法]
        /// <summary>
        /// 用于记录Debug日志。在Debug模式下,只有定义了DEBUG预编译指令时才会记录日志
        /// </summary>
        /// <param name="message"></param>
        public virtual void Debug(string message)
        {
#if DEBUG
            InnerLogMethod(LogLevel.Debug, message);
#endif
        }
        /// <summary>
        /// 记录常规日志
        /// </summary>
        /// <param name="message"></param>
        public virtual void Info(string message)
        {
            InnerLogMethod(LogLevel.Info, message);
        }
        /// <summary>
        /// 记录错误日志
        /// </summary>
        /// <param name="message"></param>
        public virtual void Error(string message)
        {
            InnerLogMethod(LogLevel.Error, message);
        }
        /// <summary>
        /// 记录错误日志
        /// </summary>
        /// <param name="ex"></param>
        public virtual void Error(Exception ex)
        {
            Error(ex.ToString().Replace("\r\n", "$"));
        }
        /// <summary>
        /// 记录警告日志
        /// <para>默认会发送短信或邮件给指定账号</para>
        /// </summary>
        /// <param name="message"></param>
        public virtual void Warn(string message)
        {
            WarnIf(true, message);
        }
        /// <summary>
        /// 当条件为真,则发送短信或邮件。否则只记录日志。
        /// </summary>
        /// <param name="condition"></param>
        /// <param name="message"></param>
        public virtual void WarnIf(bool condition, string message)
        {
            if (condition)
            {
                string msg = String.Format("<b>{0}</b>&nbsp;&nbsp;{1}&nbsp;&nbsp;{2}<br/>", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), User, message);
                switch (LogConfig.LogWarnType)
                {
                    case LogWarnType.OFF:
                        break;
                    case LogWarnType.Email:
                        new Thread(new ThreadStart(() =>
                        {
                            using (Email.EmailSender sender = new Email.EmailSender()
                            {
                                Subject = "[Event Log System]",
                                EmailBody = msg
                            })
                            {
                                sender.AddReceiver(LogConfig.LogWarnEmail);
                                sender.Send();
                            }
                        })).Start();
                        break;
                    case LogWarnType.SMS:
                        new Thread(new ThreadStart(() =>
                        {
                            SMSSender.Send(LogConfig.LogWarningSMSReciver, msg);
                        })).Start();
                        break;
                }
            }
            InnerLogMethod(LogLevel.Warn, message);
        }
        /// <summary>
        /// 内部核心日志记录逻辑,需重写。
        /// </summary>
        /// <param name="LogLevel"></param>
        /// <param name="message"></param>
        protected abstract void InnerLogMethod(LogLevel LogLevel, String message);
        #endregion

        /// <summary>
        /// 释放系统资源
        /// </summary>
        public void Dispose()
        {
            if (!String.IsNullOrEmpty(_User))
            {
                GC.ReRegisterForFinalize(_User);
            }
            if (!String.IsNullOrEmpty(User))
            {
                GC.ReRegisterForFinalize(User);
            }
            if (!String.IsNullOrEmpty(Page))
            {
                GC.ReRegisterForFinalize(Page);
            }
            if (LogConfig != null)
            {
                GC.ReRegisterForFinalize(Page);
            }
            GC.Collect();
        }
    }
}

以上就是基类的一些代码,其中使用到了邮件发送组件短信发送组件。

当然,由于本人时间有限、技术有限,也就能写到这里了。

日志组件配置文件

保存位置:.\Configs\LogConfig.xml下。

<?xml version="1.0" encoding="utf-8"?>
<LogConfig>
  <WarningMode>Email</WarningMode>
  <!--预警模式,可选项【OFF(不预警)/Email(电子邮件,需要Email组件配置文件)/SMS(短信,需要短信组件配置文件)】-->
  <WarningEmail>admin@mrhuo.com</WarningEmail>
  <!--预警模式为Email时会将日志信息发送到这个电子邮件,需要配置文件Config\SMTPConfig.xml-->
  <WarningSMSReciver>151********</WarningSMSReciver>
  <!--预警模式为SMS时会将日志信息发送到这个手机号码,需要配置文件Config\SMSConfig.xml-->
  <LogType>DataBase</LogType>
  <!--日志记录方式【File(文件)/DataBase(数据库)】-->
  <SavePath>C:\\Logs\\</SavePath>
  <!--日志记录方式为File时,日志文件保存的位置-->
  <DBConnectionString>SERVER=ip;USER=sa;PASSWORD=pass;</DBConnectionString>
  <!--日志记录方式为数据库时的数据库连接字符串。注意不要在连接字符串中添加数据库名称,数据库为自动创建。-->
  <DBName>DB_Project_Logs</DBName>
  <!--日志数据库名称-->
  <SplitTableByDays>5</SplitTableByDays>
  <!--日志分表储存相的依据隔天数-->
  <CurrentTableName></CurrentTableName>
  <!--内置预留字段,禁止修改!-->
</LogConfig>

使用实例:

Logger log = Logger.CreateLogger(LoggerType);

log.User=Session["LoginedUser"]; //比如:我们需要记录用户登陆后的操作

log.Debug("这里的日志,只有程序集编译在DEBUG模式或者定义DEBUG预编译命令的时候才会记录。");

log.Warn("这里的日志,只有在配置文件里预警模式开启的时候,才会发送到短信或者Email");

log.Error("错误日志");

log.Info("消息日志");

log.WarnIf(a==1,"这里的日志,只有前面的条件为True的时候才会预警。");

看到了吧,这些方法在基类都是可以重写的,也就是意味着,你可以扩展自己的日志记录组件。

如果你用得很爽、或者不爽、都可以发送邮件或在页头的页面里了解我的联系方式,也可以在那里参与开发。

你的推荐和支持是我们最大的荣幸。

【干货】.NET开发通用组件发布(四) 日志记录组件的更多相关文章

  1. log4net--不可多得的开源日志记录组件

    log4net--不可多得的开源日志记录组件 1 前奏 一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具. 2 说明 Log4net介绍就不 ...

  2. Elmah 日志记录组件

    http://www.cnblogs.com/jys509/p/4571298.html 简介 ELMAH(Error Logging Modules and Handlers)错误日志记录模块和处理 ...

  3. 日志记录组件[Log4net]详细介绍

    转载:http://www.cnblogs.com/liwei6797/archive/2007/04/27/729679.html 因为工作中有要用到Log记录,找到一篇不错的文章,就转了过来. 一 ...

  4. C#Log4net日志记录组件的使用

    一.Log4Net介绍 Log4net是基于.NET开发的一款非常著名的记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR. WARN. INFO ...

  5. 以HTML为表现的日志记录组件

    日志搬家:http://www.loogn.net/blog/Article.aspx?id=21 关于日志记录,如果你不想随用随写,又不想用log4net的话,也许你可以了解一下这个! 我也是个很懒 ...

  6. Swift3.0服务端开发(三) Mustache页面模板与日志记录

    本篇博客主要介绍如果在Perfect工程中引入和使用Mustache页面模板与日志记录系统.Mustache页面模板类似于PHP中的smarty模板引擎或者Java中的JSTL标签.当然Mustach ...

  7. Python开发【Django】:日志记录、API认证

    日志记录: 调用同一个对象,分别记录错误日志和运行日志 自定义日志类: class Logger(object): __instance = None def __init__(self): self ...

  8. MVC使用 Elmah 日志记录组件

    在后台管理中,有一些操作是需要增加操作日志的,尤其是对一些比较敏感的金额类的操作,比如商城类的修改商品金额.删除商品.赠送金额等人工的操作.日志中记录着相关操作人的操作信息,这样,出了问题也容易排查. ...

  9. 【干货】.NET开发通用组件发布(一) 介绍

    组件介绍 集合个人和团都开发中遇到的一些通用组件,邮件发送组件.内容采集.CSV数据文件导入工具.日志记录组件.MVC验证登陆组件.MVC分页组件.短信发送组件和强大的Repeate和Repeater ...

随机推荐

  1. 我和小美的撸码日记(2)之第一个基于MVC+Jqgrid的列表页面

    一.前言 “尼玛哥,上周你教我改了下OA系统UI,黄总看了很满意呀.”    “不错不错,看来小美进步很大,可以提前结束试用期,到时候加工资别忘了请我吃饭呀!”    “尼玛哥,你有女朋友了吗?” “ ...

  2. Java学习笔记--Socket和ServerSocket

    参考资料: http://haohaoxuexi.iteye.com/blog/1979837http://zhidao.baidu.com/link?url=OeOSa0YbOzSbMVPa8sgP ...

  3. 开始3D编程前需注意的十件事

    http://www.csdn.net/article/2013-06-21/2815949-3d-programming 原文作者Vasily Tserekh是名3D编程爱好者,他发表了一篇博文&l ...

  4. Unity3d有关图形尺寸大小的注意事项

    主要参考了官方文档,然后根据个人的理解撰写该文.Unity3D支持的图形文件格式有 PSD, TIFF, JPG, TGA, PNG, GIF, BMP, IFF, PICT(但根据本人的亲手测试,U ...

  5. Oracle 提示密码过期问题:the password will expire

    SQL> conn scott/tiger ERROR: ORA: the password will expire within days Connected. SQL> conn /a ...

  6. cf C. Purification

    http://codeforces.com/contest/330/problem/C 这道题分三种情况.有一行全是E,有一列全是E,还有一种为无解的情况. #include <cstdio&g ...

  7. 在NGINX作反向代理,CI(CodeIgniter)的PHP框架下限制管理目录的IP的实现

    这个搞得有点久,不过,还算完美解决. 主要是前端NGINX,后端也是NGINX. 前端的NGINX不好作相关的URL权限限制,因为所有的URL在CI里都要经过INDEX.PHP重定向. 并且,在后端N ...

  8. PHP数据结构:栈、队列、堆、固定数组

    数据结构:栈 队列: 堆: 固定尺寸的数组:

  9. python glob标准库基础学习

    #glob文件名模式匹配#作用:使用unix shell规则查找与一个模式匹配文件名"""尽管glob api很小,但这个模块很强大,只要程序需要查找文件系统中名字与某种 ...

  10. MapReduce新版客户端API源码分析

    使用MapReduce新版客户端API提交MapReduce Job需要使用 org.apache.hadoop.mapreduce.Job 类.JavaDoc给出以下使用范例. // Create ...