如何为每个请求关闭ASP.NET完成的日志记录,例如
INFO 09:38:41用户个人资料可用。使用'C:\ Users \ xxxx xxxx \ AppData \ Local \ ASP.NET \ DataProtection-Keys'作为密钥存储库,使用Windows DPAPI加密静态密钥。
DEBUG 09:38:41主持开始 DEBUG 09:38:41主持人开始了 INFO 09:38:41请求启动HTTP / 1.1 GET http://localhost:23369/
INFO 09:38:41请求启动HTTP / 1.1 DEBUG http://localhost:23369/ text / html DEBUG 09:38:41不支持DEBUG请求 DEBUG 09:38:41请求路径/与支持的文件类型不匹配
DEBUG 09:38:41请求成功匹配路线名称'default'和模板'{controller = Home} / {action = Index} / {id?}'。 DEBUG 09:38:41请求成功匹配路线名称'default'和模板'{controller = Home} / {action = Index} / {id?}'。 DEBUG 09:38:41执行动作Forums.Controllers.HomeController.Index
DEBUG 09:38:41执行动作Forums.Controllers.HomeController.Index
INFO 09:38:41执行动作方法Forums.Controllers.HomeController.Index with arguments() - ModelState有效'
INFO 09:38:41执行动作方法Forums.Controllers.HomeController.Index
..
我还没找到如何关闭这个日志...
这是Configure
类中的Startup
方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddProvider(new Log4NetProvider());
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859
try
{
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
serviceScope.ServiceProvider.GetService<ApplicationDbContext>()
.Database.Migrate();
}
}
catch { }
}
app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
app.UseStaticFiles();
app.UseIdentity();
// To configure external authentication please see http://go.microsoft.com/fwlink/?LinkID=532715
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
这是我的project.json文件:
"dependencies": {
"EntityFramework.Commands": "7.0.0-rc1-final",
"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
"log4net": "2.0.5",
"Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
"Microsoft.AspNet.Diagnostics.Entity": "7.0.0-rc1-final",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
"Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging": "1.0.0-rc1-final",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"
},
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel",
"ef": "EntityFramework.Commands"
},
"frameworks": {
"dnx451": { }
},
更新
我的log4net提供程序已被from here
答案 0 :(得分:49)
我不确定我是否遗漏了某些内容,但是您不想提高Microsoft日志的日志级别吗?
修改appsettings.json
(假定.AddJsonFile("appsettings.json", ...)
)
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"System": "Information",
"Microsoft": "Information"
要
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Trace",
"System": "Information",
"Microsoft": "None"
或者通过环境变量进行相同的修改(假设为.AddEnvironmentVariables()
)
Logging:LogLevel:Microsoft=None
您还可以更具体,以下内容会减少大多数条目,但Microsoft.AspNetCore.Hosting.Internal.WebHost
位于Information
。
"Microsoft": "Information",
"Microsoft.AspNetCore.Mvc.Internal": "Warning",
"Microsoft.AspNetCore.Authentication": "Warning"
如果这对log4net
答案 1 :(得分:17)
如果您使用Serilog进行.Net核心日志记录,则可以更新appsettings.json文件以设置日志级别,如下所示:
"Serilog": {
"MinimumLevel": {
"Default": "Verbose",
"Override": {
"Microsoft": "Error",
"System": "Error"
}
},
"Properties": {
"Application": "your-app"
}
}
这允许您只记录System / Microsoft中的错误,同时根据需要记录其他所有内容。
答案 2 :(得分:13)
对我来说真正有用的是在ASP.NET Core 2.0项目的Startup.cs
文件中添加它:
public void ConfigureServices(IServiceCollection services)
{
.
.
.
services.AddLogging(
builder =>
{
builder.AddFilter("Microsoft", LogLevel.Warning)
.AddFilter("System", LogLevel.Warning)
.AddFilter("NToastNotify", LogLevel.Warning)
.AddConsole();
});
}
这样,您只会从传递给builder.AddFilter
的过滤器开始获取日志信息的警告级别日志。
我的log4net.log文件现在没有显示微软和其他人发送的大量INFO
日志记录。
此处有更多信息@ Microsoft Docs:Log filtering
答案 3 :(得分:7)
由于asp.net本身(以及其他供应商代码)正在使用(通过设计)新的日志记录基础结构,因此可以通过ILoggerProvider
实现来决定是否要记录该来源与否。
以下是log4net
的修订实施,它增加了基本的源过滤功能:
public class Log4NetProvider : ILoggerProvider
{
private static readonly NoopLogger _noopLogger = new NoopLogger();
private readonly Func<string, bool> _sourceFilterFunc;
private readonly ConcurrentDictionary<string, Log4NetLogger> _loggers = new ConcurrentDictionary<string, Log4NetLogger>();
public Log4NetProvider(Func<string, bool> sourceFilterFunc = null)
{
_sourceFilterFunc = sourceFilterFunc != null ? sourceFilterFunc : x => true;
}
public ILogger CreateLogger(string name)
{
if (!_sourceFilterFunc(name))
return _noopLogger;
return _loggers.GetOrAdd(name, x => new Log4NetLogger(name));
}
public void Dispose()
{
_loggers.Clear();
}
private class NoopLogger : ILogger
{
public IDisposable BeginScopeImpl(object state)
{
return null;
}
public bool IsEnabled(LogLevel logLevel)
{
return false;
}
public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
{
}
}
}
Log4NetAspExtensions
:
public static void ConfigureLog4Net(this IApplicationEnvironment appEnv, string configFileRelativePath)
{
GlobalContext.Properties["appRoot"] = appEnv.ApplicationBasePath;
XmlConfigurator.Configure(new FileInfo(Path.Combine(appEnv.ApplicationBasePath, configFileRelativePath)));
}
public static void AddLog4Net(this ILoggerFactory loggerFactory, Func<string, bool> sourceFilterFunc = null)
{
loggerFactory.AddProvider(new Log4NetProvider(sourceFilterFunc));
}
public static void AddLog4Net(this ILoggerFactory loggerFactory)
{
loggerFactory.AddLog4Net(null);
}
可能的用法(在Startup.cs
中):
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv, ILoggerFactory loggerFactory)
{
appEnv.ConfigureLog4Net("log4net.xml");
loggerFactory.AddLog4Net(x => !x.StartsWith("Microsoft."));
}
答案 4 :(得分:5)
在ASP.NET 5 RC1(现在是ASP.NET Core 1.0)之前和之后,您可以通过记录器工厂来完成,即
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// completely disable logging or use one of the other levels, such as Error, Critical, Warning etc.
loggerFactory.MinimumLevel = LogLevel.None;
}
但是,对于当前分支(尚未发布,但可通过夜间构建获得),此内容已被删除。现在您需要为每个提供商传递LogLevel
。通常,这是通过扩展方法完成的。
对于内置控制台记录器,例如loggerFactory.AddConsole(minimumLevel: LogLevel.Warning);
。
由于您的记录器提供程序是自定义程序,因此您必须自己配置它。看看控制台记录器是如何做到的。它将委托传递给提供者,进行过滤。
public static ILoggerFactory AddConsole(
this ILoggerFactory factory,
LogLevel minLevel,
bool includeScopes)
{
factory.AddConsole((category, logLevel) => logLevel >= minLevel, includeScopes);
return factory;
}
当然,您也可以直接设置log4net的日志级别,而不是传递委托。
更新:扩展我在评论中指出的内容
ILoggerProvider
只是实际日志框架的包装器。在ConsoleLoggerProvider
的简单情况下,它背后没有框架,只是一个简单的Console.WriteLine
调用。
对于log4net,从示例中可以明显看出,可以在每个级别上启用日志记录。对于上面提到的.NET Core logger抽象,这是不可能的,因为抽象不会进行任何过滤。
在log4net ILoggerProvider
中,只需将所有日志级别路由到log4net网络库并对其进行过滤即可。
根据链接的GitHub问题@ haim770创建,你有SourceContext进行过滤,如果log4net没有SourceContext的概念,你必须在提供程序中实现它。如果它具有SourceContext的概念,那么提供者需要将其重新路由/转换为log4net期望的结构。
正如您所看到的,记录器本身始终不了解ASP.NET的内部细节和实现细节。 Log4NetProvider
不能也不应该,因为它的任务是翻译/包裹该api。提供者只是抽象,因此我们不必将实现细节泄露到库中。
答案 5 :(得分:2)
在ASP.NET Core版本3中,可以在ConfigureServices函数中清除现有的日志提供程序:
public void ConfigureServices(IServiceCollection services) {
//Do everything else...
services.AddLogging(c => c.ClearProviders());
}
答案 6 :(得分:0)
在appsettings.json
中为键Microsoft
设置Logging.LogLevel是不够的。我必须专门设置以下键,例如:
"Microsoft.Hosting.Lifetime": "Warning",
"Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
"Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware": "Warning"
但是,也可以使用带有通配符的键,例如Microsoft.*
,工作。所以我最后得到了:
{
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft.*": "Warning"
}
...
}
答案 7 :(得分:0)
使用 Serilog,我发现这是一个在定义记录器配置时为 Microsoft 组件指定覆盖的简单案例:
Log.Logger = new LoggerConfiguration()
... // Other config
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
... // Other config
.CreateLogger();
这使我只能为 Microsoft 组件记录 Warning
级或更高级别的条目,但为我自己的组件记录 Information
级或更高级别。