NLog日志封装和配置(C#)

2024-09-07 04:08

本文主要是介绍NLog日志封装和配置(C#),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。
NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。

简单的说可以用NLog记录系统中的日志,尤其是项目上线以后在线上如果出现问题,没有日志将很难定位到问题。

NLog下载http://nlog-project.org/download/

下面主要是我在项目中封装的一个日志类,以及NLog的配置文件。

需要引用dll,NLog.dll ,命名空间:

using NLog;
using NLog.Config;

封装的日志类为:

/// <summary>
/// 项目日志封装
/// </summary>
public class Logs
{private static Logger logger = LogManager.GetCurrentClassLogger(); //初始化日志类/// <summary>/// 日志状态枚举/// </summary>private enum LogState{/// <summary>/// 用户已登录/// </summary>NLogin,/// <summary>/// 用户未登录/// </summary>YLogin,}/// <summary>/// 静态构造函数/// </summary>static Logs(){//初始化配置日志LogManager.Configuration = new XmlLoggingConfiguration(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + "\\Demo\\NLog.config");}/// <summary>/// 日志写入通用方法(建议使用)/// </summary>/// <param name="msg">日志内容</param>/// <param name="logType"> 日志类别///     类别: 1.Debug///           2.Info///           3.Error///           4.Fatal///           5.Warn/// </param>/// <param name="loginState">登录状态  true:有用户登录信息 false 无用户登录信息</param>/// <remarks>///     注:默认类型为Info 可以配置其他日志 logType用于反射 规则一定要准确///     例:  1.默认日志 LogWriter("test log");   正常的业务日志///          2.异常日志 LogWriter("test log","Fatal");  try catch 里请使用这个日志级别///     /// </remarks>public static void LogWriter(String msg, String logType = "Info", bool loginState = true){try{String logMethod = "";  //调用者类名和方法名if (logType == "Fatal"){StackTrace trace = new StackTrace();//获取是哪个类来调用的  String invokerType = trace.GetFrame(1).GetMethod().DeclaringType.Name;//获取是类中的那个方法调用的  String invokerMethod = trace.GetFrame(1).GetMethod().Name;logMethod = invokerType + "." + invokerMethod + " | ";}String IP = HttpContext.Current.Request.UserHostAddress;   //获取IP//反射执行日志方法Type type = typeof(Logger);MethodInfo method = type.GetMethod(logType, new Type[] { typeof(String) });if (loginState == true){//如果是登陆状态 可以记录用户的登陆信息 比如用户名,Id等method.Invoke(logger, new object[] { logMethod + msg + " [ " + IP + " | " + LogState.NLogin + " ]" });}else{method.Invoke(logger, new object[] { logMethod + msg + " [ " + IP + " | " + LogState.NLogin + " ]" });}}catch{//日志代码错误,直接记录日志Fatal(msg);Warn(msg);}}/// <summary>/// 调试日志/// </summary>/// <param name="msg">日志内容</param>private static void Debug(String msg){logger.Debug(msg);}/// <summary>/// 信息日志/// </summary>/// <param name="msg">日志内容</param>/// <remarks>///     适用大部分场景///     1.记录日志文件/// </remarks>private static void Info(String msg){logger.Info(msg);}/// <summary>/// 错误日志/// </summary>/// <param name="msg">日志内容</param>/// <remarks>///     适用异常,错误日志记录///     1.记录日志文件/// </remarks>private static void Error(String msg){logger.Error(msg);}/// <summary>/// 严重致命错误日志/// </summary>/// <param name="msg">日志内容</param>/// <remarks>///     1.记录日志文件///     2.控制台输出/// </remarks>private static void Fatal(String msg){logger.Fatal(msg);}/// <summary>/// 警告日志/// </summary>/// <param name="msg">日志内容</param>/// <remarks>///     1.记录日志文件///     2.发送日志邮件/// </remarks>private static void Warn(String msg){try{logger.Warn(msg);}catch { }}
}

如果是后台服务或者只简单记下日记 可以直接用

logger.Info(msg);
logger.Fatal(msg);

这样记录日志。
我这里写了个入口LogWriter用于统一调用,方便以后修改日志或者切换其他日志。


日志的配置文件为NLog.config,NLog的配置可以放在Web.config中,也可以放在单独的文件中,这里为了项目好维护,把配置放到一个单独的文件中,具体配置的内容为:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="true"><targets xsi:type="AsyncWrapper"><!--保存至文件--><target name="log_file" xsi:type="File" fileName="${basedir}/Logs/${shortdate}/${level:uppercase=false:padding=-5}.txt"layout="${longdate} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" /><!--输出至Debugger--><target name="debugger" xsi:type="Debugger" layout="NLog: ${date:format=HH\:mm\:ss} | ${message}" /><!--输出至控制台--><target name="console" xsi:type="ColoredConsole" layout="${longdate} ${message} ${exception:format=tostring}"></target><!--输出至邮件--><target xsi:type="Mail" name="infoMail"smtpServer="smtp.163.com"  smtpPort="25"  smtpAuthentication="Basic"  smtpUserName="deno@163.com"   smtpPassword="demo"  enableSsl="true"  addNewLines="true"  from="demo@163.com"  to="demo@qq.com"  subject="Project Exception Mail"header="*********************"  body="${longdate} | ${message} "footer="*********************"/></targets><rules><logger name="*" level="Info" writeTo="log_file" /><logger name="*" levels="Error" writeTo="log_file" /><logger name="*" levels="Debug" writeTo="log_file" /><!--<logger name="*" level="Debug" writeTo="debugger" />--><!--<logger name="*" level="Fatal" writeTo="console" />--><logger name="*" level="Fatal" writeTo="log_file" /><!--<logger name="*" level="Warn" writeTo="infoMail" />--><logger name="*" level="Warn" writeTo="log_file" /></rules>
</nlog>

好了,这样就可以使用NLog来记录日志了。

这篇关于NLog日志封装和配置(C#)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144013

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级