net core web api 使用log4net

创建net core web api项目

省去,不会创建的话没必要看这个教程

nuget安装需要的包

需要两个包,log4net、Log4Net.AspNetCore

添加log4net配置文件

我是在根目录加了个config文件夹,放在里面,看自己想怎么放

网上随便搜

XML 复制代码
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
    <file value=".\Log\Debug.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
    <lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
    <datePattern value="yyyyMMdd" />
    <countDirection value="1"/>
    <maxSizeRollBackups value="-1" />
    <!--<maximumFileSize value="10MB" />-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date|%logger|%message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="DEBUG" />
      <levelMax value="DEBUG" />
    </filter>
  </appender>
  <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
    <file value=".\Log\Error.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
    <lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
    <datePattern value="yyyyMMdd" />
    <countDirection value="1"/>
    <maxSizeRollBackups value="-1" />
    <!--<maximumFileSize value="1MB" />-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date|%logger|%message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="ERROR" />
      <levelMax value="ERROR" />
    </filter>
  </appender>
  <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
    <file value=".\Log\Info.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
    <lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
    <datePattern value="yyyyMMdd" />
    <countDirection value="1"/>
    <maxSizeRollBackups value="-1" />
    <!--<maximumFileSize value="1MB" />-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date|%logger|%message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="INFO" />
      <levelMax value="INFO" />
    </filter>
  </appender>
  <appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
    <file value=".\Log\Warn.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
    <lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
    <datePattern value="yyyyMMdd" />
    <countDirection value="1"/>
    <maxSizeRollBackups value="-1" />
    <!--<maximumFileSize value="1MB" />-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date|%logger|%message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="WARN" />
      <levelMax value="WARN" />
    </filter>
  </appender>
  <appender name="FatalAppender" type="log4net.Appender.RollingFileAppender">
    <file value=".\Log\Fatal.txt" />
    <appendToFile value="true" />
    <rollingStyle value="Composite" />
    <!--默认是ExclusiveLock, MinimalLock每次都打开关闭文件。不占用日志文件进程-->
    <lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
    <datePattern value="yyyyMMdd" />
    <countDirection value="1"/>
    <maxSizeRollBackups value="-1" />
    <!--<maximumFileSize value="1MB" />-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date|%logger|%message%newline" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="FATAL" />
      <levelMax value="FATAL" />
    </filter>
  </appender>

  <!--log4net 对于.netcore 本身不支持 AdoNetAppender,此处引用了MicroKnights.Log4NetAdoNetAppender,实现日志入库,
  以下注释部分为非.netcore 中的相关配置-->
  <!--<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">-->
  <!--<appender name="AdoNetAppender" type="MicroKnights.Logging.AdoNetAppender, MicroKnights.Log4NetAdoNetAppender">
    <bufferSize value="1" />
    <threshold value="ALL"/>
    <connectionType value="System.Data.SqlClient.SqlConnection,System.Data.SqlClient,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=127.0.0.1;initial catalog=LogsDataBase;integrated security=false;persist security info=True;User ID=sa;Password=sa123" />
    <commandText value="INSERT INTO SysLog_Log4net_tousulog ([LastTime],[LogThread],[LogLevel],[Logger],[LogMessage],[LogException]) 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.PatternLayout">
        <conversionPattern value="%exception" />
      </layout>
    </parameter>
  </appender>-->
  <root>
    <level value="ALL"/>
    <appender-ref ref="DebugAppender" />
    <appender-ref ref="ErrorAppender" />
    <appender-ref ref="InfoAppender" />
    <appender-ref ref="WarnAppender" />
    <appender-ref ref="FatalAppender" />
  </root>
</log4net>

注入

net6及之后

如果是net6及之后的,你应该只有一个program文件,直接添加

复制代码
  // 配置log4net
  var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
  XmlConfigurator.Configure(logRepository, new FileInfo("config/log4net.config"));

完整如下:

cs 复制代码
using log4net;
using log4net.Config;
using System.Reflection;

namespace ids4Demo2
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            // 配置log4net
            var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            XmlConfigurator.Configure(logRepository, new FileInfo("config/log4net.config"));
            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
            builder.Services.AddOpenApi();

            // 注册 JWT 认证,Authority 指向 ids4Demo(IdentityServer)
            builder.Services.AddAuthentication("Bearer")
                .AddJwtBearer("Bearer", options =>
                {
                    options.Authority = "http://localhost:5182";   // ids4Demo 地址
                    options.RequireHttpsMetadata = false;
                    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                    {
                        ValidateAudience = false  // ids4Demo 未配置 Audience,关闭验证
                    };
                });
            // 注册授权,要求 scope = api1
            builder.Services.AddAuthorization(options =>
            {
                options.AddPolicy("ApiScope", policy =>
                {
                    policy.RequireAuthenticatedUser();
                    policy.RequireClaim("scope", "api1");
                });
            });

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.MapOpenApi();
            }

            app.UseHttpsRedirection();

            app.UseAuthentication();   // 顺序不能反
            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

