๐ŸŒŸ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์„ธ๊ณ„๋กœ ํ’๋ฉ! Serilog vs NLog ๋Œ€๊ฒฉ๋Œ ๐ŸŒŸ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŒŸ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์„ธ๊ณ„๋กœ ํ’๋ฉ! Serilog vs NLog ๋Œ€๊ฒฉ๋Œ ๐ŸŒŸ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ C# ๊ฐœ๋ฐœ์ž๋“ค์˜ ํ•„์ˆ˜ ๋ฌด๊ธฐ, ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ๊นŠ~๊ฒŒ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ํŠนํžˆ Serilog์™€ NLog๋ผ๋Š” ๋‘ ๊ฐ•์ž๋ฅผ ๋น„๊ตํ•ด๋ณผ ๊ฑด๋ฐ์š”. ์ด ๋‘ ๋…€์„, ์–ด๋–ค ๊ฒŒ ๋” ์ฉ”๊นŒ์š”? ๐Ÿค”

๋กœ๊น…์ด ๋ญ๊ธธ๋ž˜ ์ด๋ ‡๊ฒŒ ๋‚œ๋ฆฌ๋ƒ๊ณ ์š”? ใ…‹ใ…‹ใ…‹ ๊ฐœ๋ฐœ์ž life์—์„œ ๋กœ๊น…์€ ๊ทธ๋ƒฅ ํ•„์ˆ˜์ฃ ! ๋ฒ„๊ทธ ์žก์„ ๋•Œ, ์„ฑ๋Šฅ ํŠœ๋‹ํ•  ๋•Œ, ์‹ฌ์ง€์–ด ๋ณด์•ˆ ์ด์Šˆ ์ถ”์ ํ•  ๋•Œ๋„ ๋กœ๊ทธ ์—†์œผ๋ฉด ์•™์ƒํ•œ ๋‚˜๋ฌด์ฒ˜๋Ÿผ ์†์ˆ˜๋ฌด์ฑ…์ด์—์š”. ๐Ÿ˜ฑ

๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ Serilog์™€ NLog๋ฅผ A๋ถ€ํ„ฐ Z๊นŒ์ง€ ๋น„๊ตํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์„ค์น˜๋ถ€ํ„ฐ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•, ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊นŒ์ง€! ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ๋”ฑ ๋งž๋Š” ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ฐพ์•„๋ณด์ž๊ณ ์š”. ๐Ÿ’ช

์•„! ๊ทธ๋ฆฌ๊ณ  ์ž ๊น, ์—ฌ๋Ÿฌ๋ถ„ ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์ด๋ผ๊ณ  ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ๊ฐœ๋ฐœ ๊ด€๋ จ ์žฌ๋Šฅ๋„ ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ดˆ์‹ ์„ ํ•œ ํ”Œ๋žซํผ์ด์—์š”. ๋‚˜์ค‘์— ๋กœ๊น… ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜๋ฉด ๊ฑฐ๊ธฐ์„œ ์ง€์‹ ๊ณต์œ ๋„ ํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๐Ÿ˜‰

์ž, ์ด์ œ ๋กœ๊น…์˜ ์„ธ๊ณ„๋กœ ๋›ฐ์–ด๋“ค ์ค€๋น„ ๋˜์…จ๋‚˜์š”? Let's go! ๐Ÿš€

๐Ÿ“š ๋กœ๊น…, ์ด๊ฒŒ ๋ญ๊ธธ๋ž˜?

๋กœ๊น…์ด ๋ญ”์ง€ ๋ชจ๋ฅด๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์—†๊ฒ ์ง€๋งŒ, ๊ทธ๋ž˜๋„ ํ•œ ๋ฒˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”? ๋กœ๊น…์€ ์‰ฝ๊ฒŒ ๋งํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ณผ์ •์ด์—์š”. ๊ทผ๋ฐ ์ด๊ฒŒ ์™œ ์ค‘์š”ํ• ๊นŒ์š”?

  • ๐Ÿž ๋””๋ฒ„๊น…์˜ ์‹ : ๋ฒ„๊ทธ ์žก์„ ๋•Œ ๋กœ๊ทธ๋Š” ์ง„์งœ ๊ตฌ์„ธ์ฃผ์˜ˆ์š”. ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ›คํžˆ ๋ณด์ด๋‹ˆ๊นŒ์š”.
  • ๐Ÿš€ ์„ฑ๋Šฅ ํŠœ๋‹์˜ ๋น„๋ฐ€๋ณ‘๊ธฐ: ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ณ‘๋ชฉ์ธ์ง€ ๋กœ๊ทธ๋กœ ํ™•์ธํ•˜๋ฉด ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ ธ์š”.
  • ๐Ÿ”’ ๋ณด์•ˆ ์ง€ํ‚ด์ด: ๋ˆ„๊ฐ€ ์–ธ์ œ ์–ด๋–ค ์ž‘์—…์„ ํ–ˆ๋Š”์ง€ ๋กœ๊ทธ๋กœ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•ด์ปค๋“ค ์กฐ์‹ฌํ•ด!
  • ๐Ÿ“Š ์‚ฌ์šฉ์ž ํ–‰๋™ ๋ถ„์„์‚ฌ: ์‚ฌ์šฉ์ž๋“ค์ด ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๋งŽ์ด ์“ฐ๋Š”์ง€ ๋กœ๊ทธ๋กœ ์•Œ ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์ผ€ํŒ…์—๋„ ์ข‹๊ฒ ์ฃ ?

