.net core(.net 6) 日志记录 log4net ----将日志写入txt文本、数据库

.net 6 框架内置了log,但是该log只能在控制台打印日志,在实际项目中我们需要将日志实现持久化,将日志写进文档、写入数据库等,所以选择了log4net。

1、引入NuGet包

Microsoft.Extensions.Logging.Log4Net.AspNetCore
log4net
System.Data.SqlClient

 

 

 

2、添加log4net配置文件(数据库写入需要自己配置)

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <!-- Define some output appenders -->

    <!--Type 表示用那种类型记录日志-->
    <appender name="rollingAppender" type="log4net.Appender.RollingFileAppender">
        <!--表示用文本来记录日志-->

        <file type="log4net.Util.PatternString" value="log4net\log%date{yyyy.MM.dd}.txt" />
        <!--<file value="log4net\log.txt" />-->
        <!--<file value="D:\MyLog1\Onelog.txt" />-->

        <!--追加日志内容-->
        <!--<appendToFile value="false" />-->
        <appendToFile value="true" />

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

        <!--配置Unicode编码-->
        <Encoding value="UTF-8" />

        <!--是否只写到一个文件里-->
        <param name="StaticLogFileName" value="false" />

        <!--当备份文件时,为文件名加的后缀,这里可以作为每一天的日志分别存储不同的文件-->
        <datePattern value="yyyyMMdd&quot;.txt&quot;" />

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

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

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

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

        <!--过滤器-->

        <!--阻止所有事件被记录-->
        <!--<filter type="log4net.Filter.DenyAllFilter"> </filter>-->

        <!--只有指定等级的日志事件才被记录-->
        <!--<filter type="log4net.Filter.LevelMatchFilter">
        <param value="FATAL" />
      </filter>-->

        <!--日志等级在指定范围内的事件才被记录-->
        <!--<filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="FATAL" />
      </filter>-->


        <layout type="log4net.Layout.PatternLayout">
            <!--日志输出格式:时间  日志类型  日志内容-->
            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
        </layout>
    </appender>
    
    
    
          <!--配置Appender-->
    <!--Sqlserver形式-->
    <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="-1" />
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="data source=[服务器地址];initial catalog=[数据库];persist security info=True;user id=[账号];password=[密码];MultipleActiveResultSets=True;" />
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
      <parameter>
        <parameterName value="@log_date"  />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
      </parameter>
    </appender>

    <!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL -->
    <root>
        <priority value="ALL"/>
        <level value="ALL"/>
        <!--文本日志-->
        <appender-ref ref="rollingAppender" />
        <!--数据库日志-->
        <appender-ref ref="AdoNetAppender_SqlServer" />
    </root>
</log4net>

3、Program.cs中引用log4net配置文件

//配置Log4net(读取配置文件)
//会替换掉内置日志
builder.Logging.AddLog4Net("CfgFile/log4net.config");

 

4、在LoggingController.cs中使用_logger

using Demo02.Model;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Demo02.Controllers
{
    /// <summary>
    /// Log日志
    /// </summary>
    [ApiVersion("1.0")]
    [Route("api/[controller]")]
    [ApiController]
    public class LoggingController : ControllerBase
    {
        private readonly ILogger<LoggingController> _logger;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="logger">控制台日志</param>
        public LoggingController(ILogger<LoggingController> logger)
        {
            _logger = logger;
        }
        /// <summary>
        /// 日志记录
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult GetData()
        {
            _logger.LogError("LogError:======Get API被调用======");
            _logger.LogInformation("LogInformation:======Get API被调用======");
            return new JsonResult(new ApiResut<String>()
            {
                Success = true,
                Data = "日志记录"

            });
        }
    }
}

5、运行结果

 

 

 

 

posted @ 2023-01-04 09:33  燕钰达  阅读(1518)  评论(0编辑  收藏  举报