web-dev-qa-db-ja.com

ASP.NETコアフレームワークによって行われたログをオフにする方法

各リクエストに対して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を引数()で実行しています-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プロバイダーが取得されました ここから

50
gdoron

何か不足しているのかどうかはわかりませんが、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.WebHostInformationのままにします。

"Microsoft": "Information",  
"Microsoft.AspNetCore.Mvc.Internal": "Warning",
"Microsoft.AspNetCore.Authentication":  "Warning"

log4netでこれが機能しない場合の謝罪

58
KCD

Serilogを使用して.Netコアロギングを実行している場合、appsettings.jsonファイルを更新してログレベルを次のように設定できます。

"Serilog": {
  "MinimumLevel": {
    "Default": "Verbose",
    "Override": {
      "Microsoft": "Error",
      "System": "Error"
    }
  },
  "Properties": {
    "Application": "your-app"
  }
}

これにより、システム/ Microsoftからのエラーのみをログに記録し、他のすべてのログを記録することができます。

23
Tony Ranieri

私にとって本当に働いたのは、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ファイルには、Microsoftや他の人によるINFOの大量のログが表示されません。

詳細はこちら@ Microsoft Docs: ログフィルタリング

19

新しいログインフラストラクチャは(設計上)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."));
}
7
haim770

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);になります。

ロガープロバイダーはカスタムプロバイダーであるため、自分で設定する必要があります。コンソールロガーがそれをどのように行うかを見てください。デリゲートをプロバイダに渡し、フィルタリングを実行します。

GitHubソース から:

public static ILoggerFactory AddConsole(
    this ILoggerFactory factory,
    LogLevel minLevel,
    bool includeScopes)
{
    factory.AddConsole((category, logLevel) => logLevel >= minLevel, includeScopes);
    return factory;
}

もちろん、デリゲートを渡す代わりに、log4netのログレベルを直接設定することもできます。

Update:コメントで指摘した内容を拡張するため

ILoggerProviderは、実際のロギングフレームワークの単なるラッパーです。 ConsoleLoggerProviderの単純な場合、その背後にあるフレームワークはなく、単純なConsole.WriteLine呼び出しだけです。

Log4netの場合、例からレベルごとにロギングを有効にできることが明らかです。上記のような.NET Coreロガーの抽象化では、抽象化ではフィルタリングが行われないため、これは不可能です。

Log4net ILoggerProviderでは、すべてのログレベルを単純にlog4netネットライブラリにルーティングし、フィルタリングします。

@ haim770で作成されたリンクされたGitHubの問題に基づいて、フィルタリング用のSourceContextがあり、log4netにSourceContextの概念がない場合は、プロバイダーにこれを実装する必要があります。 SourceContextの概念がある場合、プロバイダーはそれをlog4netが期待する構造に再ルーティング/変換する必要があります。

ご覧のように、ロガー自体は常に、ASP.NETの内部仕様と実装の詳細を認識しません。 Log4NetProviderは、APIを翻訳/ラップアラウンドすることがタスクであるため、できません。プロバイダーは単なる抽象化であるため、たとえば実装の詳細をライブラリにリークする必要はありません。

4
Tseng