请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

NLog日志框架使用探究-2

[复制链接]
查看: 43|回复: 0

1万

主题

2万

帖子

5万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
52015
发表于 2019-12-3 00:20 | 显示全部楼层 |阅读模式
目录
            
    前言

在一年前,我写过一篇关于NLog入门文章《NLog日志框架操纵探讨-1》,文章简单的先容了Nlog的底子操纵以及怎样操纵Log4View2工具配条约一收集日志检察。本篇文章会记录一些NLog常用的用法。
自界说参数

偶然间我们必要按照我们的营业特征自界说一些参数。比若有个唯一的Id。这时候我们可以自界说参数,将Id提取出来,而不是放到日志内容中,这样可以方便检索。
EventProperties Layout Renderer文档中,支持自界说EventPropertie静态的衬着到Layout中。
Nlog已经有一些自界说的参数了,如${counter}、${longdate}、${message:format=message}等。
自界说的参数操纵格式为${event-properties:item=String:culture=String:format=String}。
官方示例以下,代码中界说了四种Property
  1. ...Logger logger = LogManager.GetCurrentClassLogger();LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", "Pass my custom value");theEvent.Properties["MyValue"] = "My custom string";theEvent.Properties["MyDateTimeValue"] = new DateTime(2015, 08, 30, 11, 26, 50);theEvent.Properties["MyDateTimeValueWithCulture"] = new DateTime(2015, 08, 30, 11, 26, 50);theEvent.Properties["MyDateTimeValueWithCultureAndFormat"] = new DateTime(2015, 08, 30, 11, 26, 50);logger.Log(theEvent);...
复制代码
在设备文件中可以经过${event-properties:item=String:culture=String:format=String}获得到
  1. ${event-properties:item=MyValue} -- renders "My custom string"${event-properties:MyDateTimeValue:format=yyyy-M-dd}"; -- renders "2015-8-30"${event-properties:MyDateTimeValueWithCulture:culture=en-US} -- renders "8/30/2015 11:26:50 AM"${event-properties:MyDateTimeValueWithCultureAndFormat:format=yyyy-M-dd HH:mm:ss:culture=en-US} -- renders "2015-8-30 11:26:50"
复制代码
从上可以看出,若我们必要自界说参数,我们必要建立LogEventInfo工具,并经过Log()方式记录LogEventInfo工具。
挪用 Info()等方式内部现实也是建立了LogEventInfo工具,终极照旧挪用Log()方式。
下面我们可以自己的代码测试一下。
点窜上面的Json输出的设备,由于Memo参含有中文,是以必要将encode设备为false,避免被编码为Unicode。以下为Nlog关连源码
  1. protected override void RenderInnerAndTransform(LogEventInfo logEvent, StringBuilder builder, int orgLength){    Inner.RenderAppendBuilder(logEvent, builder);    if (JsonEncode && builder.Length > orgLength)    {        if (RequiresJsonEncode(builder, orgLength))        {            var str = builder.ToString(orgLength, builder.Length - orgLength);            builder.Length = orgLength;            Targets.DefaultJsonSerializer.AppendStringEscape(builder, str, EscapeUnicode);        }    }}private bool RequiresJsonEncode(StringBuilder target, int startPos = 0){    for (int i = startPos; i < target.Length; ++i)    {        if (Targets.DefaultJsonSerializer.RequiresJsonEscape(target[i], EscapeUnicode))        {            return true;        }    }    return false;}