๊ทผ๋ฐ ๋ง์ด์ฃ , ๊ทธ๋ƒฅ Console.WriteLine()์œผ๋กœ ๋กœ๊น…ํ•˜๋ฉด ์•ˆ ๋˜๋‚˜์š”? ใ…‹ใ…‹ใ…‹ ์•„~ ๊ทธ๋Ÿฌ๋‹ค๊ฐ€๋Š” ํฐ ์ฝ” ๋‹ค์นฉ๋‹ˆ๋‹ค. ๐Ÿ˜ฑ

์™œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์จ์•ผ ํ• ๊นŒ์š”?

  • ๐Ÿ“ ํŒŒ์ผ๋กœ ์ €์žฅ? DB์— ์ €์žฅ? ํด๋ผ์šฐ๋“œ์— ์ €์žฅ? ๋‹ค ๊ฐ€๋Šฅํ•ด์š”!
  • ๐Ÿ” ๋กœ๊ทธ ๋ ˆ๋ฒจ ์„ค์ •์œผ๋กœ ์ค‘์š”ํ•œ ์ •๋ณด๋งŒ ์™์™ ๊ณจ๋ผ๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.
  • ๐ŸŽจ ๋กœ๊ทธ ํฌ๋งทํŒ…๋„ ์ž์œ ์ž์žฌ! JSON? XML? ์›ํ•˜๋Š” ๋Œ€๋กœ~
  • ๐Ÿš€ ๋น„๋™๊ธฐ ๋กœ๊น…์œผ๋กœ ์„ฑ๋Šฅ ๊ฑฑ์ • ๋!

์ด์ œ ๋กœ๊น…์˜ ์ค‘์š”์„ฑ์€ ์•„์‹œ๊ฒ ์ฃ ? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Serilog์™€ NLog๋ฅผ ๋น„๊ตํ•ด๋ณผ๊นŒ์š”? ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ ๋‹ค C#์—์„œ ์—„์ฒญ ์ธ๊ธฐ ์žˆ๋Š” ๋…€์„๋“ค์ด์—์š”. ์–ด๋–ค ๊ฒŒ ๋” ์ข‹์„์ง€, ํ•จ๊ป˜ ์•Œ์•„๋ณด์•„์š”! ๐Ÿ’ช

๋กœ๊น…์˜ ์ค‘์š”์„ฑ ๋กœ๊น… ๋””๋ฒ„๊น… ์„ฑ๋Šฅ ํŠœ๋‹ ๋ณด์•ˆ ๋ถ„์„

์ž, ์ด์ œ ๋กœ๊น…์˜ ์ค‘์š”์„ฑ์€ ์ถฉ๋ถ„ํžˆ ์ดํ•ดํ•˜์…จ์ฃ ? ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Serilog์™€ NLog๋ฅผ ํŒŒํ—ค์ณ๋ณผ ์‹œ๊ฐ„์ด์—์š”! ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํŠน์ง•, ์žฅ๋‹จ์ , ์‚ฌ์šฉ๋ฒ•๊นŒ์ง€ ๋‚ฑ๋‚ฑ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's dive in! ๐ŸŠโ€โ™‚๏ธ

๐ŸŒŸ Serilog: ํ˜„๋Œ€์ ์ด๊ณ  ์œ ์—ฐํ•œ ๋กœ๊น…์˜ ์‹ 

์ž, ์ด์ œ Serilog์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ฐจ๋ก€์˜ˆ์š”! Serilog๋Š” .NET ์ƒํƒœ๊ณ„์—์„œ ์—„์ฒญ ํ•ซํ•œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์ฃ . ์™œ ์ด๋ ‡๊ฒŒ ์ธ๊ธฐ๊ฐ€ ๋งŽ์„๊นŒ์š”? ํ•œ๋ฒˆ ํŒŒํ—ค์ณ๋ณผ๊นŒ์š”? ๐Ÿ˜Ž

