.net core web api(6.0)使用NLog

什么是Nlog?

NLog是一个灵活且易于使用的.NET日志记录库,适用于各种.NET平台(包括.NET标准)。它使写入多个目标变得容易,并支持结构化和传统日志记录。NLog的重点是高性能易于使用易于扩展灵活配置

在.NET Core中,NLog可以用于在应用程序中添加跟踪调试代码。它可以通过配置文件和编程方式进行配置,即使在不重新启动应用程序的情况下也可以更改配置。NLog支持模板化,每个日志消息都可以使用各种布局进行模板化。此外,NLog是可扩展的,即使它具有预定义的目标和布局,也可以编写自定义目标或传递自定义值。

在.NET Core中,NLog的配置非常简单,它使用路由表进行配置,使得配置文件易于阅读和后续维护。同时,NLog支持.NET、C/C++以及COM interop API,因此程序、组件、包括用C++/COM编写的遗留模块都可以通过同一个路由引擎将信息发送至NLog中。

总之,NLog是一个功能强大且易于使用的.NET日志记录库,适用于各种.NET平台,包括.NET Core。它提供了完善的跟踪调试代码功能,并且可以灵活配置其表现样式后发送到一个或多个输出目标中。

一、 使用Nlog下载包需要的包

NLog

NLog.WebAspNetCore -- .net Core才使用这个包

-- 以下是将日志写入到数据库中需要的包,这里使用的是 sql server

NLog.Database -- 不管什么数据库都要

Microsoft.Data.SqlClient -- sql server数据库需要的包

数据库使用的包对应的DBPROVIDER配置数据库连接字符串待执行添加的SQL语句
sql serverMicrosoft.Data.SqlClientdbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient"connectionString="Server=服务器;Database=数据库;User Id=用户名;Password=密码;"-
MysqlMySql.DatadbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"connectionString="server=服务器;userid=用户名;pwd=密码;port=3306;database=数据库;sslmode=none"-
oracleOracle.ManagedDataAccess.coredbProvider="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess"

 二、 在Program类中使用

using NLog.Web;
//这里的"Nlog.config"名字是新添加的web配置器的名称
builder.Logging.AddNLog("Nlog.config"); // 加载Nlog配置文件 注意这里的AddNLog方法会引起NLog和NLog.WebAspNetCore冲突,使用NLog.Web命名空间即可

三、 在项目中新创建一个web配置器(Nlog.config)之后配置Nlog.config文件,注释如下

