Skip to content

Logging ko KR

ArchiBot edited this page Aug 9, 2026 · 37 revisions

๋กœ๊ทธ

ASF๋Š” ๋Ÿฐํƒ€์ž„ ์ค‘ ์‚ฌ์šฉ๋  ์‚ฌ์šฉ์ž ์ง€์ • ์ปค์Šคํ…€ ๋กœ๊น… ๋ชจ๋“ˆ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””๋ ‰ํ† ๋ฆฌ์— NLog.config๋ผ๋Š” ํŠน์ˆ˜ ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ•˜๋ฉด ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NLog์˜ ์ „์ฒด ๋ฌธ์„œ๋Š” **NLog ์œ„ํ‚ค**์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด์— ๋”ํ•ด ์—ฌ๊ธฐ์„œ๋„ ์œ ์šฉํ•œ ์˜ˆ์‹œ๋“ค์„ ํ•จ๊ป˜ ์ œ๊ณตํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.


๊ธฐ๋ณธ ๋กœ๊ทธ

๊ธฐ๋ณธ์ ์œผ๋กœ ASF๋Š” ColoredConsole(ํ‘œ์ค€ ์ถœ๋ ฅ)๊ณผ File์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. File ๋กœ๊น…์—๋Š” ํ”„๋กœ๊ทธ๋žจ ๋””๋ ‰ํ† ๋ฆฌ์˜ log.txt ํŒŒ์ผ๊ณผ, ๋ณด๊ด€ ๋ชฉ์ ์˜ logs ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ…€ NLog ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ASF ์„ค์ •์ด ์ž๋™์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž์˜ ์„ค์ •์ด ๊ธฐ๋ณธ ASF ๋กœ๊น…์„ ์™„์ „ํžˆ ๋ฎ์–ด์“ฐ๋ฏ€๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ €ํฌ์˜ ColoredConsole ํƒ€๊ฒŸ์„ ๊ณ„์† ์œ ์ง€ํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด ์ง์ ‘ ์ •์˜ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€ ๋กœ๊น… ํƒ€๊ฒŸ์„ ๋”ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ธฐ๋ณธ ํƒ€๊ฒŸ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ASF ๋กœ๊น…์„ ์•„๋ฌด๋Ÿฐ ์ˆ˜์ • ์—†์ด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, ๋ณ„๋„๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์‹ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - ์ปค์Šคํ…€ NLog.config์— ์ •์˜ํ•˜์‹ค ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๊ธฐ๋ณธ ASF ๋กœ๊น…๊ณผ ๋™๋“ฑํ•œ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}|${processname}-${processid}|${level:uppercase=true}|${logger}|${message}${onexception:inner= ${exception:format=toString,Data}}" />
    <target xsi:type="File" name="File" archiveFileName="${currentdir:cached=true}/logs/log.txt" archiveOldFileOnStartup="true" archiveSuffixFormat=".{1:yyyyMMdd-HHmmss}" fileName="${currentdir:cached=true}/log.txt" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}|${processname}-${processid}|${level:uppercase=true}|${logger}|${message}${onexception:inner= ${exception:format=toString,Data}}" maxArchiveFiles="10" />

    <!-- Below becomes active when ASF's IPC interface is started -->
    <target type="History" name="History" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}|${processname}-${processid}|${level:uppercase=true}|${logger}|${message}${onexception:inner= ${exception:format=toString,Data}}" maxCount="20" />
  </targets>

  <rules>
    <!-- The following entries specify ASP.NET (IPC) logging, we declare those so our last Debug catch-all doesn't include ASP.NET logs by default -->
    <logger name="Microsoft.Hosting.Lifetime" finalMinLevel="Info" writeTo="ColoredConsole" />
    <logger name="Microsoft.*" finalMinLevel="Warn" writeTo="ColoredConsole" />
    <logger name="System.*" finalMinLevel="Warn" writeTo="ColoredConsole" />

    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />

    <!-- The following entries specify ASP.NET (IPC) logging, we declare those so our last Debug catch-all doesn't include ASP.NET logs by default -->
    <logger name="Microsoft.Hosting.Lifetime" finalMinLevel="Info" writeTo="File" />
    <logger name="Microsoft.*" finalMinLevel="Warn" writeTo="File" />
    <logger name="System.*" finalMinLevel="Warn" writeTo="File" />

    <logger name="*" minlevel="Debug" writeTo="File" />

    <!-- Below becomes active when ASF's IPC interface is enabled -->
    <!-- The following entries specify ASP.NET (IPC) logging, we declare those so our last Debug catch-all doesn't include ASP.NET logs by default -->
    <logger name="Microsoft.Hosting.Lifetime" finalMinLevel="Info" writeTo="History" />
    <logger name="Microsoft.*" finalMinLevel="Warn" writeTo="History" />
    <logger name="System.*" finalMinLevel="Warn" writeTo="History" />

    <logger name="*" minlevel="Debug" writeTo="History" />
  </rules>