๐Ÿš€ Serilog์˜ ํŠน์ง•

  • ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…: ์ด๊ฒŒ ๋ฐ”๋กœ Serilog์˜ ํ‚ฌ๋ง ํฌ์ธํŠธ! JSON ํ˜•์‹์œผ๋กœ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•ด์„œ ๋‚˜์ค‘์— ๋ถ„์„ํ•˜๊ธฐ ์‰ฌ์›Œ์š”.
  • ๋‹ค์–‘ํ•œ ์‹ฑํฌ(Sink) ์ง€์›: ํŒŒ์ผ, ์ฝ˜์†”, DB, ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๋“ฑ ์–ด๋””๋“  ๋กœ๊ทธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด์š”.
  • ๊ฐ•๋ ฅํ•œ ํ™•์žฅ์„ฑ: ์ปค์Šคํ…€ ์‹ฑํฌ๋‚˜ ์ธ๋ฆฌ์น˜๋จผํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: ๋น„๋™๊ธฐ ๋กœ๊น…์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•ด์š”.

Serilog๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์ 

  • ๐Ÿ“Š ๊ตฌ์กฐํ™”๋œ ๋กœ๊ทธ๋กœ ๋ฐ์ดํ„ฐ ๋ถ„์„์ด ์‰ฌ์›Œ์ ธ์š”.
  • ๐Ÿ”ง ์„ค์ •์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด์—์š”.
  • ๐Ÿš€ ๋‹ค์–‘ํ•œ ์‹ฑํฌ๋กœ ๋กœ๊ทธ ์ €์žฅ ๋ฐฉ์‹์„ ์ž์œ ๋กญ๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๐Ÿ’ช ๊ฐ•๋ ฅํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ์ด ๋น ๋ฅด์ฃ .

๐Ÿ›  Serilog ์„ค์น˜ํ•˜๊ธฐ

Serilog๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € NuGet ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ด์š”. Visual Studio์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž ์ฝ˜์†”์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ผ์š”:

Install-Package Serilog
Install-Package Serilog.Sinks.Console
Install-Package Serilog.Sinks.File

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Serilog ์ฝ”์–ด์™€ ์ฝ˜์†”, ํŒŒ์ผ ์‹ฑํฌ๊ฐ€ ์„ค์น˜๋ผ์š”. ๋‹ค๋ฅธ ์‹ฑํฌ๋„ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•˜๋ฉด ๋˜๊ฒ ์ฃ ?

๐ŸŽจ Serilog ๊ธฐ๋ณธ ์„ค์ •

์ž, ์ด์ œ Serilog๋ฅผ ์„ค์ •ํ•ด๋ณผ๊นŒ์š”? ์ •๋ง ๊ฐ„๋‹จํ•ด์š”!

using Serilog;

Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .WriteTo.File("log-.txt", rollingInterval: RollingInterval.Day)
    .CreateLogger();

Log.Information("Hello, Serilog!");

Log.CloseAndFlush();

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ˜์†”๊ณผ ํŒŒ์ผ์— ๋™์‹œ์— ๋กœ๊ทธ๊ฐ€ ์ €์žฅ๋ผ์š”. ํŒŒ์ผ์€ ๋‚ ์งœ๋ณ„๋กœ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋‹ˆ๊นŒ ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ํŽธํ•˜์ฃ !

๐Ÿš€ Serilog ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

Serilog์˜ ์ง„๊ฐ€๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์—์„œ ๋‚˜ํƒ€๋‚˜์š”. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ์š”:

  1. ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…:
    Log.Information("User {UserId} logged in from {IpAddress}", userId, ipAddress);
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ๊ทธ์— UserId์™€ IpAddress๊ฐ€ ๋ณ„๋„์˜ ํ•„๋“œ๋กœ ์ €์žฅ๋ผ์š”. ๋‚˜์ค‘์— ๋ถ„์„ํ•  ๋•Œ ์—„์ฒญ ํŽธํ•˜๊ฒ ์ฃ ?
  2. ๋กœ๊ทธ ๋ ˆ๋ฒจ ์„ค์ •:
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Debug()
        .WriteTo.Console()
        .CreateLogger();
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Debug ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋กœ๊ทธ๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด์š”.
  3. ๋กœ๊ทธ ์ธ๋ฆฌ์น˜๋จผํŠธ:
    Log.Logger = new LoggerConfiguration()
        .Enrich.WithThreadId()
        .Enrich.WithEnvironmentUserName()
        .WriteTo.Console()
        .CreateLogger();
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจ๋“  ๋กœ๊ทธ์— ์Šค๋ ˆ๋“œ ID์™€ ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋ผ์š”.

์™€์šฐ! Serilog ์ •๋ง ๋Œ€๋‹จํ•˜์ฃ ? ๐Ÿ˜ ๊ทผ๋ฐ ์ž ๊น, ์ด๋ ‡๊ฒŒ ์ข‹์€ ๊ฑธ ์–ด๋””์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋ƒ๊ณ ์š”? ์žฌ๋Šฅ๋„ท์—์„œ Serilog ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ์‹ค์ œ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์ด ์žˆ๋Š” ๋ถ„๋“ค์—๊ฒŒ ๋ฐฐ์šฐ๋ฉด ๋” ๋นจ๋ฆฌ ๋งˆ์Šคํ„ฐํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

