十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章给大家分享的是有关.net日志系统的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
创新互联是专业的尼元阳网站建设公司,尼元阳接单;提供网站设计制作、网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行尼元阳网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!一. 写在前面
日志系统对于任何项目都是必不可少的,无论对于测试阶段的debug,性能测试,执行时间,操作记录还是线上的问题排查,访问记录等,日志系统都扮演着重要的角色。本篇分享的目的是能帮助需要的人快速搭建自己的LogSystem.,仅供参考。 先上个图呗,自认为页面还算清爽吧:
我的LogSystem使用Log4net入库的方式,网上特别多的分享,但是能完整运行下来的真是很少,所以现在需要和以后用得上的小伙伴抓紧收藏咯。
二. Log4Net自定义内容入库
Log4Net存日志的方式,给人的感觉实在是不实用,IT行业不都求一个自动化吗?废话不说了,先上Log4net入库系统的代码。
LogSystem数据库结构,我的建议是一个项目一个表。
在Log组件中,你需要这样几个类。下面分别给出代码:
LogContent.cs,这里定义了Log实体,在实体化实体的时候,通过给构造函数传参创建好这个对象。注释很详细了
using System; namespace LogComponent { public class LogContent { public LogContent(string logLevel, string logMsg, string logModule, string description, string userName) { LogLevel = logLevel; UserName = userName; Description = description; LogMsg = logMsg; LogModule = logModule; } ////// 日志级别 /// public string LogLevel { get; set; } ////// 日志消息 /// public string LogMsg { get; set; } ////// 系统登陆用户 /// public string UserName { get; set; } ////// 日志描述信息 /// public string Description { get; set; } ////// 记录时间 /// public DateTime LogDate { get; set; } ////// 模块名称 /// public string LogModule { get; set; } } }
LogHelper.cs,定义了日志级别,和写入方法
[assembly: log4net.Config.XmlConfigurator(Watch = true,ConfigFile = "log4net.config")] namespace LogComponent { public class LogHelper { static log4net.ILog log = log4net.LogManager.GetLogger("myLogger"); ////// 异常日志 /// /// 日志信息 /// 代码模块 /// 其他描述 /// 用户名 public static void LogError(string logMsg, string logModule, string description = "", string userName = "") { log.Error(new LogContent("Error", SubLogString(logMsg), logModule, SubLogString(description), userName)); } public static void LogInfo(string logMsg, string logModule, string description = "", string userName = "") { log.Info(new LogContent("Info", SubLogString(logMsg), logModule, SubLogString(description), userName)); } public static void LogWarn(string logMsg, string logModule, string description = "", string userName = "") { log.Warn(new LogContent("Warn", SubLogString(logMsg), logModule, SubLogString(description), userName)); } public static void LogDebug(string logMsg, string logModule, string description = "", string userName = "") { log.Debug(new LogContent("Debug", SubLogString(logMsg), logModule, SubLogString(description), userName)); } private static string SubLogString(string str) { if (str.Length > 1500) { return str.Substring(0, 1500); } return str; } } }
MessagePartternConverter.cs
using log4net.Core; using log4net.Layout.Pattern; using System.IO; using System.Reflection; namespace LogComponent { class MessagePatternConverter : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { if (Option != null) { // Write the value for the specified key WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent)); } else { // Write all the key value pairs WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties()); } } ////// 通过反射获取传入的日志对象的某个属性的值 /// /// ///private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent) { object propertyValue = string.Empty; PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property); if (propertyInfo != null) propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null); return propertyValue; } } }
MyLayout.cs
using log4net.Layout; namespace LogComponent { class MyLayout : PatternLayout { public MyLayout() { this.AddConverter("property", typeof(MessagePatternConverter)); } } }
其实看到这里,最重要的并不是代码了,核心部分Log4net都帮我们写好了,关键在于你的配置,下面是log4net.config的内容。拿到你的web项目里是一样用的。但是不要忘了在你的项目中引用nuget:log4net哟。
log4net.config如下:在其中主要配置了log入库的参数和sql语句,当然还有sql连接。注释已经很详细了
这样一来,你的配置就完成了,你可以直接测试插入的情况:
三. 把Log信息可视化
我的UI使用的是Datatables.js,弹出框是layer,日期组件好像是layDate,下拉框是修改样式后的select2。UI代码是我自己的一个框架里的,内容太多就不贴出来了,你只需要和以前一样,把数据从库里查出来,绑定给任意你喜欢的数据表格上。由于单页面的日志系统没有什么复杂操作,就用个sqlHelper查一下就算了,代码和条件拼接如下
public class xxxDal { private SqlHelper _sqlHelper = new SqlHelper(); ////// 获取xxx的日志 /// /// ///public List GetxxxLog(SM_LogModel model) { StringBuilder sql = new StringBuilder(); List sqlParameters = new List (); StringBuilder sqlWhere = new StringBuilder(); if (!string.IsNullOrWhiteSpace(model.LogStartTime)) { sqlParameters.Add(new SqlParameter("@LogStartTime", model.LogStartTime)); sqlWhere.Append(@" AND h.LogDate > @LogStartTime"); } if (!string.IsNullOrWhiteSpace(model.LogEndTime)) { sqlParameters.Add(new SqlParameter("@LogEndTime", model.LogEndTime)); sqlWhere.Append(@" AND h.LogDate < @LogEndTime"); } if (!string.IsNullOrWhiteSpace(model.LogLevel)) { sqlParameters.Add(new SqlParameter("@LogLevel", model.LogLevel)); sqlWhere.Append(@" AND h.LogLevel = @LogLevel"); } if (!string.IsNullOrWhiteSpace(model.LogModule)) { sqlParameters.Add(new SqlParameter("@LogModule", model.LogModule)); sqlWhere.Append(@" AND h.LogModule = @LogModule"); } sql.AppendFormat(@" WITH t AS ( SELECT ROW_NUMBER() OVER ( ORDER BY id DESC ) AS IndexNum , [Id] , CONVERT(VARCHAR, [LogDate], 21) AS [LogDate] , [UserName] , SUBSTRING([Description], 0, 150) AS [Description] , SUBSTRING([LogMsg], 0, 200) AS [LogMsg] , [LogLevel] , [LogModule] FROM [LogSystem].[dbo].[xxxLog] h WHERE 1 = 1 {0} ) SELECT * FROM t WHERE IndexNum > @startIndex AND indexnum < @endIndex", sqlWhere); sqlParameters.Add(new SqlParameter("@startIndex", model.Start)); sqlParameters.Add(new SqlParameter("@endIndex", model.Start + model.Length)); DataTable dt = _sqlHelper.ExecuteDataTable(sql.ToString(), sqlParameters.ToArray()); return DataTableTools .DataTableToList(dt); } public int GetxxxLogTotalCount(SM_LogModel model) { StringBuilder sql = new StringBuilder(); List sqlParameters = new List (); sql.Append(@" SELECT COUNT(*) FROM [HdPubLog] h where 1=1 "); if (!string.IsNullOrWhiteSpace(model.LogStartTime)) { sqlParameters.Add(new SqlParameter("@LogStartTime", model.LogStartTime)); sql.Append(@" AND h.LogDate > @LogStartTime"); } if (!string.IsNullOrWhiteSpace(model.LogEndTime)) { sqlParameters.Add(new SqlParameter("@LogEndTime", model.LogEndTime)); sql.Append(@" AND h.LogDate < @LogEndTime"); } if (!string.IsNullOrWhiteSpace(model.LogLevel)) { sqlParameters.Add(new SqlParameter("@LogLevel", model.LogLevel)); sql.Append(@" AND h.LogLevel = @LogLevel"); } if (!string.IsNullOrWhiteSpace(model.LogModule)) { sqlParameters.Add(new SqlParameter("@LogModule", model.LogModule)); sql.Append(@" AND h.LogModule = @LogModule"); } return _sqlHelper.ExecuteScalar (sql.ToString(), sqlParameters.ToArray()); } [HttpPost] public LogModel GetxxxxSignelLog(int id) { string sql = @" SELECT [Id] , CONVERT(VARCHAR(30), [LogDate], 21) AS [LogDate] , [UserName] , [Description] , [LogMsg] , [LogLevel] , [LogModule] , [Id] IndexNum FROM [LogSystem].[dbo].[xxxxLog] h WHERE h.id = @Id"; var row = _sqlHelper.ExecuteDataRow(sql, new SqlParameter("@Id", id)); return DataTableTools .DataRowToModel(row); } }
感谢各位的阅读!关于“.net日志系统的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!