手机版

网日志系统解析

时间:2021-09-06 来源:互联网 编辑:宝哥软件园 浏览:

一。写在前面

日志系统对于任何项目都是必不可少的,无论对于测试阶段的调试,性能测试,执行时间,操作记录还是线上的问题排查,访问记录等,日志系统都扮演着重要的角色。本篇分享的目的是能帮助需要的人快速搭建自己的日志系统。仅供参考。先上个图呗,自认为页面还算清爽吧:

我的日志系统使用Log4net入库的方式,网上特别多的分享,但是能完整运行下来的真是很少,所以现在需要和以后用得上的小伙伴抓紧收藏咯。

二Log4Net网络自定义内容入库

Log4Net存日志的方式,给人的感觉实在是不实用,IT行业不都求一个自动化吗?废话不说了,先上Log4net入库系统的代码。

日志系统数据库结构,我的建议是一个项目一个表。

在原木组件中,你需要这样几个类。下面分别给出代码:

LogContent.cs,这里定义了原木实体,在实体化实体的时候,通过给构造函数传参创建好这个对象。注释很详细了

使用系统;命名空间LogComponent { public class LogContent { public LogContent(string logLevel,string logMsg,string logModule,string description,string userName){ logLevel=logLevel;用户名=用户名;描述=描述;LogMsg=logMsgLogModule=logModule }///摘要///日志级别////摘要公共字符串LogLevel { get设置;} ///摘要///日志消息////摘要公共字符串LogMsg { get设置;} ///摘要///系统登陆用户////摘要公共字符串用户名{ get设置;} ///摘要///日志描述信息////摘要公共字符串描述{ get设置;} ///摘要///记录时间////汇总公共日期时间日志日期{获取设置;} ///摘要///模块名称////汇总公共字符串LogModule { get设置;} }}LogHelper.cs,定义了日志级别,和写入方法

[assembly: log4net .配置。XMLConfigurator(Watch=true,配置文件=' log4 net。配置')]命名空间日志组件(公共类LogHelper { static log4 net } .ILog日志=log4net .日志管理器。GetLogger(' MyLogger ');///摘要///异常日志////summary///param name=' LogMSg '日志信息/param ///param name='logModule '代码模块/param///param name=' description '其他描述/param ///param名称='用户名'用户名/param公共静态void LogError(字符串日志消息,字符串日志模块,字符串描述=' ',字符串用户名='') {日志.错误(新日志内容('错误,子日志字符串(日志消息),日志模块,子日志字符串(描述),用户名));} public static void LogInfo(string logMsg,string logModule,string description=' ',string userName='') { log .信息(新日志内容(“信息”,子日志字符串(logMsg),日志模块,子日志字符串(描述),用户名));}公共静态void LogWarn(字符串日志消息,字符串日志模块,字符串描述=' ',字符串用户名='') {日志.警告(新日志内容(“警告”,子日志字符串(logMsg),日志模块,子日志字符串(描述),用户名));}公共静态void LogDebug(字符串日志消息,字符串日志模块,字符串描述=' ',字符串用户名='') {日志.调试(新的日志内容('调试,子日志字符串(日志消息),日志模块,子日志字符串(描述),用户名));}私有静态字符串SubLogString(字符串字符串){ if(字符串。长度1500) {返回字符串。子串(0,1500);}返回字符串;} } } MessagePartternConverter.cs

使用log4net .核心;使用log4net .布局。格局;使用系统IO;使用系统。反思;命名空间日志组件{ class MessagePatternConverter : PatternLayoutConverter { protected override void Convert(text writer编写器,记录事件日志事件){ if(Option!=null) { //写入指定键WriteObject的值(作者,日志事件.存储库,LookupProperty(选项,日志事件));} else { //写入所有键值对WriteDictionary(writer,loggingEvent .存储库,记录事件. GetProperties());} } ///摘要///通过反射获取传入的日志对象的某个属性的值////summary////param name=' property '/param////returns/returns private object LookupProperty(字符串属性log4net .核心。日志事件日志事件){ 0对象属性值=字符串。空的;属性信息属性信息=日志事件消息对象。GetType().GetProperty(属性);if(PrOpertiInfo!=null)property value=property info .GetValue(日志事件.MessageObject,null);返回propertyValue} }}MyLayout.cs

使用log4net .布局;命名空间日志组件{ class MyLayout :图案布局{ public MyLayout(){ this .AddConverter('属性),类型为(MessagePatternConverter));} }}其实看到这里,最重要的并不是代码了,核心部分Log4net都帮我们写好了,关键在于你的配置,下面是log4net.config的内容。拿到你的网项目里是一样用的。但是不要忘了在你的项目中引用nuget:log4net哟。

log4net.config如下:在其中主要配置了原木入库的参数和结构化查询语言语句,当然还有结构化查询语言连接。注释已经很详细了

?可扩展标记语言版本='1.0 '编码='utf-8 '?配置配置部分节名称='log4net '类型='log4net ' .配置。log4网络配置部分处理程序,log4网络/配置部分log4网络根级别值=' Debug '/appender-ref=' ADONetAppender '/根记录器名称='myLogger '级别值=' Debug '/appender-ref=' ADONetAppender '/记录器附件名称=' ADONetAppender '类型='log4net .附录。ADONetAppender,log4net '!- BufferSize为缓冲区大小,只有日志记录超价值条才会一块写入到数据库- bufferSize值='1'/!-或写为参数名=' Buffersize '值=' 1 '/-!-引用-连接类型值='系统.系统连接。数据,版本=1.0.3300.0,区域性=中性,公钥标记=b77 a5c 561934 e 089 '!-连接数据库字符串-连接字符串值='数据源=115 .29 .54 .31;初始目录=日志系统;uid=sapwd=sa .多路活动结果集=真'/!-插入到表log-commandText value=' INSERT INTO HdPubLog([log date],[LogMsg],[UserName],[Description],[LogLevel],[LogModule]) VALUES (@log_date,@LogMsg,@UserName,@Description,@LogLevel,@ log module)'/参数名value=' @ log _ date '/dbType value=' DateTime '/布局类型=' log 4 net .布局rawtimestamperation '/!-获取log4net中提供的日志时间RawTimeStampLayout为默认的时间输出格式参数参数名称值='@LogMsg'/dbType值='字符串'/大小值='1510'/布局类型='LogComponent .MyLayout,LogComponent ' param name='转换模式'值=' % property { LogMSg } '//布局/参数参数参数名称值='@UserName'/dbType值='字符串'/大小值='50'/布局类型='LogComponent .MyLayout,LogComponent ' param name='转换模式'值=' % property { UserName } '//布局/参数参数参数名称值='@Description'/dbType值='字符串'/大小值='1510'/布局类型='LogComponent .MyLayout,LogComponent ' param name='转换模式'值=' % property { Description } '//布局/参数参数参数名称值='@LogLevel'/dbType值='字符串'/大小值='50'/布局类型='LogComponent .MyLayout,LogComponent ' param name='转换模式'值=' % property { LogLevel } '//布局/参数参数参数名称值='@LogModule'/dbType值='字符串'/大小值='50'/布局类型='LogComponent .MyLayout,LogComponent ' param name='转换模式' value=' % property { LogModule } '//layout/parameter/appender/log4 net/configuration这样一来,你的配置就完成了,你可以直接测试插入的情况:

三。把原木信息可视化

我的用户界面使用的是Datatables.js,弹出框是层,日期组件好像是播放日期,下拉框是修改样式后的选择2 .用户界面代码是我自己的一个框架里的,内容太多就不贴出来了,你只需要和以前一样,把数据从库里查出来,绑定给任意你喜欢的数据表格上。由于单页面的日志系统没有什么复杂操作,就用个sqlHelper查一下就算了,代码和条件拼接如下

公共类xxxDal { private SqlHelper _ SqlHelper=new SqlHelper();///摘要///获取xxx的日志////summary////param name=' model '/param////returns/returns public ListLogModel GetxxxLog(SM _ LogModel model){ StringBuilder SQL=new StringBuilder();ListSqlParameter sqlparameter=new ListSqlParameter();StringBuilder SqlHere=new StringBuilder();if(!字符串IsNullOrWhiteSpace(模型LogStartTime)) { sqlParameters .添加(新的SqlParameter('@LogStartTime ',模型LogStartTime));这里.追加(@ ' AND。h . LogDate @ LogStartTiME’);} if(!字符串IsNullOrWhiteSpace(模型LogEndTime)) { sqlParameters .添加(新的SqlParameter('@LogEndTime ',模型LogEndTime));这里.追加(@ ' AND。h . LogDate @ LogEndtime’);} if(!字符串IsNullOrWhiteSpace(模型LogLevel)) { sqlParameters .添加(新的SqlParameter('@LogLevel ',模型logLevel));这里.追加(@ ' AND。h . LogLevel=@ LogLevel ');} if(!字符串IsNullOrWhiteSpace(模型LogModule){ sqlParameters .添加(新的SqlParameter('@LogModule ',模型LogModule));这里.追加(@ ' 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和indexnum @endIndex ',SqlHere);sqlParameters .添加(新的SqlParameter('@startIndex ',模型。开始));sqlParameters .添加(新的SqlParameter(' @ EnDix ',模型。启动模型。长度));数据表dt=_sqlHelper .ExecuteDataTable(sql .ToString(),sqlParameters .ToArray());返回数据表格工具模型.datatable talit(dt);} public int GetxxxLogTotalCount(SM _ LogModel模型){ StringBuilder SQL=new StringBuilder();ListSqlParameter sqlparameter=new ListSqlParameter();sql .追加(@ ' SELECT COUNT(*)FROM[HDPubLog]h,其中1=1 ');if(!字符串IsNullOrWhiteSpace(模型LogStartTime)) { sqlParameters .添加(新的SqlParameter('@LogStartTime ',模型LogStartTime));sql .追加(@ ' AND。h . LogDate @ LogStartTiME’);} if(!字符串IsNullOrWhiteSpace(模型LogEndTime)) { sqlParameters .添加(新的SqlParameter('@LogEndTime ',模型LogEndTime));sql .追加(@ ' AND。h . LogDate @ LogEndtime’);} if(!字符串IsNullOrWhiteSpace(模型LogLevel)) { sqlParameters .添加(新的SqlParameter('@LogLevel ',模型logLevel));sql .追加(@ ' AND。h . LogLevel=@ LogLevel ');} if(!字符串IsNullOrWhiteSpace(模型LogModule){ sqlParameters .添加(新的SqlParameter('@LogModule ',模型LogModule));sql .追加(@ ' AND。h . LogModule=@ LogModule ');} return _sqlHelper .ExecuteScalarint(sql .ToString(),sqlParameters .ToArray());}[httpset]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 .executedarrow(SQL,新的SqlParameter('@Id ',Id));返回数据表格工具模型.DataRowToModel(行);} }以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

版权声明:网日志系统解析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。