programing

ASP에서 수행하는 로깅을 해제하는 방법.NET 핵심 프레임워크

elecom 2023. 5. 3. 20:47
반응형

ASP에서 수행하는 로깅을 해제하는 방법.NET 핵심 프레임워크

ASP에서 수행한 로깅을 해제하려면 어떻게 해야 합니까?각 요청에 대한 NET.

정보 09:38:41 사용자 프로필을 사용할 수 있습니다.C:' 사용하기 파일:\\Users\xxxx\AppData\field\ASP.NET\DataProtection-Keys'를 키 저장소로 사용하고 윈도우즈 DPAPI를 사용하여 대기 중인 키를 암호화합니다.
09 호스트 시작 DEBUG 09:38:41 호스트
09 호스팅 시작 DEBUG 09:38:41 스팅시작
정보 09:38:41 HTTP/1.1 시작 요청 http://localhost:23369/
정보 09:38:41 HTTP/1.1 DEBUG 시작 요청 http://localhost:23369/text/html DEBUG 09:38:41 DEBUG 요청은 지원되지 않습니다.
09경로 /가되는 파일 형식 DEBUG 09:38:41 파일 과 일치하지 .
DEBUG 09:38:41 요청이 경로와 이름이 'default'이고 템플릿이 '{controller='인 경로와 일치했습니다.Home}/{action=인덱스}/{id?DEBUG 09:38:41 요청이 경로와 이름이 'default'이고 템플릿이 '{controller='인 경로와 일치했습니다.Home}/{action=인덱스}/{id?DEBUG 09:38:41 수행 포럼 실행.컨트롤러입니다.홈 컨트롤러.색인
DEBUG 09:38:41 수행 포럼 실행.컨트롤러입니다.홈 컨트롤러.색인
정보 09:38:41 조치 방법 포럼 실행.컨트롤러입니다.인수 - Valid', 모델 상태가 Valid() - ModelState is Valid'
정보 09:38:41 조치 방법 포럼 실행.컨트롤러입니다.홈 컨트롤러.색인
..

이 로그를 어떻게 끄는지 아직 찾지 못했습니다.

은 나의 이것나입니다.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?}");
    });
}

그리고 이건 제 프로젝트입니다.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 제공자를 여기서 가져왔습니다.

제가 누락된 부분이 있는지는 잘 모르겠지만 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

제게 정말로 효과가 있었던 것은 ASP에 이것을 추가한 것입니다. 2의 NET Core 2.0 관련 자료Startup.cs파일 이름:

using Microsoft.Extensions.Logging;
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: 로그 필터링

Serilog를 사용하여 작업을 수행하는 경우.NET Core 로깅을 사용하면 appsettings.json 파일을 업데이트하여 다음과 같이 로그 수준을 설정할 수 있습니다.

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

이렇게 하면 시스템/Microsoft의 오류만 기록하고 다른 모든 오류는 원하는 대로 기록할 수 있습니다.

ASP.NET Core 버전 3에서는 서비스 구성 기능에서 기존 로그 공급자를 지울 수 있습니다.

public void ConfigureServices(IServiceCollection services) {
    //Do everything else...
    services.AddLogging(c => c.ClearProviders());
}

로깅을 설정합니다.의 수준appsettings.json중요한 것은Microsoft충분하지 않았습니다.다음과 같은 키를 구체적으로 설정해야 했습니다.

"Microsoft.Hosting.Lifetime": "Warning",
"Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
"Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware": "Warning"

하는 대신 를 들어 " " " " " " (" " " " " " " " " "Microsoft.* 했다일. 는 다음과 같이을 내렸습니다.그래서 저는 다음과 같이 결론을 내렸습니다.

{
  "Logging": {
    "LogLevel": {
      "Default":     "Warning",
      "Microsoft.*": "Warning" 
  }
  ...
}

.net 자체 및 에 의해 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);
}

사가능량용in(in))Startup.cs):

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv, ILoggerFactory loggerFactory)
{
    appEnv.ConfigureLog4Net("log4net.xml");

    loggerFactory.AddLog4Net(x => !x.StartsWith("Microsoft."));
}

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의 로그 수준을 직접 설정할 수도 있습니다.

업데이트: 댓글에서 지적한 내용을 확대하기 위해

ILoggerProvider실제 로깅 프레임워크 주변의 래퍼일 뿐입니다. 경는에우의 간단한 .ConsoleLoggerProvider그 뒤에 있는 모든 프레임워크는 없고, 그저 단순합니다.Console.WriteLine 러불러.

log4net의 경우, 로그를 수준별로 활성화할 수 있다는 것은 예제를 통해 알 수 있습니다.에서는 이 작업을 수행할 수 없습니다.NET Core 로거 추상화는 필터링을 수행하지 않으므로 위와 같습니다.

log4net에서ILoggerProvider모든 로그 수준을 log4net 라이브러리로 라우팅하고 필터링하기만 하면 됩니다.

생성된 연결된 GitHub 이슈 @haim770을 기반으로 필터링할 소스 컨텍스트가 있으며, log4net에 소스 컨텍스트 개념이 없으면 공급자에서 이를 구현해야 합니다.SourceContext 개념이 있는 경우 공급자는 이를 log4net이 예상하는 구조로 재라우팅/변환해야 합니다.

보시다시피 로거 자체는 항상 ASP의 내부 세부 사항과 구현 세부 사항에 대해 알지 못합니다.. 그.Log4NetProvider해당 api를 중심으로 번역/수정하는 작업이기 때문에 할 수 없고 해서는 안 됩니다.공급자는 추상화에 불과하므로 구현 세부 정보를 라이브러리에 유출할 필요가 없습니다.

Serilog를 사용하면 로거 구성을 정의할 때 Microsoft 구성 요소에 대한 재정의를 지정하는 간단한 경우가 있음을 알게 되었습니다.

Log.Logger = new LoggerConfiguration()
    ... // Other config
    .MinimumLevel.Information()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
    ... // Other config
    .CreateLogger();

이를 통해 로그만 기록할 수 있습니다.Warning요소의 경우 는 이 항목을 사용합니다.Information내 부품에 대한 이상.

startup.cs 에서 이 두 가지 구성 플래그를 설정합니다.

        services.ConfigureTelemetryModule<DependencyTrackingTelemetryModule>((module, options) =>
        {
            options.EnableDependencyTrackingTelemetryModule = false;
            options.EnableRequestTrackingTelemetryModule = false;
        });

그러면 로그에서 추적 원격 측정 유형만 볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/35251078/how-to-turn-off-the-logging-done-by-the-asp-net-core-framework

반응형