注意点:

  1. <!-- 需要根据自己实际的情况改变 连接 sql server数据库 connectionString 连接字符串 和dbProvider的配置 -->

  2. commandText="insert into Log (MachineName, Logged, Level, Message,Logger, Callsite, Exception) values (@MachineName, @Logged, @Level, @Message,@Logger, @Callsite, @Exception);要在数据库中添加相应的字段,数据库中的字段必须和这里对应

    示例:mysql创建的表:

    //先创建数据库与配置中的数据库名称要相同
    create database logc;
    创建数据表
    CREATE TABLE `Log` (
      `Id` INT AUTO_INCREMENT PRIMARY KEY,
      `MachineName` VARCHAR(50) NOT NULL,
      `Logged` DATETIME NOT NULL,
      `Level` VARCHAR(50) NOT NULL,
      `Message` TEXT NOT NULL,
      `Logger` VARCHAR(250),
      `Callsite` TEXT,
      `Exception` TEXT
    );
  3. <parameter name="@Logged" layout="${date}" /> <parameter name="@Level" layout="${level}" /> <parameter name="@Message" layout="${message}" /> <parameter name="@Logger" layout="${logger}" /> <parameter name="@Callsite" layout="${callsite}" /> <parameter name="@Exception" layout="${exception:tostring}" />不要改变layout中的参数,这些写法都是定义好的写法,不能随意改动

  4. <rules>这个节点必须配置,否则nlog没有效果

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- autoReload属性,true时,如果NLog.config文件有变动,会自动应用新配置(但是会有延迟,过几秒才会应用起来)
    internalLogLevel属性,设定后,输出的是NLog内部自己的日志记录,如果遇到NLog异常/配置文件没配好,可以把Off改为Trace或Debug来查看NlogRecords.log里的内容
    internalLogFile属性,可以设定路径,例如默认的D:\Logs\aspNet.log
     -->
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
          autoReload="true"
          throwExceptions="true"
          internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
      <!-- internalLogFile 日志文件存放路径 -->
    	<!-- variable 声明变量 使用 "${myvar}" -->
    	<variable name="myvar" value="myvalue"/>
    	<!--  存放日志目标  -->
    	<targets>
        <!-- 
        xsi:type="File":写入txt
        fileName是写入文件的文件名并按日期添加后缀
        layout属性是写入日志的格式 
        name是决定 logger标签的writeTo的值
        -->
    		<!-- 控制台输出 -->
    		<target name="console" xsi:type="Console" layout="${longdate}|${level}|${message}"/>
    		<!--输出到文件上-->
    		<target name="f" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate}|${level}|${message}" />
    		<!--通过数据库记录日志 配置
        dbProvider请选择mysql或是sqlserver,同时注意连接字符串,需要安装对应的sql数据提供程序
        -->
        <!-- 连接 sql server数据库 connectionString 连接字符串 commandText执行添加的sql语句 -->
        <target name="database" xsi:type="Database"
          dbProvider="Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient"
          connectionString="Server=.;Database=Test;user id=sa;password=123456;Encrypt=True;TrustServerCertificate=True;"
          commandText="insert into Log (MachineName, Logged, Level, Message,Logger, Callsite, Exception) values (@MachineName, @Logged, @Level, @Message,@Logger, @Callsite, @Exception);">
    
          <parameter name="@MachineName" layout="${machinename}" />
    			<parameter name="@Logged" layout="${date}" />
    			<parameter name="@Level" layout="${level}" />
    			<parameter name="@Message" layout="${message}" />
    			<parameter name="@Logger" layout="${logger}" />
    			<parameter name="@Callsite" layout="${callsite}" />
    			<parameter name="@Exception" layout="${exception:tostring}" />
        </target>
    	</targets>
    	<rules>
      <!-- 第一个logger配置跳过所有Microsoft日志记录,final 属性是否为最后一个规则,如果为true,其后的规则即便被匹配也不会被运行。
    第二个logger name="logdb",该日志记录器名为logdb,是适配log_database规则,即写入数据库,如果要适配多条规则,用逗号隔开 -->
    		 <!--跳过所有级别的Microsoft组件的日志记录-->
        <logger name="Microsoft.*" final="true" />
        <!-- BlackHole without writeTo -->
        <!--只通过数据库记录日志,如果给了name名字,cs里用日志记录的时候,取logger需要把name当做参数 minlevel最低等级-->
            <!--这里的writeTo 的名字和上面的target的name保持一致 minlevel根据自己的需求写-->
        <logger name="*" minlevel="Info"  writeTo="console"/>
    		<logger name="*" minlevel="Info"  writeTo="f"/>
    		<!--至少Info级别以上:写入数据库-->
    		<logger name="*" minlevel="Info" writeTo="database" />
    	</rules>
    </nlog>

    NLog中的日志等级和ASP.Net Core中的日志等级对应关系如下

    NLOGASP.NET CORE
    TraceTrace
    DebugDebug
    InfoInformation
    WarnWarning
    ErrorError
    FatalCritical

四.在控制器中调用  

//在控制器中依赖注入
public readonly ILogger<LoginController> logger;
public LoginController(ILogger<LoginController> _logger)
{
    logger = _logger;
}
//方式一: 创建一个get方法
[HttpGet]
public ActionResult<string> Get()
{
    logger.LogInformation("This is info");
    logger.LogWarning("This is warn info");
    logger.LogError("This is error info");
    logger.LogCritical("This is fatal info");
    return "Hello World";
}
//方式二
 /// <summary>
 /// 登录
 /// </summary>
 /// <param name="username">用户名称</param>
 /// <param name="upwd">用户密码</param>
 /// <returns></returns>
 [HttpPost]
 public IActionResult login(string username,string upwd) {
     Models.Userinfo u=fSql.Select<Models.Userinfo>().Where(c => c.Uname == username && c.Pwd == upwd).First();
     if (u != null)
     {
         string token;
         if (authService.IsAuthenticated(u, out token))
         {
             logger.LogInformation("This is info");
             return Ok(token);
         }
         else
         {
             logger.LogError("This is error info");
             //令牌生成失败
             return Ok(1);
         }
     }
     else {
         logger.LogError("This is error info");
         //登录信息有错误
         return null;
     }
 }

五.运行之后,执行程序,对应的信息会写入到数据库中去

如果需要看写入的文件就右键项目-在文件资源管理起中打开-bin-debug即可以看到  

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值