这样就配置好了,接下来就可以使用了

net6之前

如果是之前的话 ,应该是有一个program和一个startup文件

在startup如下位置添加上面的代码

cs 复制代码
using beforenet6Api.Utlis;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using log4net;
using log4net.Config;

namespace beforenet6Api
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            
            // 配置log4net
            var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
            XmlConfigurator.Configure(logRepository, new FileInfo("config/log4net.config"));
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddSingleton<IDiDemo, DiDemo>(); 
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
            app.Run(async context =>
            {
                await context.Response.WriteAsync("Hello, World!");
            });
        }
    }
}

使用

在控制器中添加

复制代码
 private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

完整示例:

cs 复制代码
using log4net;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Reflection;

namespace ids4Demo2.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        // hello word
        [HttpGet]
        public IActionResult test()
        {
            log.Info("Hello World!");
            return Ok(new { message = "Hello World!" });
        }
        [HttpGet]
        [Authorize]
        public IActionResult test2()
        {
            return Ok(new { message = "Hello World!" });
        }
    }
}

运行调用之后到bin目录下看有没有日志生成

这样就能够引入log4net了

还有另外一种方式,通过依赖注入的

配置文件放在根目录,之前的操作都没变

配置program

复制代码
// 添加 log4net 配置
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("config/log4net.config"));

// 添加 log4net 到日志系统
builder.Logging.AddLog4Net();
cs 复制代码
using ids4Demo;
using ids4Demo.Data;
using ids4Demo.Services;
using log4net;
using log4net.Config;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using System.Reflection;

var builder = WebApplication.CreateBuilder(args);
// 添加 log4net 配置
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("config/log4net.config"));

// 添加 log4net 到日志系统
builder.Logging.AddLog4Net();

builder.Services.AddControllers();
builder.Services.AddOpenApi();

// 注册 MySQL DbContext
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseMySql(
        builder.Configuration.GetConnectionString("DefaultConnection"),
        ServerVersion.AutoDetect(builder.Configuration.GetConnectionString("DefaultConnection"))
    ));

// 配置 IdentityServer
builder.Services.AddIdentityServer(options =>
{
    options.Events.RaiseErrorEvents = true;
    options.Events.RaiseFailureEvents = true;
    options.EmitStaticAudienceClaim = true;
})
    .AddInMemoryApiScopes(Config.ApiScopes)
    .AddInMemoryClients(Config.Clients)
    .AddResourceOwnerValidator<ResourceOwnerPasswordValidator>()
    .AddDeveloperSigningCredential();

// 配置认证
builder.Services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options =>
    {
        options.Authority = "http://localhost:5182";
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false
        };

    });

// 配置授权
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("ApiScope", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireClaim("scope", "api1");
    });
});

var app = builder.Build();

app.UseIdentityServer();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

if (app.Environment.IsDevelopment())
{
    app.MapOpenApi();
}

app.UseHttpsRedirection();
app.Run();

使用则变成了

cs 复制代码
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace ids4Demo.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        private readonly ILogger<TestController> _logger;
        public TestController(ILogger<TestController> logger)
        {
            _logger = logger;
        }

        //[Authorize(Policy = "ApiScope")] // 应用授权策略
        [Authorize]
        [HttpGet]
        public IActionResult test()
        {
            _logger.LogInformation("Hello World!!");
            return Ok(new { message = "Hello World!" });
        }
    }
}
相关推荐
SunnyDays10112 小时前
C# 实战:快速查找并高亮 Word 文档中的文字(普通查找 + 正则表达式)
开发语言·c#
人工智能AI技术2 小时前
Qwen3.5-Plus登顶|C#集成通义千问,高并发服务实战优化
人工智能·c#
SunnyDays10113 小时前
如何使用 C# 在 Word 文档中插入超链接 (含文本与图片链接)
开发语言·c#
一念春风3 小时前
证件照制作工具(WPF C#)
c#·wpf
似水明俊德11 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
阿蒙Amon13 小时前
C#常用类库-详解SerialPort
开发语言·c#
似水明俊德14 小时前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net
.NET修仙日记20 小时前
Acme.ReturnOh:让.NET API返回值处理更优雅,统一响应格式一步到位
c#·.net·webapi
阿蒙Amon21 小时前
C#常用类库-详解YamlDotNet
开发语言·c#