첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestProject.zip
다운로드

▶ Log/ColorConsoleLoggerConfiguration.cs

using Microsoft.Extensions.Logging;
using System;

namespace TestProject.Log
{
    /// <summary>
    /// 색상 콘솔 로그 기록기 구성
    /// </summary>
    public class ColorConsoleLoggerConfiguration
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 로그 레벨 - LogLevel

        /// <summary>
        /// 로그 레벨
        /// </summary>
        public LogLevel LogLevel { get; set; } = LogLevel.Warning;

        #endregion
        #region 이벤트 ID - EventID

        /// <summary>
        /// 이벤트 ID
        /// </summary>
        public int EventID { get; set; } = 0;

        #endregion
        #region 색상 - Color

        /// <summary>
        /// 색성
        /// </summary>
        public ConsoleColor Color { get; set; } = ConsoleColor.Yellow;

        #endregion
    }
}

 

▶ Log/ColorConsoleLogger.cs

using Microsoft.Extensions.Logging;
using System;

namespace TestProject.Log
{
    /// <summary>
    /// 색상 콘솔 로그 기록기
    /// </summary>
    public class ColorConsoleLogger : ILogger
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 명칭
        /// </summary>
        private readonly string name;

        /// <summary>
        /// 구성
        /// </summary>
        private readonly ColorConsoleLoggerConfiguration configuration;

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - ColorConsoleLogger(name, configuration)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="name">명칭</param>
        /// <param name="configuration">구성</param>
        public ColorConsoleLogger(string name, ColorConsoleLoggerConfiguration configuration)
        {
            this.name          = name;
            this.configuration = configuration;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 범위 시작하기 - BeginScope<TState>(state)

        /// <summary>
        /// 범위 시작하기
        /// </summary>
        /// <typeparam name="TState">상태 타입</typeparam>
        /// <param name="state">상태</param>
        /// <returns>리소스 해제 인터페이스</returns>
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        #endregion
        #region 이용 가능 여부 구하기 - IsEnabled(logLevel)

        /// <summary>
        /// 이용 가능 여부 구하기
        /// </summary>
        /// <param name="logLevel">로그 레벨</param>
        /// <returns>이용 가능 여부</returns>
        public bool IsEnabled(LogLevel logLevel)
        {
            return logLevel == this.configuration.LogLevel;
        }

        #endregion
        #region 로그 기록하기 - Log<TState>(logLevel, eventID, state, exception, formatter)

        /// <summary>
        /// 로그 기록하기
        /// </summary>
        /// <typeparam name="TState">상태 타입</typeparam>
        /// <param name="logLevel">로그 레벨</param>
        /// <param name="eventID">이벤트 ID</param>
        /// <param name="state">상태</param>
        /// <param name="exception">예외</param>
        /// <param name="formatter">포매터</param>
        public void Log<TState>
        (
            LogLevel                        logLevel,
            EventId                         eventID,
            TState                          state,
            Exception                       exception,
            Func<TState, Exception, string> formatter
        )
        {
            if(!IsEnabled(logLevel))
            {
                return;
            }

            if(this.configuration.EventID == 0 || this.configuration.EventID == eventID.Id)
            {
                ConsoleColor color = Console.ForegroundColor;

                Console.ForegroundColor = this.configuration.Color;

                Console.WriteLine($"{logLevel} - {eventID.Id} " + $"- {this.name} - {formatter(state, exception)}");

                Console.ForegroundColor = color;
            }
        }

        #endregion
    }
}

 

▶ Log/ColorConsoleLoggerProvider.cs

using Microsoft.Extensions.Logging;
using System.Collections.Concurrent;

namespace TestProject.Log
{
    /// <summary>
    /// 색상 콘솔 로기 기록기 제공자
    /// </summary>
    public class ColorConsoleLoggerProvider : ILoggerProvider
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Field
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region Field

        /// <summary>
        /// 구성
        /// </summary>
        private readonly ColorConsoleLoggerConfiguration configuration;