Serilog์˜ ์ฃผ์š” ๊ธฐ๋Šฅ Serilog ๊ตฌ์กฐํ™”๋œ ๋กœ๊น… ๋‹ค์–‘ํ•œ ์‹ฑํฌ ํ™•์žฅ์„ฑ ์„ฑ๋Šฅ ์ตœ์ ํ™”

์ž, ์ด์ œ Serilog์— ๋Œ€ํ•ด ๊ฝค ๋งŽ์ด ์•Œ๊ฒŒ ๋˜์…จ์ฃ ? ๊ทผ๋ฐ ์ด๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹ˆ์—์š”! Serilog๋Š” ์ •๋ง ๊นŠ์ด ํŒŒ๊ณ ๋“ค๋ฉด ๋“ค์ˆ˜๋ก ๋” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ์ˆจ์–ด์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ ํ…œํ”Œ๋ฆฟ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๊ฑฐ๋‚˜, ๋กœ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ฃ . ์‹ฌ์ง€์–ด ์ž์‹ ๋งŒ์˜ ์‹ฑํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์–ด์š”! ๐Ÿค“

ํ•˜์ง€๋งŒ ์ž ๊น! Serilog๋งŒ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ์ž–์•„์š”? ์ด์ œ NLog๋ฅผ ์‚ดํŽด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. NLog๋Š” ์–ด๋–ค ํŠน์ง•์ด ์žˆ๊ณ , Serilog์™€๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ์š”? ๋‹ค์Œ ์„น์…˜์—์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•ด์š”! ๐Ÿš€

๐ŸŒณ NLog: ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ์˜ ๋Œ€๋ช…์‚ฌ

์ž, ์ด์ œ NLog ์ฐจ๋ก€์˜ˆ์š”! NLog๋Š” Serilog๋งŒํผ์ด๋‚˜ ์œ ๋ช…ํ•œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์ฃ . ์˜คํžˆ๋ ค ๋” ์˜ค๋ž˜๋œ ์—ญ์‚ฌ๋ฅผ ์ž๋ž‘ํ•œ๋‹ต๋‹ˆ๋‹ค. ๊ทธ๋งŒํผ ์•ˆ์ •์„ฑ์ด ๊ฒ€์ฆ๋˜์—ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ๐Ÿ˜Ž

๐Ÿš€ NLog์˜ ํŠน์ง•

  • ๋†’์€ ์„ฑ๋Šฅ: NLog๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋งŽ์€ ๊ณต์„ ๋“ค์˜€์–ด์š”. ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ๋น ๋ฅธ ์†๋„๋ฅผ ์ž๋ž‘ํ•˜์ฃ .
  • ์œ ์—ฐํ•œ ์„ค์ •: XML ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด ๋กœ๊น… ๋™์ž‘์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋‹ค์–‘ํ•œ ํƒ€๊ฒŸ ์ง€์›: ํŒŒ์ผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์ด๋ฉ”์ผ ๋“ฑ ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ๋Œ€์ƒ์„ ์ง€์›ํ•ด์š”.
  • ๋ ˆ์ด์•„์›ƒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•: ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์˜ ํ˜•์‹์„ ์ž์œ ๋กญ๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์–ด์š”.

NLog๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์ 

  • ๐Ÿ“ˆ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค˜์š”.
  • ๐Ÿ”ง XML ์„ค์ •์œผ๋กœ ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์š”.
  • ๐ŸŽจ ๋กœ๊ทธ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ์ž์œ ๋กญ๊ฒŒ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์–ด์š”.
  • ๐Ÿ† ์˜ค๋žœ ์—ญ์‚ฌ๋กœ ๊ฒ€์ฆ๋œ ์•ˆ์ •์„ฑ์„ ์ž๋ž‘ํ•ด์š”.

๐Ÿ›  NLog ์„ค์น˜ํ•˜๊ธฐ

NLog๋„ NuGet ํŒจํ‚ค์ง€๋กœ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด์š”. Visual Studio์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž ์ฝ˜์†”์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:

Install-Package NLog
Install-Package NLog.Config

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด NLog ์ฝ”์–ด์™€ ์„ค์ • ํŒŒ์ผ์ด ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€๋ผ์š”. ํŽธ๋ฆฌํ•˜์ฃ ? ๐Ÿ˜‰

๐ŸŽจ NLog ๊ธฐ๋ณธ ์„ค์ •

NLog์˜ ๊ธฐ๋ณธ ์„ค์ •์€ XML ํŒŒ์ผ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ ธ์š”. ํ”„๋กœ์ ํŠธ์— 'NLog.config' ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ณด์„ธ์š”:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <targets>
    <target name="logfile" xsi:type="File" fileName="file.txt" />
    <target name="logconsole" xsi:type="Console" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logconsole" />
    <logger name="*" minlevel="Debug" writeTo="logfile" />
  </rules>
