【干货】.NET开发通用组件发布(四) 日志记录组件
组件介绍和合作开发
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> {1} {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>[email protected]</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的时候才会预警。");
看到了吧,这些方法在基类都是可以重写的,也就是意味着,你可以扩展自己的日志记录组件。
如果你用得很爽、或者不爽、都可以发送邮件或在页头的页面里了解我的联系方式,也可以在那里参与开发。
你的推荐和支持是我们最大的荣幸。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。