ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.Net Core(.NET6)中接入Log4net和NLog进行日志记录

2022-07-05 23:02:52  阅读:161  来源: 互联网

标签:Log4net Core logger fileName public NLog 日志 message


目录

 


回到顶部

一、接入Log4net

1.按日期和大小混合分割日志

nuget包安装

log4net
Microsoft.Extensions.Logging.Log4Net.AspNetCore

配置文件

 

 

 配置文件内容为

复制代码
<?xml version="1.0" encoding="utf-8"?>
<log4net>
    <!-- Define some output appenders -->
    <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
    <!--    value="logs/log.log"-->
        <file value="logs/" />
        <!--追加日志内容-->
        <appendToFile value="true" />

        <!--防止多线程时不能写Log,官方说线程非安全-->
        <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

        <!--可以为:Once|Size|Date|Composite-->
        <!--Composite为Size和Date的组合-->
        <rollingStyle value="Composite" />

        <!--当备份文件时,为文件名加的后缀-->
        <datePattern value="yyyyMMdd/&quot;log.log&quot;" />

        <!--日志最大个数,都是最新的-->
        <!--rollingStyle节点为Size时,只能有value个日志-->
        <!--rollingStyle节点为Composite时,每天有value个日志-->
        <maxSizeRollBackups value="20" />

        <!--可用的单位:KB|MB|GB-->
        <maximumFileSize value="3MB" />

        <!--置为true,当前最新日志文件名永远为file节中的名字-->
        <staticLogFileName value="false" />

        <!--输出级别在INFO和ERROR之间的日志-->
        <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="ALL" />
            <param name="LevelMax" value="FATAL" />
        </filter>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
        </layout>
    </appender>
    <root>

        <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
        <!--OFF:0-->
        <!--FATAL:FATAL-->
        <!--ERROR: ERROR,FATAL-->
        <!--WARN: WARN,ERROR,FATAL-->
        <!--INFO: INFO,WARN,ERROR,FATAL-->
        <!--DEBUG: INFO,WARN,ERROR,FATAL-->
        <!--ALL: DEBUG,INFO,WARN,ERROR,FATAL--> 
        <priority value="ALL"/>
        
        <level value="INFO"/>
        <!--使用上面配置的那个规则,ref指定上面的规则名称-->
        <appender-ref ref="rollingAppender" />
    </root>
</log4net>
复制代码

程序引入,Program.cs文件增加

 

 

 

复制代码
builder.Logging.AddLog4Net("Configs/log4net.Config");

//Nuget引入:
//1.Log4Net
//2.Microsoft.Extensions.Logging.Log4Net.AspNetCore
builder.Services.AddControllersWithViews();
复制代码

程序使用

复制代码
 public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        public IActionResult Index()
        {
            _logger.LogInformation($"{this.GetType()},info,接口访问");
            _logger.LogError($"{this.GetType()},error,接口访问错误");
            return View();
        }
}
复制代码

效果:

 

 

 

 

 

2.日志分级独立文件夹显示

上面全部等级的日志信息都显示在同一个文件夹,如果想找error信息,如果日志量大并不好查找,所以把error的独立出来。

增加配置信息

 

 完整配置文件

 View Code

运行,日志打印效果

 

 

 

 

3.log4net日志写入数据库

这里以log4net写入Mysql为示例

引入Nuget包

MySql.Data

数据库日志表脚本

复制代码
CREATE TABLE `logs` (
  `log_id` bigint NOT NULL AUTO_INCREMENT,
  `app_name` varchar(100) NOT NULL,
  `log_date` datetime NOT NULL,
  `thread` varchar(100) NOT NULL,
  `level` varchar(50) NOT NULL,
  `logger` varchar(255) NOT NULL,
  `message` varchar(1000) NOT NULL,
  `exception` varchar(2000) NOT NULL,
  PRIMARY KEY (`log_id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
复制代码

 

增加配置信息

 

 

 

 

完整配置文件

 

 View Code

 

效果

 

 

 

如果是SqlServer

引入Nuget包

System.Data.SqlClient

 connectionType写上SqlServer的连接类型

<connectionType value="System.Data.SqlClient.SqlConnection,System.Data.SqlClient, Version=4.6.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

连接字符串处改成SqlServer的连接字符串即可。

回到顶部

二、接入NLog

1.写文本日志

引入Nuget包

NLog.Web.AspNetCore

配置文件内容

复制代码
<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="NLog\all_log.log">

  <targets>
      <!--文件日志,archive相关参数:文件拆分,每100M拆分一个新文件-->
      <target xsi:type="File" 
            name="all_log"
            fileName="NLog\${shortdate}\${uppercase:${level}}.log"
            layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}"
            archiveFileName="NLog\${shortdate}\${uppercase:${level}}${shortdate}.{####}.log"
            archiveNumbering="Rolling"
            archiveAboveSize="10485760"
            concurrentwrites="true"
            maxArchiveFiles="100"
              />

  </targets>
    

  <rules> 
    <!-- add your logging rules here -->
      <!--路由顺序会对日志打印产生影响。路由匹配逻辑为顺序匹配。-->
      <logger name="*" minlevel="Trace" writeTo="all_log" />
  </rules>
</nlog>
复制代码

 

 程序引入NLog

 

 

程序使用:

 

结果:

 

 

 

2.过滤日志

有一些组件自带了日志的,像上面的Microsoft.*开头就是.Net Core自带的,我们想屏蔽掉一些dll的日志怎么弄呢

修改配置规则

 

 

 

 效果:

 

 

 

 

3.自定义日志文件名

很多时候我们想把比较重要的功能的日志单独写到一个日志文件方便排查,NLog提供了单独打日志文件的功能

修改配置文件,用一个属性接收,属性由程序端传来:${event-properties:filename}

复制代码
<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="NLog\all_log.log">

  <targets>
      <!--文件日志,archive相关参数:文件拆分,每100M拆分一个新文件-->
      <target xsi:type="File" 
            name="all_log"
            fileName="NLog\${shortdate}\${event-properties:filename}${shortdate}.log"
            layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}"
            archiveFileName="NLog\${shortdate}\${event-properties:filename}${shortdate}.{####}.log"
            archiveNumbering="Rolling"
            archiveAboveSize="10485760"
            concurrentwrites="true"
            maxArchiveFiles="100"
              />
  </targets>

  <rules> 
    <!-- add your logging rules here -->
      <!--路由顺序会对日志打印产生影响。路由匹配逻辑为顺序匹配。-->
      
      <!--Skip Microsoft logs and so log only own logs-->
      <!--以Microsoft打头的日志将进入此路由,由于此路由没有writeTo属性,所有会被忽略-->
      <!--且此路由设置了final,所以当此路由被匹配到时。不会再匹配此路由下面的路由。未匹配到此路由时才会继续匹配下一个路由-->
      <logger name="Microsoft.*" minlevel="Trace"  final="true" />
      <logger name="*" minlevel="Trace" writeTo="all_log" />
  </rules>
</nlog>
复制代码

封装一个LogHelper.cs

复制代码
 public class LogHelper
    {
        private static Logger logger= LogManager.GetCurrentClassLogger();
        public static void Info(string message,string fileName="INFO")
        {
            //把文件名通过属性传输
            logger.WithProperty("filename", fileName).Info(message);
        }
        public static void Debug(string message, string fileName = "DEBUG")
        {
            logger.WithProperty("filename", fileName).Debug(message);
        }
        public static void Error(string message, string fileName = "Error")
        {
            logger.WithProperty("filename", fileName).Error(message);
        }
        public static void Warn(string message, string fileName = "Warn")
        {
            logger.WithProperty("filename", fileName).Warn(message);
        }

    }
复制代码

程序调用:

效果:

 

 

 

 

4.NLog写入数据库

这里以Mysql为例

 引入Nuget包

MySql.Data

sql表脚本还是上面Log4net一样。

配置

复制代码
<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="NLog\all_log.log">

  <targets>
      <!--文件日志,archive相关参数:文件拆分,每100M拆分一个新文件-->
      <target xsi:type="File" 
            name="all_log"
            fileName="NLog\${shortdate}\${event-properties:filename}${shortdate}.log"
            layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}"
            archiveFileName="NLog\${shortdate}\${event-properties:filename}${shortdate}.{####}.log"
            archiveNumbering="Rolling"
            archiveAboveSize="10485760"
            concurrentwrites="true"
            maxArchiveFiles="100"
              />
      
      <target name="mysql_log" xsi:type="Database"
   dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
   connectionString="server=127.0.0.1;database=test_db;user=root;pwd=123456;SslMode=none"
   commandText="INSERT INTO logs(app_name,log_date, thread, `level`, logger, message, `exception`)VALUES(@app_name,@log_date, @thread,@log_level, @logger, @message, @exception);">
           <parameter name="@app_name" layout="AspNetCoreNlog" />
          <parameter name="@log_date" layout="${date}" />
          <parameter name="@thread" layout="${threadid}" />
          <parameter name="@log_level" layout="${level}" />
          <parameter name="@logger" layout="${logger}" />
          <parameter name="@message" layout="${message}" />
          <parameter name="@exception" layout="${exception:tostring}" />
      </target>
     
  </targets>
    

  <rules> 
    <!-- add your logging rules here -->
      <!--路由顺序会对日志打印产生影响。路由匹配逻辑为顺序匹配。-->
      
      <!--Skip Microsoft logs and so log only own logs-->
      <!--以Microsoft打头的日志将进入此路由,由于此路由没有writeTo属性,所有会被忽略-->
      <!--且此路由设置了final,所以当此路由被匹配到时。不会再匹配此路由下面的路由。未匹配到此路由时才会继续匹配下一个路由-->
      <logger name="Microsoft.*" minlevel="Trace"  final="true" />
      <logger name="*" minlevel="Trace" writeTo="all_log" />
      <logger name="*" minlevel="Trace" writeTo="mysql_log" />
  </rules>
</nlog>
复制代码

 

效果:

 

 

 

如果写SqlServer

引入Nuget包

System.Data.SqlClient
dbProvider="System.Data.SqlClient.SqlConnection, System.Data.SqlClient"
connectionString改为SqlServer的连接字符串即可

5.Log4Net对比NLog

Log4Net对比NLog来说性能相差无几

但是个人推荐用NLog,原因有

1.配置简单

2.可以很方便的自定义日志文件名,这个对于核心模块单独打日志太方便了。

 

转 https://www.cnblogs.com/wei325/p/16000271.html

标签:Log4net,Core,logger,fileName,public,NLog,日志,message
来源: https://www.cnblogs.com/wl-blog/p/16448953.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有