</nlog>

์ด ์„ค์ •์€ Info ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋กœ๊ทธ๋Š” ์ฝ˜์†”์—, Debug ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋กœ๊ทธ๋Š” ํŒŒ์ผ์— ์ €์žฅํ•˜๋ผ๋Š” ์˜๋ฏธ์˜ˆ์š”.

๊ทธ๋ฆฌ๊ณ  C# ์ฝ”๋“œ์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

using NLog;

private static Logger logger = LogManager.GetCurrentClassLogger();

logger.Info("Hello, NLog!");
logger.Error("Oops, something went wrong!");

๊ฐ„๋‹จํ•˜์ฃ ? ๐Ÿ˜„

๐Ÿš€ NLog ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

NLog๋„ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด ํ•œ๊ฐ€๋“์ด์—์š”. ๋ช‡ ๊ฐ€์ง€ ์‚ดํŽด๋ณผ๊นŒ์š”?

  1. ์กฐ๊ฑด๋ถ€ ๋กœ๊น…:
    <rules>
      <logger name="*" minlevel="Info" writeTo="logfile">
        <filters>
          <when condition="contains('${message}','password')" action="Ignore" />
        </filters>
      </logger>
    </rules>
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด 'password'๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋œ ๋กœ๊ทธ๋Š” ๋ฌด์‹œํ•ด์š”. ๋ณด์•ˆ์— ์ข‹๊ฒ ์ฃ ?
  2. ๋กœ๊ทธ ๋ ˆ์ด์•„์›ƒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•:
    <target name="logfile" xsi:type="File" fileName="file.txt">
      <layout xsi:type="JsonLayout">
        <attribute name="time" layout="${longdate}" />
        <attribute name="level" layout="${level:upperCase=true}"/>
        <attribute name="message" layout="${message}" />
      </layout>
    </target>
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JSON ํ˜•์‹์œผ๋กœ ๋กœ๊ทธ๊ฐ€ ์ €์žฅ๋ผ์š”. Serilog์ฒ˜๋Ÿผ ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…์ด ๊ฐ€๋Šฅํ•˜์ฃ !
  3. ๋น„๋™๊ธฐ ๋กœ๊น…:
    <target name="asyncFile" xsi:type="AsyncWrapper">
      <target name="logfile" xsi:type="File" fileName="file.txt" />
    </target>
    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋น„๋™๊ธฐ๋กœ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•ด์„œ ์„ฑ๋Šฅ์ด ๋” ์ข‹์•„์ ธ์š”.

์–ด๋•Œ์š”? NLog๋„ ๋งŒ๋งŒ์น˜ ์•Š์ฃ ? ๐Ÿ˜Ž ์‚ฌ์‹ค NLog์™€ Serilog ๋ชจ๋‘ ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์˜ˆ์š”. ์–ด๋–ค ๊ฑธ ์„ ํƒํ• ์ง€ ๊ณ ๋ฏผ๋œ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ์กฐ์–ธ์„ ๊ตฌํ•ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ์‹ค์ œ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ์กฐ์–ธ์€ ์ •๋ง ๊ฐ’์ง€๊ฑฐ๋“ ์š”!

NLog์˜ ์ฃผ์š” ๊ธฐ๋Šฅ NLog ๋†’์€ ์„ฑ๋Šฅ ์œ ์—ฐํ•œ ์„ค์ • ๋‹ค์–‘ํ•œ ํƒ€๊ฒŸ ๋ ˆ์ด์•„์›ƒ ์ปค์Šคํ…€

์ž, ์ด์ œ NLog์— ๋Œ€ํ•ด์„œ๋„ ๊ฝค ๋งŽ์ด ์•Œ๊ฒŒ ๋˜์…จ์ฃ ? NLog๋Š” ์ •๋ง ๊นŠ์ด ํŒŒ๊ณ ๋“ค๋ฉด ๋“ค์ˆ˜๋ก ๋” ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ์ˆจ์–ด์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜, ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ฃ . ์‹ฌ์ง€์–ด ์ž์‹ ๋งŒ์˜ ๋กœ๊ทธ ํƒ€๊ฒŸ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์–ด์š”! ๐Ÿค“

์ž, ์ด์ œ Serilog์™€ NLog ๋ชจ๋‘ ์‚ดํŽด๋ดค์–ด์š”. ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋‘ ์ •๋ง ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•˜์ฃ ? ๊ทธ๋Ÿผ ์ด์ œ ์–ด๋–ค ๊ฑธ ์„ ํƒํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ๋˜์‹œ์ฃ ? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ๋‹ค์Œ ์„น์…˜์—์„œ Serilog์™€ NLog๋ฅผ ์ง์ ‘ ๋น„๊ตํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋” ์ ํ•ฉํ•œ์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•ด์š”! ๐Ÿš€

