【干货】.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>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开发通用组件发布(四) 日志记录组件的更多相关文章
- log4net--不可多得的开源日志记录组件
log4net--不可多得的开源日志记录组件 1 前奏 一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具. 2 说明 Log4net介绍就不 ...
- Elmah 日志记录组件
http://www.cnblogs.com/jys509/p/4571298.html 简介 ELMAH(Error Logging Modules and Handlers)错误日志记录模块和处理 ...
- 日志记录组件[Log4net]详细介绍
转载:http://www.cnblogs.com/liwei6797/archive/2007/04/27/729679.html 因为工作中有要用到Log记录,找到一篇不错的文章,就转了过来. 一 ...
- C#Log4net日志记录组件的使用
一.Log4Net介绍 Log4net是基于.NET开发的一款非常著名的记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR. WARN. INFO ...
- 以HTML为表现的日志记录组件
日志搬家:http://www.loogn.net/blog/Article.aspx?id=21 关于日志记录,如果你不想随用随写,又不想用log4net的话,也许你可以了解一下这个! 我也是个很懒 ...
- Swift3.0服务端开发(三) Mustache页面模板与日志记录
本篇博客主要介绍如果在Perfect工程中引入和使用Mustache页面模板与日志记录系统.Mustache页面模板类似于PHP中的smarty模板引擎或者Java中的JSTL标签.当然Mustach ...
- Python开发【Django】:日志记录、API认证
日志记录: 调用同一个对象,分别记录错误日志和运行日志 自定义日志类: class Logger(object): __instance = None def __init__(self): self ...
- MVC使用 Elmah 日志记录组件
在后台管理中,有一些操作是需要增加操作日志的,尤其是对一些比较敏感的金额类的操作,比如商城类的修改商品金额.删除商品.赠送金额等人工的操作.日志中记录着相关操作人的操作信息,这样,出了问题也容易排查. ...
- 【干货】.NET开发通用组件发布(一) 介绍
组件介绍 集合个人和团都开发中遇到的一些通用组件,邮件发送组件.内容采集.CSV数据文件导入工具.日志记录组件.MVC验证登陆组件.MVC分页组件.短信发送组件和强大的Repeate和Repeater ...
随机推荐
- ECSTORE 新建APP应用
1.用命令新建app // ----- window平台 ----- 直接运行 " 站点根目录/app/base/cmd.bat " 出现命令行后输入 dev:new app my ...
- 第四届CCF大数据学术会议征文通知
第四届CCF大数据学术会议征文通知 2016年10月,兰州 近几年,大数据是各界高度关注积极布局的热点方向.2015年8月,国务院发表<促进大数据发展行动纲要>,正式将大数据提升为国家战略 ...
- Oracle 序列的应用
Oracle创建序列,删除序列,得到序列 序列的创建 create sequence seq_newsId increment by 1 start with 1 maxvalue 999999999 ...
- 自制单片机之十三……时钟IC_DS1302
在网上看了很久,发现初学者最有兴趣的就是DS1302时钟电路,也很自然,它是个做出来就让你觉得最实用的电路了,但实际上制做上并不简单,首先你要让你的显示部分(不管是数码管还是LCD)调试通过.然后把D ...
- 从点击Button到弹出一个MessageBox, 背后发生了什么(每个UI线程都有一个ThreadInfo结构, 里面包含4个队列和一些标志位)
思考一个最简单的程序行为:我们的Dialog上有一个Button, 当用户用鼠标点击这个Button时, 我们弹出一个MessageBox. 这个看似简单的行为, 谁能说清楚它是如何运行起来的,背 ...
- 目测ZIP的压缩率
对word文件,能压到25% 对PDF文件,却只有90% 对压缩文件本身再压缩,几乎没有效果. 考虑到用户一般情况下只有正常的文档,取中位值66%是比较正常的情况,特别是在预估原文件大小的时候.
- Android 对话框简介
对话框(Dialog)是程序运行过程中弹出的窗口,Android中有好多种对话框,如警告对话框,进度对话框,列表对话框,单选对话框,日期选择对话框,时间选择对话框等: 下面用几个例子来演示一下各种对话 ...
- VS调试异常代码 异常:HRESULT: 0x80070057 (E_INVALIDARG) 的处理
碰到这个异常的原因很偶然: 现象:Solution在ReBuild过程中断电了,来电恢复了,重析编译整个Solution不报错,但在浏览页面时始终无法正常浏览,而在design的视图中,每个aspx的 ...
- hdu4623:crime 数学优化dp
鞍山热身赛的题,也是去年多校原题 题目大意: 求n个数的排列中满足相邻两个数互质的排列的数量并取模 当时的思路就是状压dp.. dp[i][state] state用二进制记录某个数是否被取走,i ...
- tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式
tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式 https://github.com/zhangzheyuk/CaseConvert