</nlog>

ASF integration

ASF๋Š” NLog์™€์˜ ํ†ตํ•ฉ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์ฝ”๋“œ ๊ธฐ๋ฒ•๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด, ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

NLog ์ „์šฉ ${logger} ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ๋ฉ”์‹œ์ง€์˜ ์ถœ์ฒ˜๋ฅผ ๊ตฌ๋ถ„ํ•ด์ค๋‹ˆ๋‹ค - ์ด๋Š” ์‚ฌ์šฉ์ž์˜ ๋ด‡ ์ค‘ ํ•˜๋‚˜์˜ BotName์ด๊ฑฐ๋‚˜, ๋ฉ”์‹œ์ง€๊ฐ€ ASF ํ”„๋กœ์„ธ์Šค์—์„œ ์ง์ ‘ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด ASF๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์„ ํ†ตํ•ด, ๋กœ๊ฑฐ์˜ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์ „์ฒด ๋ฉ”์‹œ์ง€ ๋Œ€์‹  ํŠน์ • ๋ด‡(๋“ค)์ด๋‚˜ ASF ํ”„๋กœ์„ธ์Šค(๋‹จ๋…)์™€ ๊ด€๋ จ๋œ ๋ฉ”์‹œ์ง€๋งŒ ์†์‰ฝ๊ฒŒ ํฌ์ฐฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ASF๋Š” ์‚ฌ์šฉ์ž/์ฑ„ํŒ… ๋ฉ”์‹œ์ง€์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ Trace ๋กœ๊น… ๋ ˆ๋ฒจ์—์„œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ASF ๋กœ๊น…์€ Debug ๋ ˆ๋ฒจ ์ด์ƒ๋งŒ ๊ธฐ๋กํ•˜๋ฉฐ, ์ด๋Š” ๋Œ€๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถˆํ•„์š”ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๊ณ , ๋” ์ค‘์š”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋œ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ๋‹ค๋งŒ Trace ๋กœ๊น… ๋ ˆ๋ฒจ์„ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ด ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ด€์‹ฌ ์žˆ๋Š” ํŠน์ • ์ด๋ฒคํŠธ์™€ ํ•จ๊ป˜, ์›ํ•˜๋Š” ๋ด‡ ํ•˜๋‚˜๋งŒ ๋กœ๊น…ํ•˜๋„๋ก ์กฐํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ ๋”์šฑ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ASF๋Š” grep๊ณผ ๊ฐ™์€ ์ œ3์ž ๋„๊ตฌ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ˆ˜๋™์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๋Œ€์‹ , ์›ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋งŒ ๋กœ๊ทธ๋กœ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋„๋ก ์ตœ๋Œ€ํ•œ ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์— ์„ค๋ช…๋œ ๋Œ€๋กœ NLog๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด, ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ์ปค์Šคํ…€ ํƒ€๊ฒŸ์„ ํฌํ•จํ•˜์—ฌ ๋งค์šฐ ๋ณต์žกํ•œ ๋กœ๊น… ๊ทœ์น™๊นŒ์ง€๋„ ์ง€์ •ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒ„์ „ ๊ด€๋ฆฌ์™€ ๊ด€๋ จํ•˜์—ฌ - ASF๋Š” ASF ๋ฆด๋ฆฌ์Šค ์‹œ์  ๊ธฐ์ค€์œผ๋กœ **NuGet**์—์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ตœ์‹  ๋ฒ„์ „์˜ NLog๋ฅผ ํ•ญ์ƒ ํ•จ๊ป˜ ๋ฐฐํฌํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. NLog ์œ„ํ‚ค์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์ด๋“  ASF์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค - ๋‹ค๋งŒ ์ตœ์‹  ๋ฒ„์ „์˜ ASF๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹ ์ง€๋งŒ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

ASF ํ†ตํ•ฉ์˜ ์ผํ™˜์œผ๋กœ, ASF๋Š” ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  ์ถ”๊ฐ€์ ์ธ ASF ์ „์šฉ NLog ๋กœ๊น… ํƒ€๊ฒŸ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.


์˜ˆ์ œ