๐ŸฅŠ Serilog vs NLog: ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ ๋Œ€๊ฒฉ๋Œ!

์ž, ์ด์ œ ์ง„์งœ ํ•ต์‹ฌ์ด์—์š”! Serilog์™€ NLog, ์–ด๋–ค ๊ฒŒ ๋” ์ข‹์„๊นŒ์š”? ์‚ฌ์‹ค ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€ "์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค"์˜ˆ์š”. ใ…‹ใ…‹ ๋„ค, ๊ณ„์†ํ•ด์„œ Serilog์™€ NLog์˜ ๋น„๊ต๋ฅผ ์ด์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‘ ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ์–ด์š”. ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋” ์ ํ•ฉํ•œ์ง€ ์ž์„ธํžˆ ๋น„๊ตํ•ด๋ณผ๊ฒŒ์š”! ๐Ÿ•ต๏ธโ€โ™‚๏ธ

๐Ÿ† ์„ฑ๋Šฅ ๋น„๊ต

  • Serilog: ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์–ด์š”. JSON ํ˜•์‹์˜ ๋กœ๊ทธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ฃ .
  • NLog: ์ „ํ†ต์ ์ธ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ๋กœ๊น…์—์„œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค˜์š”. ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์•ˆ์ •์ ์ด์—์š”.

์Šน์ž: ๋น„๊ฒผ์–ด์š”! ์‚ฌ์šฉ ํŒจํ„ด์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, ๋‘˜ ๋‹ค ์ถฉ๋ถ„ํžˆ ๋น ๋ฅด๋‹ต๋‹ˆ๋‹ค.

๐Ÿ›  ์„ค์ •์˜ ์šฉ์ด์„ฑ

  • Serilog: ์ฝ”๋“œ ๊ธฐ๋ฐ˜ ์„ค์ •์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด์—์š”. ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜๊ธฐ ์ข‹์ฃ .
  • NLog: XML ๊ธฐ๋ฐ˜ ์„ค์ •์œผ๋กœ ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์š”. ํ•˜์ง€๋งŒ ์ดˆ๋ณด์ž์—๊ฒ ์ข€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์–ด์š”.

์Šน์ž: Serilog! ์‹œ์ž‘ํ•˜๊ธฐ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐ŸŽจ ์œ ์—ฐ์„ฑ

  • Serilog: ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…๊ณผ ๋‹ค์–‘ํ•œ ์‹ฑํฌ๋ฅผ ์ง€์›ํ•ด์š”. ํ™•์žฅ์„ฑ๋„ ๋›ฐ์–ด๋‚˜์ฃ .
  • NLog: ๋ ˆ์ด์•„์›ƒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•๊ณผ ์กฐ๊ฑด๋ถ€ ๋กœ๊น… ๋“ฑ ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์š”.

์Šน์ž: ๋น„๊ฒผ์–ด์š”! ๋‘˜ ๋‹ค ๊ฐ์ž์˜ ๋ฐฉ์‹์œผ๋กœ ์œ ์—ฐํ•ด์š”.

๐Ÿ“š ๋ฌธ์„œํ™” ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ

  • Serilog: ์ตœ๊ทผ์— ์ธ๊ธฐ๊ฐ€ ๋†’์•„์ ธ ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ’๋ถ€ํ•œ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”.
  • NLog: ์˜ค๋žœ ์—ญ์‚ฌ๋กœ ์•ˆ์ •์ ์ธ ๋ฌธ์„œ์™€ ํฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์–ด์š”.

์Šน์ž: ๋น„๊ฒผ์–ด์š”! ๋‘˜ ๋‹ค ์ถฉ๋ถ„ํ•œ ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿค” ์–ด๋–ค ๊ฑธ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ์š”?

  • ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด โ†’ Serilog
  • ์„ธ๋ฐ€ํ•œ ์„ค์ • ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด โ†’ NLog
  • ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด โ†’ Serilog
  • ๋Œ€๊ทœ๋ชจ ๋ ˆ๊ฑฐ์‹œ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด โ†’ NLog

๊ฒฐ๊ตญ, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๊ฐœ์ธ ์ทจํ–ฅ์— ๋”ฐ๋ผ ์„ ํƒํ•˜์‹œ๋ฉด ๋ผ์š”. ๋‘˜ ๋‹ค ํ›Œ๋ฅญํ•œ ๋„๊ตฌ๋‹ˆ๊นŒ์š”! ๐Ÿ˜‰

๊ทธ๋ฆฌ๊ณ  ์žŠ์ง€ ๋งˆ์„ธ์š”, ์žฌ๋Šฅ๋„ท์—์„œ๋Š” ์ด๋Ÿฐ ๊ธฐ์ˆ ์ ์ธ ๊ฒฐ์ •์„ ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š” ์ „๋ฌธ๊ฐ€๋“ค์ด ์žˆ์–ด์š”. ์‹ค์ œ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ์กฐ์–ธ์€ ์ •๋ง ๊ฐ’์ง€๊ฑฐ๋“ ์š”!