        /// <summary>
        /// 로그 기록기 딕셔너리
        /// </summary>
        private readonly ConcurrentDictionary<string, ColorConsoleLogger> dictionary = new ConcurrentDictionary<string, ColorConsoleLogger>();

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - ColorConsoleLoggerProvider(configuration)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="configuration">구성</param>
        public ColorConsoleLoggerProvider(ColorConsoleLoggerConfiguration configuration)
        {
            this.configuration = configuration;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 로그 기록기 생성하기 - CreateLogger(categoryName)

        /// <summary>
        /// 로그 기록기 생성하기
        /// </summary>
        /// <param name="categoryName">카테고리명</param>
        /// <returns>로그 기록기</returns>
        public ILogger CreateLogger(string categoryName)
        {
            return this.dictionary.GetOrAdd(categoryName, name => new ColorConsoleLogger(name, this.configuration));
        }

        #endregion
        #region 리소스 해제하기 - Dispose()

        /// <summary>
        /// 리소스 해제하기
        /// </summary>
        public void Dispose()
        {
            this.dictionary.Clear();
        }

        #endregion
    }
}

 

▶ Log/ColorConsoleLoggerExtension.cs

using Microsoft.Extensions.Logging;
using System;

namespace TestProject.Log
{
    /// <summary>
    /// 색상 콘솔 로그 기록기 확장
    /// </summary>
    public static class ColorConsoleLoggerExtension
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Public

        #region 색상 콘솔 로그 기록기 추가하기 - AddColorConsoleLogger(loggerFactory, configuration)

        /// <summary>
        /// 색상 콘솔 로그 기록기 추가하기
        /// </summary>
        /// <param name="loggerFactory">로그 기록기 팩토리</param>
        /// <param name="configuration">구성</param>
        /// <returns>로그 기록기 팩토리</returns>
        public static ILoggerFactory AddColorConsoleLogger
        (
            this ILoggerFactory             loggerFactory,
            ColorConsoleLoggerConfiguration configuration
        )
        {
            loggerFactory.AddProvider(new ColorConsoleLoggerProvider(configuration));

            return loggerFactory;
        }

        #endregion
        #region 색상 콘솔 로그 기록기 추가하기 - AddColorConsoleLogger(loggerFactory)

        /// <summary>
        /// 색상 콘솔 로그 기록기 추가하기
        /// </summary>
        /// <param name="loggerFactory">로그 기록기 팩토리</param>
        /// <returns>로그 기록기 팩토리</returns>
        public static ILoggerFactory AddColorConsoleLogger(this ILoggerFactory loggerFactory)
        {
            ColorConsoleLoggerConfiguration configuration = new ColorConsoleLoggerConfiguration();

            return loggerFactory.AddColorConsoleLogger(configuration);
        }

        #endregion
        #region 색상 콘솔 로그 기록기 추가하기 - AddColorConsoleLogger(loggerFactory, configure)

        /// <summary>
        /// 색상 콘솔 로그 기록기 추가하기
        /// </summary>
        /// <param name="loggerFactory">로그 기록기 팩토리</param>
        /// <param name="configure">구성 액션</param>
        /// <returns>로그 기록기 팩토리</returns>
        public static ILoggerFactory AddColorConsoleLogger
        (
            this ILoggerFactory                     loggerFactory,
            Action<ColorConsoleLoggerConfiguration> configure
        )
        {
            ColorConsoleLoggerConfiguration configuration = new ColorConsoleLoggerConfiguration();

            configure(configuration);

            return loggerFactory.AddColorConsoleLogger(configuration);
        }

        #endregion
    }
}

 

▶ Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;

using TestProject.Log;

namespace TestProject
{
    /// <summary>
    /// 시작
    /// </summary>
    public class Startup
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 구성 - Configuration

        /// <summary>
        /// 구성
        /// </summary>
        public IConfiguration Configuration { get; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - Startup(configuration)

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="configuration">구성</param>
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 서비스 컬렉션 구성하기 - ConfigureServices(services)

        /// <summary>
        /// 서비스 컬렉션 구성하기
        /// </summary>
        /// <param name="services">서비스 컬렉션</param>
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
        }

