创建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!" });
}
}
}