复制代码
在上一篇文章中有同学提问,当encode设备为false时,输出的内容不会有双引号。查阅了下一源码,确切如此。具体为什么这样筹划不是很大白,有晓得的同学可以说明一下。
  1. public class JsonAttribute{    ...    public bool Encode    {        get => LayoutWrapper.JsonEncode;        set => LayoutWrapper.JsonEncode = value;    }    ...}private bool RenderAppendJsonPropertyValue(JsonAttribute attrib, LogEventInfo logEvent, StringBuilder sb, bool beginJsonMessage){    BeginJsonProperty(sb, attrib.Name, beginJsonMessage);    if (attrib.Encode)    {        // "\"{0}\":{1}\"{2}\""        sb.Append(&#39;"&#39;);    }    ...    if (attrib.Encode)    {        sb.Append(&#39;"&#39;);    }    return true;}
复制代码
接下来在nlog.Config的target设备中增加以下设备
  1.                            
复制代码
代码对应的Properites
  1. LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", "自界说静态参数");theEvent.Properties["Id"] = Guid.NewGuid();theEvent.Properties["No"] = "1";theEvent.Properties["Memo"] = "备注";logger.Log(theEvent);
复制代码
输出以下图
NLog日志框架使用探究-2  游戏 580757-20190122100902379-1546199411

必要留意若我们自界说参数,操纵json格式写入到文件,则代码中的Properties的Key必须和设备文件的${event-properties:item=key}中的key巨细写同等。
日志输出方式

文件

当我们日志必要以文件寄存时,凡是情况必要按照办事名、模块名等区分日志目录,一样可以经过自界说参数输出。
假定我们必要将日志按办事分目录,同光阴志文件名含有我们指定的内容前缀,在每一条日志中必要记录一个唯一的编号。日志设备以下
  1. ...                                                   
复制代码
先看下记录下来的日志,圈出来的都是我们自界说天生的值。
NLog日志框架使用探究-2  游戏 580757-20191202143515916-245923166


  • ${basedir}是步伐的运转目录
  • ${logger:shortName=true}是代码中指定的步伐名称号,在代码中可以经过NLog.LogManager.GetLogger("test")指定日志名或NLog.LogManager.GetCurrentClassLogger()指向当前类的全名(包含命名空间)。
  • ${shortdate}是短日期格式,Nlog也内置了${date}获得完整的时候,前面我们说过了可以经过${event-properties:item=String:culture=String:format=String}自界说格式,这里也可以经过${date:format=String}自界说日期格式,比如${date:format=yyyyMMdd}输出的就是如20191201的日期格式。
收集传输

上一章我们提到,日志经过收集发送到Log4View2等工具同一汇总。
  1.             ...
复制代码
Nlog支持tcp或udp协议举行收集传输。

  • 经过xsi:type="Network"指定收集传输
  • 经过address="协议://ip:端口"指定协讲和地址。
  • 经过layout="${log4jxmlevent:includeCallSite=true:includeNLogData=true}序列化为XML传输,固然我们也可以传输自界说的格式或Json格式。只要在方针端操纵对应的格式分析即可。
下面照旧经过Xml序列化传输到Log4View2为例。当我们代码中自界说的字段序列化成Xml发送到对端。我们可以在Log4View2界面上的列右键挑选Show Column Chooser项挑选哪些字段表示,很是方便。
NLog日志框架使用探究-2  游戏 580757-20190122135713247-1356652047

还支持挑选列,方便我们查找。
NLog日志框架使用探究-2  游戏 580757-20190122135918374-1932632897

数据库

一样平常情况下日志也不必要实时检察,凡是都是排查题方针时候必要看,是以偶然间我们可以渴望先将日志同一汇总后在做日志分析等工作。Nlog支持将数据插入数据库,比如我将日志入库到Oracle数据库中,操纵Oracle.ManagedDataAccess。我们可以经过nuget安装库包Install-Package Oracle.ManagedDataAccess
  1.                                                                      
复制代码

  • dbProvider:首先设备dbProvider。
  • keepConnection:表示能否必要连结毗连。
  • optimizeBufferReuse:表示能否能否操纵毗连池。
  • connectionString:入库的语句。
  • connectionString:毗连字符串。
  • commandText:sql语句,sql语句支持参数化。
  • :参数,name为参数名,layout为参数值。
在Log4View2可以将数据源指向日志地址的表。挑选数据库吸收器。
NLog日志框架使用探究-2  游戏 580757-20191202195836989-1690322981

填写关连设备后,挑选表。
NLog日志框架使用探究-2  游戏 580757-20191202163949159-262155992

挑选表的时候必要挑选一个Key,但并不是全数Key都是可选的。
从Log4View2源码看,Key必要满足是id结尾时典范是数值或时候典范大要列设备了自增。
  1. this.IsKey = ((this.Name.ToLowerInvariant().EndsWith("id") && DbMessageKey.IsValidKeyType(this.Type)) || column.AutoIncrement);public static bool IsValidKeyType(Type type){    return type == typeof(int) || type == typeof(uint) || type == typeof(long) || type == typeof(ulong) || type == typeof(decimal) || type == typeof(DateTime);}
复制代码
NLog日志框架使用探究-2  游戏 580757-20191202180030997-2035960156

这个key是用于时候挑选的。在日志设备中也可以设备获得指定的日志品级,大要,我们可以指定一个列作为时候挑选条件。
看下Log4View2的源码,在DBReceiver初始化的时候会把我们挑选的Key传入赋值给_dbMessageKey
  1. public DbReceiver(IReceiverFactory factory, ReceiverConfig recRow) : base(factory, recRow){    ...    this._columns = new DbColumns(dbReceiverConfig.DbColumns);    this._dbMessageKey = this._columns.Key;    ...}
复制代码
在初始化查询sql的时候就会用到该值
  1. private DbCommand CreateReadQuery(){    ...    DbCommand dbCommand = this._database.CreateCommand();    dbCommand.CommandTimeout = this._commandTimeout;    string parameterName = this._database.GetParameterName(0);    string arg = this._dbMessageKey.IsUnique ? ">" : ">=";    string text = this._database.QuoteName(this._dbMessageKey.Name);    string tableName = this._database.QuoteName(this._tableName);    DbParameter dbParameter = dbCommand.CreateParameter();    dbParameter.ParameterName = parameterName;    dbParameter.DbType = this._dbMessageKey.DbType;    dbParameter.Value = this._dbMessageKey.ParameterValue;    dbCommand.Parameters.Add(dbParameter);    string text2 = string.Format("WHERE ({0} {2} {1})", text, parameterName, arg);    ...    return dbCommand;}
复制代码
NLog日志框架使用探究-2  游戏 580757-20191202180403819-1941462301

NLog日志框架使用探究-2  游戏 580757-20191202180451495-1452567248

科学操纵

Log4View2工具初度安装操纵有30天的试用期,试用期过了一些功用就会被限制。下一章我会讲授怎样是操纵反编译工具科(po)学(jie)操纵Log4View2。
参考文档

NLog日志框架使用探究-2  游戏 580757-20191127212135806-961496201

微信扫一扫二维码关必定阅号杰哥技术分享
出处:本文地址:https://www.cnblogs.com/Jack-Blog/p/11972400.html
作者:杰哥很忙
本文操纵「CC BY 4.0」创作同享协议。接待转载,请在明显位置给出出处及链接。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表