Serilog vs NLog Serilog NLog VS ๊ตฌ์กฐํ™”๋œ ๋กœ๊น… ์„ธ๋ฐ€ํ•œ ์ œ์–ด

์ž, ์ด์ œ Serilog์™€ NLog์— ๋Œ€ํ•ด ๊ฝค ์ž์„ธํžˆ ์•Œ์•„๋ดค์–ด์š”. ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋‘ ๊ฐ์ž์˜ ์žฅ์ ์ด ์žˆ๊ณ , ์ƒํ™ฉ์— ๋”ฐ๋ผ ์„ ํƒํ•˜๋ฉด ๋ผ์š”. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ์—์š”! ๋กœ๊น…์€ ๋‹จ์ˆœํžˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚˜์ง€ ์•Š์•„์š”. ํšจ๊ณผ์ ์ธ ๋กœ๊น… ์ „๋žต์„ ์„ธ์šฐ๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ฃ . ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋กœ๊น… ๋ชจ๋ฒ” ์‚ฌ๋ก€์™€ ํŒ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๐Ÿš€

๐ŸŒŸ ๋กœ๊น… ๋ชจ๋ฒ” ์‚ฌ๋ก€์™€ ๊ฟ€ํŒ

์ž, ์ด์ œ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ–ˆ๋‹ค๊ณ  ์น˜์ฃ . ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋กœ๊น…์„ ์ œ๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์—ฌ๊ธฐ ๋ช‡ ๊ฐ€์ง€ ๊ฟ€ํŒ์„ ๋ชจ์•„๋ดค์–ด์š”! ๐Ÿฏ

1. ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์„ธ์š”

  • Trace: ๊ฐœ๋ฐœ ์ค‘ ์ผ์‹œ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋งค์šฐ ์ƒ์„ธํ•œ ์ •๋ณด
  • Debug: ๋””๋ฒ„๊น…์— ์œ ์šฉํ•œ ์ •๋ณด
  • Info: ์ผ๋ฐ˜์ ์ธ ์ž‘๋™ ์ •๋ณด
  • Warn: ์ž ์žฌ์ ์ธ ๋ฌธ์ œ ์ƒํ™ฉ
  • Error: ์ฒ˜๋ฆฌ๋œ ์˜ค๋ฅ˜
  • Fatal: ์‹œ์Šคํ…œ ์ค‘๋‹จ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜

๐Ÿ’ก Tip: ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฃผ๋กœ Info ๋ ˆ๋ฒจ ์ด์ƒ๋งŒ ๋กœ๊น…ํ•˜๊ณ , ํ•„์š”ํ•  ๋•Œ๋งŒ Debug ๋ ˆ๋ฒจ์„ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.

2. ๊ตฌ์กฐํ™”๋œ ๋กœ๊น…์„ ํ™œ์šฉํ•˜์„ธ์š”

๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด ๋Œ€์‹  ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•˜๋ฉด ๋‚˜์ค‘์— ๋ถ„์„ํ•˜๊ธฐ ํ›จ์”ฌ ์‰ฌ์›Œ์š”.

// ์ข‹์ง€ ์•Š์€ ์˜ˆ
logger.Info("User John logged in from 192.168.1.1");

// ์ข‹์€ ์˜ˆ
logger.Info("User logged in {@UserInfo}", new { Name = "John", IP = "192.168.1.1" });

3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์‹œ ์ƒ์„ธ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•˜์„ธ์š”

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์ •๋ณด๋ฅผ ๋กœ๊น…ํ•˜์„ธ์š”. ์Šคํƒ ํŠธ๋ ˆ์ด์Šค, ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€, ๊ด€๋ จ ๋ฐ์ดํ„ฐ ๋“ฑ์„ ํฌํ•จํ•˜๋ฉด ์ข‹์•„์š”.

try
{
    // ์–ด๋–ค ์ž‘์—…
}
catch (Exception ex)
{
    logger.Error(ex, "์ž‘์—… ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ. ๊ด€๋ จ ๋ฐ์ดํ„ฐ: {@Data}", relevantData);
}

4. ์„ฑ๋Šฅ์— ์ฃผ์˜ํ•˜์„ธ์š”

๋กœ๊น…๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์š”. ํŠนํžˆ I/O ์ž‘์—…์ด ๋งŽ์ด ์ผ์–ด๋‚˜์ฃ . ๋น„๋™๊ธฐ ๋กœ๊น…์„ ์‚ฌ์šฉํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๋กœ๊น…์€ ํ”ผํ•˜์„ธ์š”.

// ์ข‹์ง€ ์•Š์€ ์˜ˆ
logger.Debug($"๋ณต์žกํ•œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ: {ExpensiveCalculation()}");