์•„๋ž˜์˜ ์˜ˆ์‹œ๋“ค์€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋กœ๊น…์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์‹œ์ž‘์œผ๋กœ ColoredConsole ํƒ€๊ฒŸ๋งŒ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €ํฌ์˜ ์ดˆ๊ธฐ NLog.config๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
  </rules>
</nlog>

์œ„ ์„ค์ •์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค - ์ €ํฌ๋Š” ColoredConsole์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ๋กœ๊น… ํƒ€๊ฒŸ์„ ์ •์˜ํ•œ ๋‹ค์Œ, Debug ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋ชจ๋“  ๋กœ๊ฑฐ(*)๋ฅผ ์•ž์„œ ์ •์˜ํ•œ ColoredConsole ํƒ€๊ฒŸ์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ง€๊ธˆ ์œ„์˜ NLog.config๋กœ ASF๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด, ColoredConsole ํƒ€๊ฒŸ๋งŒ ํ™œ์„ฑํ™”๋˜๋ฉฐ, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ASF NLog ์„ค์ •๊ณผ ๊ด€๊ณ„์—†์ด ASF๋Š” File์— ๊ธฐ๋กํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

layout๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์†์„ฑ์„ ๋ณ„๋„๋กœ ์ •์˜ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋ณธ ๋‚ด์žฅ๊ฐ’์ธ ${longdate}|${level:uppercase=true}|${logger}|${message}๋กœ ์ดˆ๊ธฐํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”์‹œ์ง€๋งŒ ๊ธฐ๋กํ•˜๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" layout="${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
  </rules>
</nlog>

์ด์ œ ASF๋ฅผ ์‹คํ–‰ํ•˜์‹œ๋ฉด, ๋‚ ์งœ, ๋ ˆ๋ฒจ, ๋กœ๊ฑฐ ์ด๋ฆ„์ด ์‚ฌ๋ผ์ง€๊ณ  Function() Message ํ˜•์‹์˜ ASF ๋ฉ”์‹œ์ง€๋งŒ ๋‚จ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์„ค์ •์„ ์ˆ˜์ •ํ•˜์—ฌ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํƒ€๊ฒŸ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ColoredConsole๊ณผ **File**์— ๋™์‹œ์— ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•ด๋ด…์‹œ๋‹ค.

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
    <target xsi:type="File" name="File" fileName="${currentdir:cached=true}/NLog.txt" deleteOldFileOnStartup="true" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
    <logger name="*" minlevel="Debug" writeTo="File" />
  </rules>
</nlog>

์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ColoredConsole๊ณผ File์— ๋กœ๊ทธ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • fileName์ด๋‚˜ ์ถ”๊ฐ€ ์˜ต์…˜๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ˆˆ์น˜์ฑ„์…จ๋‚˜์š”?

๋งˆ์ง€๋ง‰์œผ๋กœ, ASF๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ˜„์žฌ ์ƒํ™ฉ์„ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋กœ๊น…์˜ ์‹ฌ๊ฐ๋„(severity)๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„(Trace) File์— ๊ธฐ๋กํ•˜๋˜, ColoredConsole์—๋Š” Warning ์ด์ƒ์˜ **๋กœ๊ทธ ๋ ˆ๋ฒจ**๋งŒ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. rules๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
    <target xsi:type="File" name="File" fileName="${currentdir:cached=true}/NLog.txt" deleteOldFileOnStartup="true" />
  </targets>

  <rules>
    <logger name="*" minlevel="Warn" writeTo="ColoredConsole" />
    <logger name="*" minlevel="Trace" writeTo="File" />
  </rules>
</nlog>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์ด์ œ ์ €ํฌ์˜ ColoredConsole์€ ๊ฒฝ๊ณ (warning) ์ด์ƒ๋งŒ ํ‘œ์‹œํ•˜๊ณ , File์—๋Š” ์—ฌ์ „ํžˆ ๋ชจ๋“  ๊ฒƒ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Info ์ดํ•˜๋งŒ ๊ธฐ๋กํ•˜๋Š” ๋“ฑ, ์›ํ•˜๋Š” ๋Œ€๋กœ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•˜์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์กฐ๊ธˆ ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ LogBot์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๋ด‡์—์„œ ๋ฐœ์ƒํ•œ ๋ฉ”์‹œ์ง€๋งŒ ํŒŒ์ผ์— ๊ธฐ๋กํ•ด๋ด…์‹œ๋‹ค.

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
    <target xsi:type="File" name="LogBotFile" fileName="${currentdir:cached=true}/LogBot.txt" deleteOldFileOnStartup="true" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
    <logger name="LogBot" minlevel="Trace" writeTo="LogBotFile" />
  </rules>
</nlog>

์œ„์—์„œ ์‚ฌ์šฉํ•œ ASF ํ†ตํ•ฉ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ${logger} ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฉ”์‹œ์ง€์˜ ์ถœ์ฒ˜๋ฅผ ์†์‰ฝ๊ฒŒ ๊ตฌ๋ถ„ํ•œ ๋ฐฉ์‹์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ณ ๊ธ‰ ์‚ฌ์šฉ๋ฒ•

์œ„์˜ ์˜ˆ์‹œ๋“ค์€ ASF์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‚˜๋งŒ์˜ ๋กœ๊น… ๊ทœ์น™์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด์ง€ ๋ณด์—ฌ๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋น„๊ต์  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. NLog๋Š” ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ํ™œ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Database์— ๋กœ๊ทธ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ํƒ€๊ฒŸ, (์˜ค๋ž˜๋œ File ๋กœ๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€) ๋กœ๊ทธ ์ˆœํ™˜(rotation), ์ปค์Šคํ…€ Layout ์‚ฌ์šฉ, ์ž์‹ ๋งŒ์˜ <when> ๋กœ๊น… ํ•„ํ„ฐ ์„ ์–ธ ๋“ฑ ๋‹ค์–‘ํ•œ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜์‹œ๋Š” ๋Œ€๋กœ ASF ๋กœ๊น… ๋ชจ๋“ˆ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก, ์ด์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์˜ต์…˜์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ „์ฒด **NLog ๋ฌธ์„œ**๋ฅผ ๊ผญ ์ฝ์–ด๋ณด์‹œ๊ธธ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด๋ฉฐ, ASF ๋กœ๊น…์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š” ๊ฒƒ์ด ์ด๋ณด๋‹ค ๋” ์‰ฌ์šด ์ ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.


ํ•œ๊ณ„

ASF๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆด ๋•Œ, ColoredConsole์ด๋‚˜ Console ํƒ€๊ฒŸ์ด ํฌํ•จ๋œ ๋ชจ๋“  ๊ทœ์น™์„ ์ผ์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ASF๊ฐ€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ์—๋„ ๋‹ค๋ฅธ ํƒ€๊ฒŸ์— ๋Œ€ํ•œ ๋กœ๊น…์„ ๊ณ„์† ์œ ์ง€ํ•˜๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด, ์œ„ ์˜ˆ์‹œ์—์„œ ๋ณด์—ฌ๋“œ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ ํ•ด๋‹น ํƒ€๊ฒŸ๋“ค์„ ์ž์‹ ๋งŒ์˜ ๋ณ„๋„ ๊ทœ์น™์œผ๋กœ ์ •์˜ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ทœ์น™์˜ writeTo์— ์—ฌ๋Ÿฌ ํƒ€๊ฒŸ์„ ํ•จ๊ป˜ ๋„ฃ๋Š” ๊ฒƒ(์˜๋„์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜์‹œ๋ ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด)์€ ํ”ผํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ฝ˜์†” ํƒ€๊ฒŸ์„ ์ผ์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ฝ˜์†” ํ™”๋ฉด์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์น˜์ž…๋‹ˆ๋‹ค.


์ฑ„ํŒ… ๋กœ๊ทธ

ASF๋Š” ์ฑ„ํŒ… ๋กœ๊น…์— ๋Œ€ํ•œ ํ™•์žฅ ์ง€์›์„ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด, ์ˆ˜์‹ /๋ฐœ์‹ ๋œ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ Trace ๋กœ๊น… ๋ ˆ๋ฒจ์—์„œ ๊ธฐ๋กํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ด์™€ ๊ด€๋ จ๋œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ **์ด๋ฒคํŠธ ์†์„ฑ(event properties)**์œผ๋กœ๋„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด์ฐจํ”ผ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋ฅผ ๋ช…๋ น์–ด๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋กœ๊ทธ๋กœ ๊ธฐ๋กํ•˜๋Š” ๋ฐ ๋ณ„๋„์˜ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋Š” ์ถ”๊ฐ€์ ์ธ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ASF๋ฅผ ๋ณธ์ธ๋งŒ์˜ ๊ฐœ์ธ Steam ์ฑ„ํŒ… ์•„์นด์ด๋ธŒ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ).

์ด๋ฒคํŠธ ์†์„ฑ

์ด๋ฆ„ ์„ค๋ช…
Echo bool ํƒ€์ž…. ๋ฉ”์‹œ์ง€๊ฐ€ ์ €ํฌ ์ธก์—์„œ ์ˆ˜์‹ ์ž์—๊ฒŒ ๋ฐœ์‹ ๋˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” true๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” false๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
Message string ํƒ€์ž…. ์ด๋Š” ์‹ค์ œ๋กœ ๋ฐœ์‹ /์ˆ˜์‹ ๋œ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.
ChatGroupID ulong ํƒ€์ž…. ์ด๋Š” ๋ฐœ์‹ /์ˆ˜์‹  ๋ฉ”์‹œ์ง€๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน ์ฑ„ํŒ…์˜ ID์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์‹œ์ง€ ์ „์†ก์— ๊ทธ๋ฃน ์ฑ„ํŒ…์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” 0์ด ๋ฉ๋‹ˆ๋‹ค.
ChatID ulong ํƒ€์ž…. ์ด๋Š” ๋ฐœ์‹ /์ˆ˜์‹  ๋ฉ”์‹œ์ง€๊ฐ€ ์†ํ•œ ChatGroupID ์ฑ„๋„์˜ ID์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์‹œ์ง€ ์ „์†ก์— ๊ทธ๋ฃน ์ฑ„ํŒ…์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” 0์ด ๋ฉ๋‹ˆ๋‹ค.
SteamID ulong ํƒ€์ž…. ์ด๋Š” ๋ฐœ์‹ /์ˆ˜์‹  ๋ฉ”์‹œ์ง€์— ๊ด€๋ จ๋œ Steam ์‚ฌ์šฉ์ž์˜ ID์ž…๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€ ์ „์†ก์— ๊ด€์—ฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ(์˜ˆ: ์ €ํฌ๊ฐ€ ๊ทธ๋ฃน ์ฑ„ํŒ…์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ)์—๋Š” 0์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ

์ด ์˜ˆ์‹œ๋Š” ์œ„์—์„œ ๋‹ค๋ฃฌ ์ €ํฌ์˜ ColoredConsole ๊ธฐ๋ณธ ์˜ˆ์‹œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ดํ•ดํ•˜์‹œ๊ธฐ ์ „์—, ๋จผ์ € NLog ๋กœ๊น…์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ตํžˆ๊ธฐ ์œ„ํ•ด **์œ„ ๋‚ด์šฉ**์„ ๋จผ์ € ํ™•์ธํ•ด๋ณด์‹œ๊ธฐ๋ฅผ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
    <target xsi:type="File" name="ChatLogFile" fileName="${currentdir:cached=true}/logs/chat/${event-properties:item=ChatGroupID}-${event-properties:item=ChatID}${when:when='${event-properties:item=ChatGroupID}' == 0:inner=-${event-properties:item=SteamID}}.txt" layout="${date:format=yyyy-MM-dd HH\:mm\:ss} ${event-properties:item=Message} ${when:when='${event-properties:item=Echo}' == true:inner=-&gt;:else=&lt;-} ${event-properties:item=SteamID}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
    <logger name="MainAccount" level="Trace" writeTo="ChatLogFile">
      <filters defaultAction="Log">
        <when condition="not starts-with('${message}','OnIncoming') and not starts-with('${message}','SendMessage')" action="Ignore" />
      </filters>
    </logger>
  </rules>
</nlog>

์ €ํฌ๋Š” ๊ธฐ๋ณธ ColoredConsole ์˜ˆ์‹œ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ์ด๋ฅผ ํ•œ์ธต ๋” ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ €, ๊ทธ๋ฃน ์ฑ„๋„๊ณผ Steam ์‚ฌ์šฉ์ž๋ณ„๋กœ ์˜๊ตฌ์ ์ธ ์ฑ„ํŒ… ๋กœ๊ทธ ํŒŒ์ผ์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค - ์ด๋Š” ASF๊ฐ€ ์ €ํฌ์—๊ฒŒ ์„ธ๋ จ๋œ ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ถ”๊ฐ€ ์†์„ฑ ๋•๋ถ„์— ๊ฐ€๋Šฅํ•œ ์ผ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ๋‚ ์งœ, ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ, ๋ฐœ์‹ /์ˆ˜์‹  ์ •๋ณด, ๊ทธ๋ฆฌ๊ณ  Steam ์‚ฌ์šฉ์ž ์ž์ฒด๋งŒ์„ ๊ธฐ๋กํ•˜๋Š” ์ปค์Šคํ…€ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์ €ํฌ์˜ ์ฑ„ํŒ… ๋กœ๊น… ๊ทœ์น™์„ ์˜ค์ง Trace ๋ ˆ๋ฒจ์—์„œ๋งŒ, ์˜ค์ง MainAccount ๋ด‡์—์„œ๋งŒ, ๊ทธ๋ฆฌ๊ณ  ์ฑ„ํŒ… ๋กœ๊น…๊ณผ ๊ด€๋ จ๋œ ํ•จ์ˆ˜(๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ๋ฐ ์—์ฝ”๋ฅผ ์œ„ํ•œ OnIncoming*, ASF ๋ฉ”์‹œ์ง€ ๋ฐœ์‹ ์„ ์œ„ํ•œ SendMessage*)์—์„œ๋งŒ ํ™œ์„ฑํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์‹œ๋Š” **ArchiBot**๊ณผ ๋Œ€ํ™”ํ•  ๋•Œ logs/chat/0-0-76561198069026042.txt ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

2018-07-26 01:38:38 how are you doing? -> 76561198069026042
2018-07-26 01:38:38 I'm doing great, how about you? <- 76561198069026042

๋ฌผ๋ก  ์ด๋Š” ๋‹จ์ˆœํ•œ ์ž‘๋™ ์˜ˆ์‹œ์ผ ๋ฟ์ด์ง€๋งŒ, ์‹ค์šฉ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ๋ ˆ์ด์•„์›ƒ ํ™œ์šฉ ๊ธฐ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” ์ถ”๊ฐ€ ํ•„ํ„ฐ๋ง, ์‚ฌ์šฉ์ž ์ง€์ • ์ˆœ์„œ, ๊ฐœ์ธ ๋ ˆ์ด์•„์›ƒ, ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋งŒ ๊ธฐ๋กํ•˜๋Š” ๊ธฐ๋Šฅ ๋“ฑ ํ•„์š”์— ๋”ฐ๋ผ ์–ผ๋งˆ๋“ ์ง€ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ์‹œ

์ด ์˜ˆ์‹œ๋Š” SteamTarget์„ ์‚ฌ์šฉํ•ด ๋ฉ”์ธ ๋ด‡์˜ steamID(76561198006963719)๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉฐ, ์ด๋Š” archi๋ผ๋Š” ์ด๋ฆ„์˜ ๋ด‡์ด ๊ธฐ๋ถ€ ๊ฑฐ๋ž˜๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—๋Š” ๋˜ ๋‹ค๋ฅธ ๋ด‡์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์ž๊ธฐ ์ž์‹ ์—๊ฒŒ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target type="Steam" name="Steam" steamID="76561198006963719" />
  </targets>

  <rules>
    <logger name="archi" level="Trace" writeTo="Steam">
      <filters defaultAction="Ignore">
        <when condition="starts-with('${message}','ParseTrade() Accepted donation trade: ')" action="Log" />
      </filters>
    </logger>
  </rules>
</nlog>

ASF Target

์œ„์—์„œ ์„ค๋ช…ํ•œ ColoredConsole, File๊ณผ ๊ฐ™์€ ํ‘œ์ค€ NLog ๋กœ๊น… ๋Œ€์ƒ ์™ธ์—๋„, ์‚ฌ์šฉ์ž ์ง€์ • ASF ๋กœ๊น… ๋Œ€์ƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™„์ „์„ฑ์„ ์ตœ๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด, ASF Target์˜ ์ •์˜๋Š” NLog ๋ฌธ์„œ ๊ทœ์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.


SteamTarget

์ง์ž‘ํ•˜์…จ๊ฒ ์ง€๋งŒ, ์ด ๋Œ€์ƒ์€ ASF ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด Steam ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฃน ์ฑ„ํŒ… ๋˜๋Š” ๊ฐœ์ธ ์ฑ„ํŒ… ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€์˜ Steam ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„, ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋ด‡์˜ botName์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ASF์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.


๊ตฌ์„ฑ ๊ตฌ๋ฌธ

<targets>
  <target type="Steam"
          name="String"
          layout="Layout"
          chatGroupID="Ulong"
          steamID="Ulong"
          botName="Layout" />
</targets>

๊ตฌ์„ฑ ํŒŒ์ผ(Configuration File) ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด์„ธ์š”.


๋งค๊ฐœ๋ณ€์ˆ˜

์ผ๋ฐ˜ ์˜ต์…˜

name - ๋Œ€์ƒ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.


๋ ˆ์ด์•„์›ƒ ์˜ต์…˜

layout - ๋ Œ๋”๋ง๋  ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. Layout ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’: ${level:uppercase=true}|${logger}|${message}


SteamTarget ์˜ต์…˜

chatGroupID - 64๋น„ํŠธ long unsigned integer๋กœ ์„ ์–ธ๋œ ๊ทธ๋ฃน ์ฑ„ํŒ…์˜ ID์ž…๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•ญ๋ชฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ด๋ฉฐ, ์ด ๊ฒฝ์šฐ ๊ทธ๋ฃน ์ฑ„ํŒ… ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋˜๊ณ  ๋Œ€์‹  ๊ฐœ์ธ ์ฑ„ํŒ…์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ(0์ด ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ), ์•„๋ž˜์˜ steamID ์†์„ฑ์€ chatID๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๋ด‡์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ด chatGroupID ๋‚ด ์ฑ„๋„์˜ ID๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

steamID - 64๋น„ํŠธ long unsigned integer๋กœ ์„ ์–ธ๋œ ๋Œ€์ƒ Steam ์‚ฌ์šฉ์ž์˜ SteamID(์˜ˆ: SteamOwnerID) ๋˜๋Š” chatGroupID๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ ๋Œ€์ƒ chatID์ž…๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ด๋ฉฐ, ์ด ๊ฒฝ์šฐ ๋กœ๊น… ๋Œ€์ƒ์ด ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

botName - ์œ„์—์„œ ์„ ์–ธํ•œ steamID๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋ด‡์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค(ASF๊ฐ€ ์ธ์‹ํ•˜๋Š” ์ด๋ฆ„์œผ๋กœ, ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค). ํ•„์ˆ˜ ํ•ญ๋ชฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ null์ด๋ฉฐ, ์ด ๊ฒฝ์šฐ ํ˜„์žฌ ์—ฐ๊ฒฐ๋œ ๋ด‡ ์ค‘ **์ž„์˜์˜ ๋ด‡(any)**์ด ์ž๋™์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. SteamTarget์€ ๋Œ€์ƒ์˜ steamID๊ฐ€ ์นœ๊ตฌ ๋ชฉ๋ก์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋“ฑ ์—ฌ๋Ÿฌ Steam ์ œํ•œ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด ๊ฐ’์„ ์ ์ ˆํžˆ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” layout ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•œ ๋ด‡์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ${logger}์™€ ๊ฐ™์€ ํŠน์ˆ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


SteamTarget ์˜ˆ์‹œ

MyBot์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๋ด‡์—์„œ ๋ฐœ์ƒํ•œ Debug ๋ ˆ๋ฒจ ์ด์ƒ์˜ ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋ฅผ steamID 76561198006963719๋กœ ์ „์†กํ•˜๋ ค๋ฉด, ์•„๋ž˜์™€ ์œ ์‚ฌํ•œ NLog.config๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target type="Steam" name="Steam" steamID="76561198006963719" botName="MyBot" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="Steam" />
  </rules>
</nlog>

์ฐธ๊ณ : SteamTarget์€ ์‚ฌ์šฉ์ž ์ง€์ • ๋Œ€์ƒ์ด๋ฏ€๋กœ, xsi:type="Steam"์ด ์•„๋‹ˆ๋ผ type="Steam"์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. xsi๋Š” NLog๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ๋Œ€์ƒ์„ ์œ„ํ•ด ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์™€ ์œ ์‚ฌํ•œ NLog.config๋กœ ASF๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, MyBot์ด ๋ชจ๋“  ์ผ๋ฐ˜์ ์ธ ASF ๋กœ๊ทธ ๋ฉ”์‹œ์ง€๋ฅผ Steam ์‚ฌ์šฉ์ž 76561198006963719์—๊ฒŒ ์ „์†กํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ ค๋ฉด MyBot์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ด‡์ด Steam ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•œ ์ดˆ๊ธฐ ASF ๋ฉ”์‹œ์ง€๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

๋ฌผ๋ก  SteamTarget์€ ์ผ๋ฐ˜์ ์ธ TargetWithLayout์—์„œ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ „ํ˜•์ ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ์ž ์ง€์ • ๋ ˆ์ด์•„์›ƒ, ์ด๋ฆ„, ๊ณ ๊ธ‰ ๋กœ๊น… ๊ทœ์น™ ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์‹œ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์˜ˆ์‹œ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.


์Šคํฌ๋ฆฐ์ƒท

์Šคํฌ๋ฆฐ์ƒท


์ฃผ์˜ ์‚ฌํ•ญ

ASF ํ”„๋กœ์„ธ์Šค์— ์ฐธ์—ฌ ์ค‘์ธ steamID์™€ ํ•จ๊ป˜ SteamTarget์—์„œ Debug ๋กœ๊น… ๋ ˆ๋ฒจ ์ดํ•˜๋ฅผ ๊ฒฐํ•ฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ฃผ์˜ํ•˜์„ธ์š”. ์ด ๊ฒฝ์šฐ ASF๊ฐ€ ํŠน์ • ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•œ ๋’ค ์ด๋ฅผ Steam์„ ํ†ตํ•ด ๊ธฐ๋กํ•˜๊ณ , ๊ทธ๋กœ ์ธํ•ด ๋‹ค์‹œ ๊ธฐ๋กํ•ด์•ผ ํ•  ๋ฉ”์‹œ์ง€๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ StackOverflowException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ๋Š” Trace ๋ ˆ๋ฒจ(ASF๊ฐ€ ์ž์ฒด ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒฝ์šฐ)์„ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜, ASF๋ฅผ Debug ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ Debug ๋ ˆ๋ฒจ(ASF๊ฐ€ ๋ชจ๋“  Steam ํŒจํ‚ท์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒฝ์šฐ)์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด, steamID๊ฐ€ ๋™์ผํ•œ ASF ํ”„๋กœ์„ธ์Šค์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, SteamTarget์˜ minlevel ๋กœ๊น… ๋ ˆ๋ฒจ์€ Info(ASF๋ฅผ Debug ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Debug๋„ ๊ฐ€๋Šฅ) ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์ƒํ™ฉ์— ๋งž์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ฌดํ•œ ๋กœ๊น… ๋ฃจํ”„๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด <when> ๋กœ๊น… ํ•„ํ„ฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์˜ ์‚ฌํ•ญ์€ ๊ทธ๋ฃน ์ฑ„ํŒ…์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.


HistoryTarget

์ด ๋Œ€์ƒ์€ **ASF API**์˜ /Api/NLog ์—”๋“œํฌ์ธํŠธ์—์„œ ๊ณ ์ • ํฌ๊ธฐ์˜ ๋กœ๊น… ๊ธฐ๋ก(history)์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ASF ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ดํ›„ ASF-ui ๋ฐ ๊ธฐํƒ€ ๋„๊ตฌ์—์„œ ์ด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋Œ€์ƒ์€ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ง€์ •์„ ์œ„ํ•ด ์ด๋ฏธ ์ปค์Šคํ…€ NLog config๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๊ณ , ASF API(์˜ˆ: ASF-ui)์— ๋กœ๊ทธ๋ฅผ ๋…ธ์ถœํ•˜๊ณ ์ž ํ•  ๋•Œ๋งŒ ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€์˜ ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ maxCount๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ASF์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ์ง€์›๋ฉ๋‹ˆ๋‹ค.


๊ตฌ์„ฑ ๊ตฌ๋ฌธ

<targets>
  <target type="History"
          name="String"
          layout="Layout"
          maxCount="Byte" />
</targets>

๊ตฌ์„ฑ ํŒŒ์ผ(Configuration File) ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด์„ธ์š”.


๋งค๊ฐœ๋ณ€์ˆ˜

์ผ๋ฐ˜ ์˜ต์…˜

name - ๋Œ€์ƒ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.


๋ ˆ์ด์•„์›ƒ ์˜ต์…˜

layout - ๋ Œ๋”๋ง๋  ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. Layout ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’: ${date:format=yyyy-MM-dd HH\:mm\:ss}|${processname}-${processid}|${level:uppercase=true}|${logger}|${message}${onexception:inner= ${exception:format=toString,Data}}


HistoryTarget ์˜ต์…˜

maxCount - ์˜จ๋””๋งจ๋“œ ๊ธฐ๋ก(on-demand history)์„ ์œ„ํ•ด ์ €์žฅ๋˜๋Š” ๋กœ๊ทธ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜์ž…๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•ญ๋ชฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 20์ด๋ฉฐ, ์ด๋Š” ์ดˆ๊ธฐ ๊ธฐ๋ก์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ์ €์žฅ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์ ์ ˆํ•œ ๊ท ํ˜•์ ์ž…๋‹ˆ๋‹ค. 0๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

en-US de-DE es-ES lol-US
pt-BR ru-RU zh-CN zh-TW

๐Ÿ‘จโ€๐Ÿซ ๊ธฐ๋ณธ

๐Ÿ‘จโ€๐ŸŽ“๏ธ ๋ฉ”์ธ

๐Ÿง™ ๊ณ ๊ธ‰

๐Ÿ‘ท ๊ฐœ๋ฐœ์ž

Clone this wiki locally