        #endregion
        #region 구성하기 - Configure(app, environment)

        /// <summary>
        /// 구성하기
        /// </summary>
        /// <param name="app">애플리케이션 빌더</param>
        /// <param name="environment">웹 호스트 환경</param>
        /// <param name="loggerFactory">로그 기록기 팩토리</param>
        public void Configure(IApplicationBuilder app, IWebHostEnvironment environment, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddProvider
            (
                new ColorConsoleLoggerProvider
                (
                    new ColorConsoleLoggerConfiguration
                    {
                        LogLevel = LogLevel.Error,
                        Color    = ConsoleColor.Red
                    }
                )
            );
                
            loggerFactory.AddColorConsoleLogger();

            loggerFactory.AddColorConsoleLogger
            (
                new ColorConsoleLoggerConfiguration
                {
                    LogLevel = LogLevel.Debug,
                    Color    = ConsoleColor.Gray
                }
            );

            loggerFactory.AddColorConsoleLogger
            (
                configuration =>
                {
                    configuration.LogLevel = LogLevel.Information;
                    configuration.Color    = ConsoleColor.Blue;
                }
            );

            if(environment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");

                app.UseHsts();
            }

            app.UseHttpsRedirection();

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints
            (
                endpoints =>
                {
                    endpoints.MapControllerRoute
                    (
                        name    : "default",
                        pattern : "{controller=Home}/{action=Index}/{id?}"
                    );
                }
            );
        }

        #endregion
    }
}
728x90
반응형
그리드형

'.NetCore > ASP.NET MVC' 카테고리의 다른 글

[.NETCORE/ASP.NET MVC] UseExtensions 클래스 : Use 확장 메소드를 사용해 터미널 미들웨어 사용하기  (0) 2020.10.29
[.NETCORE/ASP.NET MVC] RoutingEndpointConventionBuilderExtensions 클래스 : WithMetadata<T> 확장 메소드를 사용해 엔드포인트 감사하기 (audit)  (0) 2020.10.29
[.NETCORE/ASP.NET MVC] UseExtensions 클래스 : Use 확장 메소드를 사용해 엔드포인트 추적하기  (0) 2020.10.29
[.NETCORE/ASP.NET MVC] EndpointHttpContextExtensions 클래스 : GetEndpoint 확장 메소드를 사용해 현재 요청에 대한 엔드포인트 구하기  (0) 2020.10.29
[.NETCORE/ASP.NET MVC] EndpointRouteBuilderExtensions 클래스 : MapGet 확장 메소드에서 경로 템플리트를 사용해 HTTP GET 요청 처리하기  (0) 2020.10.27
[.NETCORE/ASP.NET MVC] ILoggerProvider 인터페이스 : 커스텀 로그 기록기 공급자 사용하기  (0) 2020.10.27
[.NETCORE/ASP.NET MVC] FilterLoggingBuilderExtensions 클래스 : AddFilter 확장 메소드를 사용해 로그 필터 추가하기  (0) 2020.10.27
[.NETCORE/ASP.NET MVC] ILogger<T> 인터페이스 : Startup 클래스의 Configure 메소드에서 로그 사용하기  (0) 2020.10.27
[.NETCORE/ASP.NET MVC] ILogger<T> 인터페이스 : Program 클래스의 Main 정적 메소드에서 로그 사용하기  (0) 2020.10.27
[.NETCORE/ASP.NET MVC] ILogger<T> 인터페이스 : ILogger<T> 인터페이스에 종속되는 서비스 구성하기  (0) 2020.10.27
[.NETCORE/ASP.NET MVC] ILogger<T> 인터페이스 : ILogger<T> 인터페이스에 종속되는 서비스 구성하기  (0) 2020.10.27
Posted by 사용자 icodebroker

댓글을 달아 주세요