// ์ข‹์€ ์˜ˆ
if (logger.IsEnabled(LogLevel.Debug))
{
    logger.Debug("๋ณต์žกํ•œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ: {Result}", ExpensiveCalculation());
}

5. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์กฐ์‹ฌํ•˜์„ธ์š”

ํŒจ์Šค์›Œ๋“œ, ์‹ ์šฉ์นด๋“œ ๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ ˆ๋Œ€ ๋กœ๊ทธ์— ๋‚จ๊ธฐ์ง€ ๋งˆ์„ธ์š”! ํ•„์š”ํ•˜๋‹ค๋ฉด ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•ด์š”.

// ์ข‹์ง€ ์•Š์€ ์˜ˆ
logger.Info($"User {username} logged in with password {password}");

// ์ข‹์€ ์˜ˆ
logger.Info("User {Username} logged in", username);

6. ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”

๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”. ์š”์ฒญ ID, ์„ธ์…˜ ID, ์‚ฌ์šฉ์ž ID ๋“ฑ์˜ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๋กœ๊น…ํ•˜๋ฉด ์ข‹์•„์š”.

using (logger.BeginScope("RequestId: {RequestId}", Guid.NewGuid()))
{
    logger.Info("Request started");
    // ์ž‘์—… ์ˆ˜ํ–‰
    logger.Info("Request completed");
}

๐Ÿ’ก Pro Tip

๋กœ๊น…์€ ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ถ€ํ„ฐ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”. ๋‚˜์ค‘์— ๋กœ๊ทธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ "์•„, ์ด๊ฑธ ๋กœ๊น…ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ!"๋ผ๊ณ  ํ›„ํšŒํ•˜์ง€ ์•Š๋„๋ก ํ•ด์š”. ํ•˜์ง€๋งŒ ๋™์‹œ์— ๋„ˆ๋ฌด ๋งŽ์€ ๋กœ๊ทธ๋„ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”. ๊ท ํ˜•์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

์ด๋Ÿฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋“ค์„ ๋”ฐ๋ฅด๋ฉด ๋กœ๊น…์˜ ํ’ˆ์งˆ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ๊ฑฐ์˜ˆ์š”. ํ•˜์ง€๋งŒ ์ด๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹ˆ์—์š”! ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋” ๋งŽ์€ ๋…ธํ•˜์šฐ๊ฐ€ ํ•„์š”ํ•˜์ฃ . ์žฌ๋Šฅ๋„ท์—์„œ ๋กœ๊น… ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„ ์‹ค์ œ ๊ฒฝํ—˜์„ ๋“ค์–ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ๊ทธ๋“ค์˜ ๊ฒฝํ—˜์—์„œ ๋‚˜์˜จ ํŒ์€ ์ •๋ง ๊ฐ’์ง€๊ฑฐ๋“ ์š”! ๐Ÿ˜‰

๋กœ๊น… ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋กœ๊น… ๋ชจ๋ฒ” ์‚ฌ๋ก€ ์ ์ ˆํ•œ ๋ ˆ๋ฒจ ๊ตฌ์กฐํ™”๋œ ๋กœ๊น… ์„ฑ๋Šฅ ๊ณ ๋ ค ๋ณด์•ˆ ์ฃผ์˜

์ž, ์ด์ œ ๋กœ๊น…์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์ด ์•Œ๊ฒŒ ๋˜์…จ์ฃ ? Serilog์™€ NLog์˜ ํŠน์ง•, ์žฅ๋‹จ์ , ๊ทธ๋ฆฌ๊ณ  ํšจ๊ณผ์ ์ธ ๋กœ๊น… ๋ฐฉ๋ฒ•๊นŒ์ง€! ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋กœ๊น… ๋งˆ์Šคํ„ฐ๋กœ ๊ฑฐ๋“ญ๋‚  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์–ด์š”. ๐ŸŽ“

ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”, ์ด๋ก ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ด์š”. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๋ฉด์„œ ๊ฒฝํ—˜์„ ์Œ“๋Š” ๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๊ณผ ํŠธ๋ Œ๋“œ๋„ ๊ณ„์† ๋‚˜์˜ค๊ณ  ์žˆ์œผ๋‹ˆ, ๊พธ์ค€ํžˆ ๊ณต๋ถ€ํ•ด์•ผ ํ•ด์š”. ๋กœ๊น…์˜ ์„ธ๊ณ„๋Š” ๋์ด ์—†๋‹ต๋‹ˆ๋‹ค! ๐Ÿš€

๋งˆ์ง€๋ง‰์œผ๋กœ, ์—ฌ๋Ÿฌ๋ถ„์˜ ๋กœ๊น… ์—ฌ์ •์— ํ–‰์šด์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ ํƒํ•˜๋“ , ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋กœ๊น…์„ ํ•˜๋“ , ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋งž๋Š” ์ตœ์ ์˜ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฑฐ์˜ˆ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช