NLog简介
NLog是一个简单灵活的.NET日志记录类库,NLog的API非常类似于log4net,配置方式非常简单。支持多种形式输出日志:文本文件、系统日志、数据库、控制台、邮箱等
1.NLog简介
在nuget控制台输入安装nlog命令: Install-Package NLog.Config
Nlog配置的方式常用的有两种
1.直接在使用应用程序配置文件或者web的配置文件(app.config / web.config)
2.NLog.config 这个是比较好的一个形式(推荐)
配置文件中的主要标签是:targets和rules:
- 定义日志的目标/输出,下级是
- 定义日志的路由规则,下级是
2.标签介绍
标签
autoReload 修改配置文件后是否允许自动加载无须重启程序
throwExceptions 内部日志系统抛出异常(建议throwExceptions的值设为“false”,这样由于日志引发的问题不至于导致应用程序的崩溃。)
internalLogLevel 可选Trace|Debug|Info|Warn|Error|Fatal决定内部日志的级别 Off 关闭
internalLogFile 把内部的调试和异常信息都写入指定文件里
标签
定义了日志的输出,可以设置文件名称和格式,输出方式。
name 自定义该target的名字,可供rule规则里使用
type 定义类型,官方提供了很多可选类型,常用的还是 File Database Colored Console Mail
layouts 用来规定布局样式,语法“${属性}”,可以把上下文信息插入到日志中,官方提供的可以用的属性见文末附录
标签
定义日志的记录规则,记录范围
name 记录者的名字
minlevel 最低级别
maxlevel 最高级别
level 单一日志级别
levels 一系列日志级别,由逗号分隔。
标签
变量定义
3.一个简单的栗子
把日志记录到彩色控制台,log文本文件和mysql数据库。首先添加Nlog.config文件如下,放在控制台项目的bin/debug目录下
INSERT INTO tbLog(Timestamp,Level,Message,StackTrace) VALUES(@time_stamp, @level, @message, @stacktrace);
View Code
LogHelper是通过拓展String实现的一个简单的helper,调用代码如下:
classProgram
{static void Main(string[] args)
{
Console.WriteLine("---------------------------begin");"helper logs debug".Debug();"helper logs info".Info();"helper logs warn".Warn();"helper logs error".Error();"helper logs fatal".Fatal();
Console.WriteLine("---------------------------end");
Console.ReadKey();
}
}public static classLogHelper
{private static ILogger logger =GetLogger();private staticILogger GetLogger()
{
LogManager.Configuration= new XmlLoggingConfiguration(Path.Combine(AppDomain.CurrentDomain.BaseDirectory + @"Nlog.config"));returnLogManager.GetCurrentClassLogger();
}///
///调试///
///
public static void Debug(this stringdebug)
{
logger.Debug(debug);
}///
///信息///
///
public static void Info(this stringinfo)
{
logger.Info(info);
}///
///警告///
///
public static void Warn(this stringwarn)
{
logger.Warn(warn);
}///
///错误///
///
public static void Error(this stringerror)
{
logger.Error(error);
}///
///严重错误///
///
public static void Fatal(this stringfatal)
{
logger.Fatal(fatal);
}///
///跟踪///
///
public static void Trace(this stringtrace)
{
logger.Trace(trace);
}
}
View Code
记录效果如下:
控制台中使用彩色高亮展示日志信息
mysql中效果如下
log文件效果如下
这里的异常信息只是简单的一句话,在实际开发中我们可以把很多内容添加到异常相关信息中,如下是一个.Net WebApi的异常日志的显示效果:
过滤器代码如下
///
///异常处理过滤器///
public classErrorHandleAttribute : ExceptionFilterAttribute
{///
///异常处理过滤器///
///
public override voidOnException(HttpActionExecutedContext actionExecutedContext)
{//获取客户端Ip
string clientIP = GetHostAddress();//主机Ip//获取httpmethod
string strHttpMethod =actionExecutedContext.Request.Method.ToString();//请求的url
string url =actionExecutedContext.Request.RequestUri.AbsoluteUri;//异常信息
string exceptionMsg =actionExecutedContext.Exception.Message;//异常定位
string exceptionPosition = actionExecutedContext.Exception.StackTrace.Split(new string[] { "" }, StringSplitOptions.None).Where(s => !string.IsNullOrWhiteSpace(s)).First().Trim();//string stack//记录的message
string message = $"----1.[客户端Ip]:{ clientIP}" + Environment.NewLine + $"----2.[请求方法]:{ strHttpMethod}" + Environment.NewLine + $"----3.[请求url]:{ url }" + Environment.NewLine + $"----4.[异常信息]:{exceptionMsg}" + Environment.NewLine + $"----5.[异常定位]:{exceptionPosition}";//Log4net记录
LogHelper.WriteErrorLog("", message);//nlog记录
NlogHelper.WriteErrorLog(message);
actionExecutedContext.Response=actionExecutedContext.Request.CreateResponse(
HttpStatusCode.InternalServerError,new { msg = "服务器忙,请稍后再试!"});
}///
///获取客户端IP地址(无视代理)///
/// 若失败则返回回送地址
public static stringGetHostAddress()
{string userHostAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];if (string.IsNullOrEmpty(userHostAddress))
{if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
userHostAddress= HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString().Split(',')[0].Trim();if (string.IsNullOrEmpty(userHostAddress))
{
userHostAddress=HttpContext.Current.Request.UserHostAddress;
}
}//最后判断获取是否成功,并检查IP地址的格式(检查其格式非常重要)
if (!string.IsNullOrEmpty(userHostAddress) &&IsIP(userHostAddress))
{returnuserHostAddress;
}return "127.0.0.1";
}///
///检查IP地址格式///
///
///
public static bool IsIP(stringip)
{return System.Text.RegularExpressions.Regex.IsMatch(ip, @"^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$");
}
}
View Code
4.layout参数列表
${appdomain}
当前应用程序域
${assembly-version}
应用程序
${basedir}
应用程序域的基本目录。
${callsite}
(类名称、方法名称和相关信息的源信息)。
${counter}
数值
${date}
当前日期和时间。
${environment}
环境变量
${exception}
exception信息
${guid}
GUID
${identity}
线程标识信息
${level}
级别。
${log4jxmlevent}
XML事件描述
${logger}
记录器的名字
${longdate}
日期和时间的格式分类yyyy-MM-dd HH:mm:ss.ffff。
${machinename}
名称
${message}
消息
${newline}
文字换行
${processid}
当前进程标识符
${processinfo}
运行信息
${processname}
当前进程的名称。
${processtime}
该时间过程中格式HH:MM:ss.mmm。
${shortdate}
短时间 格式YYYY-MM-DD。
${threadid}
当前线程的标识符。
${threadname}
当前线程。
${ticks}
当前日期和时间。
${time}
24小时格式HH:MM:ss.mmm。
${var}
{$var}-提供新的变量(4.1)
补充:下边是一个分级别记录的Nlog.Config,这个配置文件和上边的LogHelper可以一起使用。
View Code
参考文献: