{"title":"로깅 구성 및 사용 방법","version":"5.2","locale":"ko","docname":"howto/logging","url":"/ko/5.2/howto/logging/","canonical":"https://djangodocs.dev/ko/5.2/howto/logging/","summary":"더 보기 Django 로깅 참조 Django 로깅 개요 Django는 쉽게 확장할 수 있는 :ref: ` 기본 로깅 구성 <default-logging-configuration>`을 제공합니다. 기본 로깅 호출하기 Link to this heading # 코드 내에서 로그 메시지를 보내려면…","html":"<span id=\"logging-how-to\"></span><h1>로깅 구성 및 사용 방법<a class=\"heading-anchor\" href=\"#how-to-configure-and-use-logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">더 보기</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ko/5.2/ref/logging/#logging-ref\"><span class=\"std std-ref\">Django 로깅 참조</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ko/5.2/topics/logging/#logging-explanation\"><span class=\"std std-ref\">Django 로깅 개요</span></a></p></li>\n</ul>\n</aside>\n<p>Django는 쉽게 확장할 수 있는 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>기본 로깅 구성 &lt;default-logging-configuration&gt;`을 제공합니다.</p>\n<section id=\"make-a-basic-logging-call\">\n<h2>기본 로깅 호출하기<a class=\"heading-anchor\" href=\"#make-a-basic-logging-call\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>코드 내에서 로그 메시지를 보내려면 로깅 호출을 입력합니다.</p>\n<aside class=\"admonition-don-t-be-tempted-to-use-logging-calls-in-settings-py admonition\">\n<p class=\"admonition-title\"><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>settings.py``에서 로깅 호출을 사용하고 싶은 유혹에 빠지지 마십시오.</p>\n<p>Django 로깅을 <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code> 함수의 일부로 구성하면 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>settings.py``에 있는 로깅 호출이 예상대로 작동하지 않을 수 있습니다. 왜냐하면 <em>로깅이 그 시점에서 설정되지 않기 때문입니다</em>. 로깅을 탐색하려면 아래 예에서 제안된 뷰 함수를 사용하십시오.</p>\n</aside>\n<p>먼저 Python 로깅 라이브러리를 import한 다음, <code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">logging.getLogger`를</span> <span class=\"pre\">사용하여</span> <span class=\"pre\">로거</span> <span class=\"pre\">인스턴스를</span> <span class=\"pre\">가져옵니다.</span> <span class=\"pre\">``getLogger()`()</span></code> 메서드에 이를 식별할 수 있는 이름과 생성하는 레코드를 제공하십시오. 좋은 옵션은 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>__name__``(자세한 내용은 아래의 <a class=\"reference internal\" href=\"#naming-loggers\"><span class=\"std std-ref\">로거 네임스페이싱 사용</span></a> 참조)을 사용하는 것입니다. 그러면 현재 파이썬 모듈의 이름이 점으로 구분된 경로로 제공됩니다:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">logging</span>\n\n<span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>모듈 수준에서 이 선언을 수행하는 것이 좋습니다.</p>\n<p>그런 다음 함수 안(예: 뷰 안)에서 로거에 레코드를 보냅니다:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">some_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"k\">if</span> <span class=\"n\">some_risky_state</span><span class=\"p\">:</span>\n        <span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">warning</span><span class=\"p\">(</span><span class=\"s2\">&quot;Platform is running at risk&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>이 코드가 실행되면 해당 메시지가 포함된 :py:class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~logging.LogRecord`가 로거로 전송됩니다. Django의 기본 로깅 구성을 사용하는 경우 메시지가 콘솔에 나타납니다.</p>\n<p>위의 예에서 사용된 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 수준은 여러 <span class=\"xref std std-ref\">로깅 심각도 수준들 &lt;topic-logging-parts-loggers&gt;`중 하나입니다: ``DEBUG`</span>, <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">ERROR</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CRITICAL</span></code>. 따라서 다른 예는 다음과 같습니다:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">critical</span><span class=\"p\">(</span><span class=\"s2\">&quot;Payment system is not responding&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-important\">\n<p class=\"admonition-title\">중요</p>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>WARNING``보다 낮은 수준의 레코드는 기본적으로 콘솔에 나타나지 않습니다. 이 동작을 변경하려면 추가 구성이 필요합니다.</p>\n</aside>\n</section>\n<section id=\"customize-logging-configuration\">\n<h2>로깅 구성 사용자 정의<a class=\"heading-anchor\" href=\"#customize-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django의 로깅 구성은 별 다른 구성 없이도 작동하지만, 몇 가지 추가 구성을 통해 로그가 다양한 대상(로그 파일, 외부 서비스, 이메일 등)으로 전송되는 방식을 정확하게 제어할 수 있습니다.</p>\n<p>다음을 설정할 수 있습니다:</p>\n<ul class=\"simple\">\n<li><p>어떤 레코드를 어떤 핸들러로 보낼지 결정하는 로거 매핑</p></li>\n<li><p>받은 레코드로 무엇을 할지 결정하는 핸들러</p></li>\n<li><p>레코드 전송에 대한 추가 제어를 제공하고 레코드를 바로 수정할 수 있는 필터</p></li>\n<li><p><a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(Python v3.14에서)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> 객체를 사람이나 다른 시스템에서 사용할 문자열이나 다른 형식으로 변환하는 포맷터</p></li>\n</ul>\n<p>로깅 구성에는 다양한 방법들이 있습니다. Django에서는 <a class=\"reference internal\" href=\"/ko/5.2/ref/settings/#std-setting-LOGGING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code></a> 구성이 가장 일반적으로 사용됩니다. 이 구성은 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>dictConfig 형식 &lt;logging-config-dictschema&gt;`을 사용하고 :ref:<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>기본 로깅 구성 &lt;default-logging-definition&gt;`을 확장합니다.</p>\n<p>사용자 지정 설정이 Django의 기본값과 병합되는 방법에 대한 설명은 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>configuring-logging`을 참조하세요.</p>\n<p>로깅을 구성하는 다른 방법에 대한 자세한 내용은 mod:Python 로깅 문서 &lt;python:logging.config&gt;`를 참조하세요. 단순화를 위해 이 문서에서는 ``LOGGING` 설정을 통한 구성만 고려합니다.</p>\n<section id=\"basic-logging-configuration\">\n<span id=\"basic-logger-configuration\"></span><h3>기본 로깅 구성<a class=\"heading-anchor\" href=\"#basic-logging-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>로깅을 구성할 때, 다음을 수행하는 것이 좋습니다:</p>\n<section id=\"create-a-logging-dictionary\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">LOGGING</span></code> 사전 생성<a class=\"heading-anchor\" href=\"#create-a-logging-dictionary\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>settings.py``에서:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;version&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>  <span class=\"c1\"># the dictConfig format version</span>\n    <span class=\"s2\">&quot;disable_existing_loggers&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>  <span class=\"c1\"># retain the default loggers</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>disable_existing_loggers``를 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>False``로 설정하여 기본 로깅 구성을 유지하고 확장하는 것이 거의 항상 좋습니다.</p>\n</section>\n<section id=\"configure-a-handler\">\n<h4>핸들러 구성<a class=\"heading-anchor\" href=\"#configure-a-handler\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>이 예제는 Python의 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileHandler`를</span> <span class=\"pre\">사용하여</span> <span class=\"pre\">``DEBUG`</span></code> 이상의 로그를 (프로젝트 루트에 있는) <code class=\"docutils literal notranslate\"><span class=\"pre\">general.log</span></code> 파일에 저장하는 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>file``이라는 단일 핸들러를 구성합니다:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;file&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>다른 핸들러 클래스는 다른 구성 옵션을 사용합니다. 사용 가능한 핸들러 클래스에 대한 자세한 내용은 Django에서 제공하는 클래스:~django.utils.log.AdminEmailHandler 및 Python에서 제공하는 다양한 핸들러 클래스 &lt;logging.handlers&gt;`를 참조하세요.</p>\n<p>로깅 수준은 핸들러에서도 설정할 수 있습니다(기본적으로 모든 수준의 로그 메시지를 수락함). 위의 예를 사용하여 다음을 추가합니다:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"p\">{</span>\n    <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;DEBUG&quot;</span><span class=\"p\">,</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> 수준 이상의 레코드만 허용하는 핸들러 구성을 정의합니다.</p>\n</section>\n<section id=\"configure-a-logger-mapping\">\n<h4>로거 매핑 설정<a class=\"heading-anchor\" href=\"#configure-a-logger-mapping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>이 핸들러로 레코드를 보내려면, 로거 매핑을 구성합니다. 예를 들면 다음과 같습니다:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;DEBUG&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;file&quot;</span><span class=\"p\">],</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>매핑의 이름은 처리할 로그 레코드를 결정합니다. 이 구성(<code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code>)은 <em>unnamed*입니다. 즉, *모든</em> 로거의 레코드를 처리한다는 의미입니다(레코드를 처리할 로거를 결정하기 위해 매핑 이름을 사용하는 방법은 아래의 <a class=\"reference internal\" href=\"#naming-loggers\"><span class=\"std std-ref\">로거 네임스페이싱 사용</span></a> 참조).</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> 수준 이상의 메시지를 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>file``이라는 핸들러로 전달합니다.</p>\n<p>로거는 여러 핸들러에 메시지를 전달할 수 있으므로, 로거와 핸들러 간의 관계는 many-to-many입니다.</p>\n<p>만약 다음을 실행하는 경우:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">logger</span><span class=\"o\">.</span><span class=\"n\">debug</span><span class=\"p\">(</span><span class=\"s2\">&quot;Attempting to connect to API&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>코드에서 프로젝트 루트의 <code class=\"docutils literal notranslate\"><span class=\"pre\">general.log</span></code> 파일에서 해당 메시지를 찾을 수 있습니다.</p>\n</section>\n<section id=\"configure-a-formatter\">\n<h4>포맷터 구성<a class=\"heading-anchor\" href=\"#configure-a-formatter\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>기본적으로 최종 로그 출력에는 각 로그 레코드 &lt;logging.LogRecord&gt;`의 메시지 부분이 포함됩니다. 추가 데이터를 포함하려면 포맷터를 사용하십시오. 먼저 이름을 지정하고 포맷터를 정의합니다. 이 예에서는 <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose</span></code> 및 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>simple``이라는 포맷터를 정의합니다:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"hll\">    <span class=\"s2\">&quot;formatters&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;verbose&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">{name}</span><span class=\"s2\"> </span><span class=\"si\">{levelname}</span><span class=\"s2\"> </span><span class=\"si\">{asctime}</span><span class=\"s2\"> </span><span class=\"si\">{module}</span><span class=\"s2\"> </span><span class=\"si\">{process:d}</span><span class=\"s2\"> </span><span class=\"si\">{thread:d}</span><span class=\"s2\"> </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">        <span class=\"s2\">&quot;simple&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;format&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;</span><span class=\"si\">{levelname}</span><span class=\"s2\"> </span><span class=\"si\">{message}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">            <span class=\"s2\">&quot;style&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;{&quot;</span><span class=\"p\">,</span>\n</span><span class=\"hll\">        <span class=\"p\">},</span>\n</span><span class=\"hll\">    <span class=\"p\">},</span>\n</span><span class=\"p\">}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">style</span></code> 키워드를 사용하면 <code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format`에</span> <span class=\"pre\">``{``를</span> <span class=\"pre\">지정하거나</span> <span class=\"pre\">:class:`string.Template()</span></code> 형식에 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>$``를 지정할 수 있습니다. 기본값은 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>$``입니다.</p>\n<p>include할 수 있는 <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logging.LogRecord\" title=\"(Python v3.14에서)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LogRecord</span></code></a> 속성에 대해  :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>logrecord-attributes`를 참조하십시오.</p>\n<p>포맷터를 핸들러에 적용하려면, 이름으로 포맷터를 참조하는 핸들러의 사전에 <code class=\"docutils literal notranslate\"><span class=\"pre\">formatter</span></code> 항목을 추가하십시오. 예를 들면 다음과 같습니다:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"s2\">&quot;handlers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;file&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;logging.FileHandler&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;filename&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;general.log&quot;</span><span class=\"p\">,</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;formatter&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;verbose&quot;</span><span class=\"p\">,</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"use-logger-namespacing\">\n<span id=\"naming-loggers\"></span><h4>로거 네임스페이싱 사용<a class=\"heading-anchor\" href=\"#use-logger-namespacing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>명명되지 않은 로깅 설정 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>’’<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>은 모든 Python 응용 프로그램에서 로그를 캡처합니다. 명명된 로깅 구성은 이름이 일치하는 로거에서만 로그를 캡처합니다.</p>\n<p>로거 인스턴스의 네임스페이스는 :py:func:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~logging.getLogger`를 사용하여 정의됩니다. 예를 들어 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>my_app``의 <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a>views.py``에서:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>는 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> 네임스페이스에 로거를 생성합니다. <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>__name__``을 사용하면 프로젝트의 애플리케이션 내에서 출처에 따라 로그 메시지를 자동으로 구성할 수 있습니다. 또한 이름 충돌이 발생하지 않도록 보장해줍니다.</p>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>my_app.views``라는 로거 매핑은 이 로거에서 레코드를 캡처합니다:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;my_app.views&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">},</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">my_app``이라는</span> <span class=\"pre\">이름의</span> <span class=\"pre\">로거</span> <span class=\"pre\">매핑은</span> <span class=\"pre\">``my_app</span></code> 네임스페이스(<code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.utils</span></code> 등 포함) 내의 모든 로거에서 레코드를 캡처하기 떄문에 더 관대합니다:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n<span class=\"hll\">        <span class=\"s2\">&quot;my_app&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">},</span>\n</span>    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>다음과 같이 로거 네임스페이스를 명시적으로 정의할 수도 있습니다:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">logger</span> <span class=\"o\">=</span> <span class=\"n\">logging</span><span class=\"o\">.</span><span class=\"n\">getLogger</span><span class=\"p\">(</span><span class=\"s2\">&quot;project.payment&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>그리고 그에 따라 로거 매핑을 설정합니다.</p>\n<section id=\"using-logger-hierarchies-and-propagation\">\n<span id=\"naming-loggers-hierarchy\"></span><h5>로거 계층 및 전파 사용<a class=\"heading-anchor\" href=\"#using-logger-hierarchies-and-propagation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h5>\n<p>로거 이름 지정은 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">*</span></a>계층적*입니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app``은</span> <span class=\"pre\">``my_app.views.private``의</span> <span class=\"pre\">부모인</span> <span class=\"pre\">``my_app.views``의</span> <span class=\"pre\">부모입니다.</span> <span class=\"pre\">달리</span> <span class=\"pre\">지정하지</span> <span class=\"pre\">않는</span> <span class=\"pre\">한,</span> <span class=\"pre\">로거</span> <span class=\"pre\">매핑은</span> <span class=\"pre\">처리하는</span> <span class=\"pre\">레코드를</span> <span class=\"pre\">부모에게</span> <span class=\"pre\">전파합니다.</span> <span class=\"pre\">``my_app.views.private</span></code> 네임스페이스에 있는 로거의 레코드는 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app</span></code> 및 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_app.views</span></code> 모두에 대한 매핑에 의해 처리됩니다.</p>\n<p>이 동작을 관리하려면, 당신이 정의한 매핑에서 전파 키를 설정합니다.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">LOGGING</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;loggers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;my_app&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;my_app.views&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</span>\n        <span class=\"p\">},</span>\n        <span class=\"s2\">&quot;my_app.views.private&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"c1\"># ...</span>\n            <span class=\"s2\">&quot;propagate&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>propagate``의 기본값은 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>True``입니다. 이 예에서 <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a>my_app.views.private``의 로그는 상위에서 처리되지 않지만 <a href=\"#id7\"><span class=\"problematic\" id=\"id8\">``</span></a>my_app.views``의 로그는 처리됩니다.</p>\n</section>\n</section>\n</section>\n<section id=\"configure-responsive-logging\">\n<h3>반응형 로깅 구성<a class=\"heading-anchor\" href=\"#configure-responsive-logging\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>로깅은 필요하지 않은 정보를 제외한 가능한 많은 정보를 포함할 때 가장 유용합니다. 필요한 정보의 양은 수행 중인 작업에 따라 다릅니다. 디버깅할 때는 프로덕션에서는 과도하고 도움이 되지 않는 수준의 정보가 필요합니다.</p>\n<p>필요할 때 필요한 세부 수준을 제공하도록 로깅을 구성할 수 있습니다. 이를 위해 수동으로 구성을 변경하는 것보다, 환경에 따라 자동으로 구성을 적용하는 것이 더 좋은 방법입니다.</p>\n<p>예를 들어, 개발 및 스테이징 환경에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">DJANGO_LOG_LEVEL</span></code> 환경 변수를 적절하게 설정하여 로거 매핑에서 사용할 수 있습니다:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;level&quot;</span><span class=\"p\">:</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">getenv</span><span class=\"p\">(</span><span class=\"s2\">&quot;DJANGO_LOG_LEVEL&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;WARNING&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>- 따라서 환경이 더 낮은 로그 수준을 지정하지 않는 한 이 구성은 <code class=\"docutils literal notranslate\"><span class=\"pre\">WARNING</span></code> 이상의 심각도를 가진 레코드만 핸들러로 전달합니다.</p>\n<p>구성의 다른 옵션(예: 핸들러의 <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> 또는 <code class=\"docutils literal notranslate\"><span class=\"pre\">formatter</span></code> 옵션)도 유사하게 관리할 수 있습니다.</p>\n</section>\n</section>","rootId":"how-to-configure-and-use-logging","toc":[{"title":"기본 로깅 호출하기","anchor":"make-a-basic-logging-call","children":[]},{"title":"로깅 구성 사용자 정의","anchor":"customize-logging-configuration","children":[{"title":"기본 로깅 구성","anchor":"basic-logging-configuration","children":[{"title":"LOGGING 사전 생성","anchor":"create-a-logging-dictionary","children":[]},{"title":"핸들러 구성","anchor":"configure-a-handler","children":[]},{"title":"로거 매핑 설정","anchor":"configure-a-logger-mapping","children":[]},{"title":"포맷터 구성","anchor":"configure-a-formatter","children":[]},{"title":"로거 네임스페이싱 사용","anchor":"use-logger-namespacing","children":[{"title":"로거 계층 및 전파 사용","anchor":"using-logger-hierarchies-and-propagation","children":[]}]}]},{"title":"반응형 로깅 구성","anchor":"configure-responsive-logging","children":[]}]}],"breadcrumbs":[{"docname":"howto/index","title":"How-to guides","url":"/ko/5.2/howto/"}],"prev":{"docname":"howto/static-files/index","title":"정적 파일 관리하기(이미지, 자바스크립트, CSS 등)","url":"/ko/5.2/howto/static-files/"},"next":{"docname":"howto/error-reporting","title":"오류 보고를 관리하는 방법","url":"/ko/5.2/howto/error-reporting/"},"formats":{"html":"/ko/5.2/howto/logging/","markdown":"/ko/5.2/howto/logging.md","json":"/ko/5.2/howto/logging.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/howto/logging.txt","official":"https://docs.djangoproject.com/ko/5.2/howto/logging/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}