<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>loggingPython Tech</title>
	<atom:link href="https://tech.nkhn37.net/category/python/python-libraries/logging/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Thu, 08 Jan 2026 21:20:18 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>loggingPython Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python】loggingのTimedRotatingFileHandlerを使って指定時間でログローテーションする方法</title>
		<link>https://tech.nkhn37.net/python-logging-timedrotatingfilehandler/</link>
					<comments>https://tech.nkhn37.net/python-logging-timedrotatingfilehandler/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Wed, 20 Apr 2022 20:00:00 +0000</pubDate>
				<category><![CDATA[logging]]></category>
		<category><![CDATA[TimedRotatingFileHandler]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=3601</guid>

					<description><![CDATA[Pythonのloggingモジュールで、TimedRotatingFileHandlerを使って指定時間でログローテーションする方法を解説します。 時間指定でログローテーション Pythonに限らずですがプログラムの開 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonのloggingモジュールで、<span class="marker"><strong>TimedRotatingFileHandler</strong></span>を使って指定時間でログローテーションする方法を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">時間指定でログローテーション</h2>



<p class="wp-block-paragraph">Pythonに限らずですがプログラムの開発をした際にはログ出力し、障害時の際には状況を把握できるようにすることが非常に重要です。</p>



<p class="wp-block-paragraph">業務アプリケーションといった常時動作しているシステムの場合、ログファイルが常に出力されるのでログファイルが肥大化し、ディスクの容量を圧迫してしまいシステム全体の動作に影響を与える可能性があります。</p>



<p class="wp-block-paragraph">その場合には、<span class="marker"><strong>ログローテーション</strong></span>することで回避します。例えば「ログデータの総量が一定の容量を超えたら別のファイルにログを出力する」「一定時間が過ぎたら別のファイルにログを出力する」といったように切り替えます。</p>



<p class="wp-block-paragraph">pythonではロギングのモジュールとしてloggingが用意されています。loggingにはハンドラというものがありますが、<span class="marker"><strong>TimedRotatingFileHandler</strong></span>を使用することで指定した時間でのログローテーションを実現することができます。</p>



<p class="wp-block-paragraph">本記事では、TimeRotatingFileHandlerの使用方法について紹介します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">ファイルサイズでログローテーションする方法としては「<a href="https://tech.nkhn37.net/python-logging-rotatingfilehandler/" target="_blank" rel="noreferrer noopener">loggingのRotatingFileHandlerを使って指定ファイルサイズでログローテーションする方法</a>」を参考にしてください。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">loggingのTimedRotatingFileHandlerでログローテーションする方法</h2>



<p class="wp-block-paragraph">Pythonでログ出力に使用されるloggingで<span class="marker"><strong>TimedRotatingFileHandelr</strong></span>によってログローテーションする方法を説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">TimedRotatingFileHandlerの使い方</h3>



<p class="wp-block-paragraph">loggingで指定時間によるログローテーションをする場合は、以下のようにTimedRotatingFileHandlerを設定して使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging.handlers
import time


def main():
    # ロギングの基本設定
    formatter = "%(asctime)s:%(levelname)s:%(name)s:%(message)s"
    logging.basicConfig(level=logging.INFO, format=formatter, encoding="utf_8")

    # ロガーの作成
    logger = logging.getLogger(__name__)

    # ログレベルをDEBUGへ変更
    logger.setLevel(logging.DEBUG)

    # ログローテーションのハンドラーを設定
    #   when: intervalの単位
    #         ('S':秒、'M':分、'H':時間、'D':日、'W0'-'W6':曜日(0=月曜))
    #   interval: ログローテーション間隔
    #   backupCount: バックアップとして保持するログファイル数
    h = logging.handlers.TimedRotatingFileHandler(
        "test.log", when="S", interval=20, backupCount=5
    )

    # フォーマットを設定
    h.setFormatter(logging.Formatter(formatter))

    # ロガーにハンドラーを設定
    logger.addHandler(h)

    for _ in range(1000):
        time.sleep(0.1)
        logger.debug("log rotation test")


if __name__ == "__main__":
    main()</pre>



<p class="wp-block-paragraph"><strong>【実行結果例】</strong>対象フォルダをdirコマンドで確認した例</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="531" height="99" src="https://tech.nkhn37.net/wp-content/uploads/2022/04/image-28.png" alt="logging TimedRotatingFileHandler" class="wp-image-3605" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/04/image-28.png 531w, https://tech.nkhn37.net/wp-content/uploads/2022/04/image-28-300x56.png 300w" sizes="(max-width: 531px) 100vw, 531px" /></figure>
</div>


<p class="wp-block-paragraph"><strong>【詳細説明】</strong></p>



<p class="wp-block-paragraph">以降でプログラムの各部分について解説をします。</p>



<p class="wp-block-paragraph">まず、TimedRotatingFileHandlerを使用する場合には「logging.handlers」をimportする必要があります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging.handlers</pre>



<p class="wp-block-paragraph">以下の部分は、ログ基本設定の部分でメインプログラムなどで設定する基本的な設定内容です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ロギングの基本設定
    formatter = "%(asctime)s:%(levelname)s:%(name)s:%(message)s"
    logging.basicConfig(level=logging.INFO, format=formatter, encoding="utf_8")</pre>



<p class="wp-block-paragraph">ロガーを作成し、ログローテーションのためのTimedRotatingFileHandlerを設定しているのは以下の部分になっています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ロガーの作成
    logger = logging.getLogger(__name__)

    # ログレベルをDEBUGへ変更
    logger.setLevel(logging.DEBUG)

    # ログローテーションのハンドラーを設定
    #   when: intervalの単位
    #         ('S':秒、'M':分、'H':時間、'D':日、'W0'-'W6':曜日(0=月曜))
    #   interval: ログローテーション間隔
    #   backupCount: バックアップとして保持するログファイル数
    h = logging.handlers.TimedRotatingFileHandler(
        "test.log", when="S", interval=20, backupCount=5
    )

    # フォーマットを設定
    h.setFormatter(logging.Formatter(formatter))

    # ロガーにハンドラーを設定
    logger.addHandler(h)</pre>



<p class="wp-block-paragraph">ログローテーションのハンドラーを作成する際には、「ファイル名」「when」、「interval」、「backupCount」といった引数を指定します。</p>



<p class="wp-block-paragraph"><span class="marker"><strong>when</strong></span>はログをローテーションする間隔(interval)の単位を指定します。whenで指定できるものには以下のようなものがあります。日単位で1日分のログでローテーションしたい場合には&#8217;midnight&#8217;を使用するのがよいかと思います。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>whenに指定する値</th><th>内容</th></tr></thead><tbody><tr><td>&#8216;S&#8217;</td><td>秒</td></tr><tr><td>&#8216;M&#8217;</td><td>分</td></tr><tr><td>&#8216;H&#8217;</td><td>時間</td></tr><tr><td>&#8216;D&#8217;</td><td>日</td></tr><tr><td>&#8216;W0&#8217;-&#8216;W6&#8217;</td><td>曜日(&#8216;W0&#8217;が月曜を表す)</td></tr><tr><td>&#8216;midnight&#8217;</td><td>・atTime引数が指定されなかった場合は深夜にローテーションされる<br>・atTime引数に指定された時刻にローテーションされる。ただし、時刻はdatetime.timeインスタンスで指定する。</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><span class="marker"><strong>interval</strong></span>は、whenで指定した単位でどれだけの間隔をとってローテーションするかを指定します。</p>



<p class="wp-block-paragraph">上記の例では、&#8217;S&#8217;で20と指定しているので20秒ごとにログをローテーションします。実際にはこんなに短い時間でのローテーションはしないと思いますが、実行結果の確認をしやすいように短い時間にしています。</p>



<p class="wp-block-paragraph"><span class="marker"><strong>backupCoun</strong></span>tについては、いくつの古いログファイルを保持するかを指定します。</p>



<p class="wp-block-paragraph">まとめると上記の例では、test.logというファイルにログを出力し、20秒ごとに上限5つのバックアップファイルでローテーションするという設定です。</p>



<p class="wp-block-paragraph">また、フォーマット指定しておかないと入力した文字列のみ出力されてしまうので、setFormatterでハンドラにフォーマットを指定しています。最後にaddHandlerでロガーにハンドラーを設定しています。</p>



<p class="wp-block-paragraph">上記まででログローテーションをする準備は完了です。以下の部分はログ出力の確認をしています。sleepで一定時間止まって出力するようにしていますので、繰り返し回数やsleep時間などは任意に変えてみてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    for _ in range(1000):
        time.sleep(0.1)
        logger.debug("log rotation test")</pre>



<p class="wp-block-paragraph">複数回実行いただくと分かりますが、test.logに常に最新のログが出力されます。</p>



<p class="wp-block-paragraph">ログが指定時間に達するとtest.log.2022-04-21_06-29-42のように出力時間が分かるようなファイル名でローテーションがされます。上記の例では、backupCountを5としているので5ファイルまでしか作成されません。</p>



<p class="wp-block-paragraph">以上が、TimedRotatingFileHandlerを使って時間指定によるログローテーションをする方法でした。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>TimedRotatingFileHandler</code> の公式ドキュメントは<a href="https://docs.python.org/ja/3/library/logging.handlers.html#timedrotatingfilehandler" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-libraries/logging/timed-rotating-file-handler" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-logging-timedrotatingfilehandler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】loggingのRotatingFileHandlerを使って指定ファイルサイズでログローテーションする方法</title>
		<link>https://tech.nkhn37.net/python-logging-rotatingfilehandler/</link>
					<comments>https://tech.nkhn37.net/python-logging-rotatingfilehandler/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Tue, 19 Apr 2022 20:00:00 +0000</pubDate>
				<category><![CDATA[logging]]></category>
		<category><![CDATA[RotatingFileHandler]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=3589</guid>

					<description><![CDATA[Pythonのloggingモジュールで、RotatingFileHandlerを使って指定ファイルサイズでログローテーションする方法を解説します。 指定ファイルサイズでログローテーション Pythonに限らずですがプロ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonのloggingモジュールで、<span class="marker"><strong>RotatingFileHandler</strong></span>を使って指定ファイルサイズでログローテーションする方法を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">指定ファイルサイズでログローテーション</h2>



<p class="wp-block-paragraph">Pythonに限らずですがプログラムの開発をした際にはログ出力し、障害時の際には状況を把握できるようにすることが非常に重要です。</p>



<p class="wp-block-paragraph">業務アプリケーションといった常時動作しているシステムの場合、ログファイルが常に出力されるのでログファイルが肥大化し、ディスクの容量を圧迫してしまいシステム全体の動作に影響を与える可能性があります。</p>



<p class="wp-block-paragraph">その場合には、<span class="marker"><strong>ログローテーション</strong></span>することで回避します。例えば「ログデータの総量が一定の容量を超えたら別のファイルにログを出力する」「一定時間が過ぎたら別のファイルにログを出力する」といったように切り替えます。</p>



<p class="wp-block-paragraph">pythonではロギングのモジュールとしてloggingが用意されています。loggingにはハンドラというものがありますが、<span class="marker"><strong>RotatingFileHandler</strong></span>を使用することで指定したファイルサイズによってログローテーションを実現することができます。</p>



<p class="wp-block-paragraph">本記事では、RotatingFileHandlerの使用方法について紹介します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">時間指定でログローテーションする方法については「<a href="https://tech.nkhn37.net/python-logging-timedrotatingfilehandler/" target="_blank" rel="noreferrer noopener">loggingのTimedRotatingFileHandlerを使って指定時間でログローテーションする方法</a>」を参考にしてください。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">loggingのRotatingFileHandlerでログローテーションする方法</h2>



<p class="wp-block-paragraph">Pythonでログ出力に使用されるloggingで<span class="marker"><strong>RotatingFileHandler</strong></span>によってログローテーションする方法を説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">RotatingFileHandlerの使い方</h3>



<p class="wp-block-paragraph">loggingで指定ファイルサイズによるログローテーションをする場合は、以下のようにRotatingFileHandlerを設定して使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging.handlers
import time


def main():
    # ロギングの基本設定
    formatter = "%(asctime)s:%(levelname)s:%(name)s:%(message)s"
    logging.basicConfig(level=logging.INFO, format=formatter, encoding="utf_8")

    # ロガーの作成
    logger = logging.getLogger(__name__)

    # ログレベルをDEBUGへ変更
    logger.setLevel(logging.DEBUG)

    # ログローテーションのハンドラーを設定
    #   maxBytes: 1ログファイルの上限サイズ(byte単位)
    #   backupCount: バックアップとして保持するログファイル数
    h = logging.handlers.RotatingFileHandler("test.log", maxBytes=10000, backupCount=5)

    # フォーマットを設定
    h.setFormatter(logging.Formatter(formatter))

    # ロガーにハンドラーを設定
    logger.addHandler(h)
    
    for _ in range(1000):
        time.sleep(0.1)
        logger.debug("log rotation test")


if __name__ == "__main__":
    main()</pre>



<p class="wp-block-paragraph"><strong>【実行結果例】</strong>対象フォルダをdirコマンドで確認した例</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="377" height="101" src="https://tech.nkhn37.net/wp-content/uploads/2022/04/image-27.png" alt="logging RotatingFileHandler" class="wp-image-3592" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/04/image-27.png 377w, https://tech.nkhn37.net/wp-content/uploads/2022/04/image-27-300x80.png 300w" sizes="(max-width: 377px) 100vw, 377px" /></figure>
</div>


<p class="wp-block-paragraph"><strong>【詳細説明】</strong></p>



<p class="wp-block-paragraph">以降でプログラムの各部分について解説をします。</p>



<p class="wp-block-paragraph">まず、RotatingFileHandlerを使用する場合には「logging.handlers」をimportする必要があります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging.handlers</pre>



<p class="wp-block-paragraph">以下の部分は、ログ基本設定の部分でメインプログラムなどで設定する基本的な設定内容です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ロギングの基本設定
    formatter = "%(asctime)s:%(levelname)s:%(name)s:%(message)s"
    logging.basicConfig(level=logging.INFO, format=formatter, encoding="utf_8")</pre>



<p class="wp-block-paragraph">ロガーを作成し、ログローテーションのためのRotatingFileHandlerを設定しているのは以下の部分になっています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    # ロガーの作成
    logger = logging.getLogger(__name__)

    # ログレベルをDEBUGへ変更
    logger.setLevel(logging.DEBUG)

    # ログローテーションのハンドラーを設定
    #   maxBytes: 1ログファイルの上限サイズ(byte単位)
    #   backupCount: バックアップとして保持するログファイル数
    h = logging.handlers.RotatingFileHandler("test.log", maxBytes=10000, backupCount=5)

    # フォーマットを設定
    h.setFormatter(logging.Formatter(formatter))

    # ロガーにハンドラーを設定
    logger.addHandler(h)</pre>



<p class="wp-block-paragraph">ログローテーションのハンドラーを作成する際には、「ファイル名」、「maxBytes」、「backupCount」といった引数を指定します。<span class="marker"><strong>maxBytes</strong></span>は上限とするファイルサイズをバイトで指定します。<span class="marker"><strong>backupCount</strong></span>については、いくつの古いログファイルを保持するかを指定します。</p>



<p class="wp-block-paragraph">上記の例ではtest.logというファイルにログを出力し、10KBを上限に5つのバックアップファイルでローテーションするという設定です。</p>



<p class="wp-block-paragraph">また、フォーマットを指定しておかないと入力した文字列のみ出力されてしまうので、setFormatterでハンドラにフォーマットを指定しています。最後にaddHandlerでロガーにハンドラーを設定しています。</p>



<p class="wp-block-paragraph">上記まででログローテーションの準備は完了です。以下の部分ではログ出力の確認をしています。sleepで一定時間止まってからログを出力するようにしていますので、繰り返し回数やsleep時間などは任意に変えてみてください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">    for _ in range(1000):
        time.sleep(0.1)
        logger.debug("log rotation test")</pre>



<p class="wp-block-paragraph">複数回実行いただくと、test.logに常に最新のログが出力されることが分かります。</p>



<p class="wp-block-paragraph">ログファイルは、指定したサイズに達するとtest.log.1、test.log.2、…、test.log.5というようにファイルがローテーションされて出力されます。test.log.1の方が新しいログで、5に進むにつれて古いログになります。つまりローテーションのタイミングでファイルがリネームされているわけです。</p>



<p class="wp-block-paragraph">以上が、RotatingFileHandlerを使ってファイルサイズ指定によるログローテーションをする方法でした。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>RotatingFileHandler</code> の公式ドキュメントは<a href="https://docs.python.org/ja/3/library/logging.handlers.html#rotatingfilehandler" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-libraries/logging/rotating-file-handler" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-logging-rotatingfilehandler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】loggingの基本的な使い方</title>
		<link>https://tech.nkhn37.net/python-logging-basic/</link>
					<comments>https://tech.nkhn37.net/python-logging-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Wed, 06 Apr 2022 20:00:00 +0000</pubDate>
				<category><![CDATA[logging]]></category>
		<category><![CDATA[addHandler]]></category>
		<category><![CDATA[basicConfig]]></category>
		<category><![CDATA[format]]></category>
		<category><![CDATA[getLogger]]></category>
		<category><![CDATA[handler]]></category>
		<category><![CDATA[logger]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=3413</guid>

					<description><![CDATA[Pythonでログ管理をする際に使用するloggingモジュールの基本的な使い方を解説します。 loggingモジュール プログラムを開発する際にはログ出力して、実行時や障害発生時に何が起こっているかを把握することが非常 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonでログ管理をする際に使用する<span class="marker"><strong>logging</strong></span>モジュールの基本的な使い方を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">loggingモジュール</h2>



<p class="wp-block-paragraph">プログラムを開発する際にはログ出力して、実行時や障害発生時に何が起こっているかを把握することが非常に重要です。Pythonでログを出力する場合には<span class="marker"><strong>logging</strong></span>モジュールを使用することができます。</p>



<p class="wp-block-paragraph">本記事ではloggingモジュールの基本的な考え方と使い方について紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ログレベル</h3>



<p class="wp-block-paragraph">loggingモジュールでは、ログの重要度によって以下の5つのログレベルを使用できます。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--simple-box1  "><div class="c--simple-box-inner">
<ol class="wp-block-list jinr-list">
<li>CRITICAL</li>



<li>ERROR</li>



<li>WARNING</li>



<li>INFO</li>



<li>DEBUG</li>
</ol>
</div></div></section>



<p class="wp-block-paragraph">ログの重要度としては、1のCRITICALの方が重要度が高く、システムとしては重大な問題が発生していることを意味しています。通常のアプリケーションでは、WARNING以上もしくはアプリケーションによってはINFO以上を出力するということが多いかと思います。後ほど例を紹介しますがloggingモジュールでは、デフォルトでWARNING以上のログを出力する設定となります。</p>



<p class="wp-block-paragraph">常にすべてのログを出しているとログファイルサイズが大きくなってディスクを圧迫したり、重要なログが埋もれてしまったりといったことがあります。ただ、不具合が起こった際には調査のために詳細な情報が必要です。そのような場合には、DEBUGモードに設定を変更して詳細な情報を出力して調査するといったことをします。</p>



<p class="wp-block-paragraph">プログラマーは目的に応じて出力するメッセージレベルをどうするかよく考えてコーディングをする必要があります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">loggingモジュールの基本的な使い方</h3>



<h4 class="wp-block-heading jinr-heading d--bold">基本的な出力方法</h4>



<p class="wp-block-paragraph">loggingモジュールを使うには以下の例のように使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging

# デフォルトで出力されるのはWARNING以上
logging.critical('クリティカル')
logging.error('エラー')
logging.warning('ワーニング')
logging.info('インフォ')
logging.debug('デバッグ')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【コンソール出力結果】
CRITICAL:root:クリティカル
ERROR:root:エラー
WARNING:root:ワーニング</pre>



<p class="wp-block-paragraph">まずは、loggingモジュールを使用するためにimportする必要があります。</p>



<p class="wp-block-paragraph">その後ログを出力するためには、ログレベルと同じ名称であるメソッド(critical, error, warning, info, debug)に出力したいログメッセージの文字列を引数として渡します。</p>



<p class="wp-block-paragraph">デフォルトではログレベルはWARNINGとなっているため、WARNING以上のログレベルのログしか出力されていないことが分かります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">basicConfig関数による設定</h4>



<p class="wp-block-paragraph">loggingモジュールの設定を変更する場合には、<span class="marker"><strong>basicConfig</strong></span>関数を使用します。loggingモジュールにおいて、basicConfig関数はロギング制御をする重要なものなのでしっかり覚えておきましょう。</p>



<h5 class="wp-block-heading jinr-heading d--bold">ログレベルの指定方法 (level)</h5>



<p class="wp-block-paragraph">INFOやDEBUGレベルでログを出力したい場合には、以下のようにbasicConfig関数の<span class="marker"><strong>level</strong></span>引数で指定することで出力するログレベルを変更することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging

# ロギングレベルの設定(DEBUG以上を出力する)
logging.basicConfig(level=logging.DEBUG)

logging.critical('クリティカル')
logging.error('エラー')
logging.warning('ワーニング')
logging.info('インフォ')
logging.debug('デバッグ')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【コンソール出力結果】
CRITICAL:root:クリティカル
ERROR:root:エラー
WARNING:root:ワーニング
INFO:root:インフォ
DEBUG:root:デバッグ</pre>



<p class="wp-block-paragraph">上記の例では、ログレベルをDEBUGに変更しています。出力ではDEBUG以上のログが出力されていることが分かります。</p>



<h5 class="wp-block-heading jinr-heading d--bold">ログをファイルに出力する方法 (filename)</h5>



<p class="wp-block-paragraph">ログをファイルに出力したい場合には、以下のようにbasicConfig関数の<span class="marker"><strong>filename</strong></span>引数で出力ファイルを指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging

# ファイルにログ情報を出力する
logging.basicConfig(filename='test.log', encoding='utf_8')

logging.critical('クリティカル')
logging.error('エラー')
logging.warning('ワーニング')
logging.info('インフォ')
logging.debug('デバッグ')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【test.logの出力結果】
CRITICAL:root:クリティカル
ERROR:root:エラー
WARNING:root:ワーニング</pre>



<p class="wp-block-paragraph">実行するとtest.logファイルにログメッセージが出力されます。</p>



<h5 class="wp-block-heading jinr-heading d--bold">フォーマットの指定方法 (format)</h5>



<p class="wp-block-paragraph">ログ出力フォーマットは、アプリケーションごとに変更することが可能です。ログ出力フォーマットを指定する場合には、basicConfig関数の<span class="marker"><strong>format</strong></span>引数にフォーマットを指定する文字列を指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging

# フォーマットの設定
formatter = '%(asctime)s:%(levelname)s:%(name)s:%(message)s'
logging.basicConfig(format=formatter)

# フォーマットに従って出力される
logging.critical('クリティカル')
logging.error('エラー')
logging.warning('ワーニング')
logging.info('インフォ')
logging.debug('デバッグ')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【コンソール出力結果】
2022-04-06 06:59:47,964:CRITICAL:root:クリティカル
2022-04-06 06:59:47,964:ERROR:root:エラー
2022-04-06 06:59:47,964:WARNING:root:ワーニング</pre>



<p class="wp-block-paragraph">上記のようにformatterという文字列で出力する形式を指定し、basicConfigのformat引数に渡します。</p>



<p class="wp-block-paragraph">formatter文字列のところでは%(xxxxx)sという形式で出力したい情報を指定しています。xxxxxのところにはどういった情報出したいかで指定を変えます。例えば上記例で、「asctime」を指定しているところには出力時点の日時が出力されます。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">フォーマットで指定できるものは他にもありますので、公式ドキュメントの<a href="https://docs.python.org/ja/3/library/logging.html#logrecord-attributes" target="_blank" rel="noreferrer noopener">こちら</a>を参照して組み合わせてみてください。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">複数モジュールでのログ出力</h2>



<p class="wp-block-paragraph">Pythonプログラミングでは複数モジュールを作って連携させるということが一般的です。そのような際にログ出力はどうするべきでしょうか。例えば以下のような例を考えます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="979" height="362" src="https://tech.nkhn37.net/wp-content/uploads/2022/04/image-18.png" alt="logging 複数モジュールでのログ出力" class="wp-image-3426" style="width:490px;height:181px" srcset="https://tech.nkhn37.net/wp-content/uploads/2022/04/image-18.png 979w, https://tech.nkhn37.net/wp-content/uploads/2022/04/image-18-300x111.png 300w, https://tech.nkhn37.net/wp-content/uploads/2022/04/image-18-768x284.png 768w" sizes="(max-width: 979px) 100vw, 979px" /></figure>
</div>


<p class="wp-block-paragraph">この例では、logmain.pyというプログラムからlogtest.py内で定義されているsimple_func()という関数を使用しています。このような場合にはどのモジュールで出力されたかログで分かるようにしたいですね。また、モジュールごとにログ出力レベルを変えたいといったようなこともあると思います。</p>



<p class="wp-block-paragraph">このような例での基本的な考え方は以下とするのが良いかと思います。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--simple-box1  "><div class="c--simple-box-inner">
<ul class="wp-block-list jinr-list">
<li>メイン側でbasicConfigによるログの基本的な設定を実施する。</li>



<li>使用モジュール側ではロガーやハンドラーを個別に設定して使用する。</li>
</ul>
</div></div></section>



<p class="wp-block-paragraph">これを実現するためには、ロガー(logger)やハンドラ(handler)を使用します。以降で上記のような構成でロガーやハンドラを使用するプログラム例をご紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ロガーの使用 (logger)</h3>



<p class="wp-block-paragraph">loggingモジュールは<span class="marker"><strong>ロガー(logger)</strong></span>というものを用意することで、ログ出力の動きをモジュールごとに分けることができます。以下の例で見てみましょう。</p>



<p class="wp-block-paragraph">[logmain.py]</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging

import logtest

# ロギングの基本設定
formatter = '%(asctime)s:%(levelname)s:%(name)s:%(message)s'
logging.basicConfig(level=logging.INFO,
                    format=formatter,
                    filename='logmain.log',
                    encoding='utf_8')

logger = logging.getLogger(__name__)
logger.info('mainログ１')
logger.debug('mainログ２')

# モジュールを呼び出し
logtest.simple_func()</pre>



<p class="wp-block-paragraph">[logtest.py]</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging

# モジュール用のロガーを設定 DEBUGに設定
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)


def simple_func():
    logger.info('logtestログ１')
    logger.debug('logtestログ２')


def main():
    pass


if __name__ == '__main__':
    main()</pre>



<p class="wp-block-paragraph">[出力結果]</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【logmain.logの出力結果】
2022-04-06 07:16:47,006:INFO:__main__:mainログ１
2022-04-06 07:16:47,006:INFO:logtest:logtestログ１
2022-04-06 07:16:47,006:DEBUG:logtest:logtestログ２</pre>



<p class="wp-block-paragraph">内容について詳細に説明していきます。この例では、logmain.pyでlogtestをimportして、logtest.py内で定義しているsimple_func()を呼び出しています。</p>



<p class="wp-block-paragraph">logmain.pyではまず以下の部分のbasicConfig関数でログ出力の基本設定を行います。この例では、formatter文字列で指定したフォーマットでlogmain.logにINFO以上の出力をするように指定しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ロギングの基本設定
formatter = '%(asctime)s:%(levelname)s:%(name)s:%(message)s'
logging.basicConfig(level=logging.INFO,
                    format=formatter,
                    filename='logmain.log',
                    encoding='utf_8')</pre>



<p class="wp-block-paragraph">次にlogmain.py側で以下のようにロガーというものを作成しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">logger = logging.getLogger(__name__)
logger.info('mainログ１')
logger.debug('mainログ２')</pre>



<p class="wp-block-paragraph"> ロガーは、<span class="marker"><strong>getLogger</strong></span>関数で生成できます。getLoggerで生成したロガーのログ出力メソッド(critical, error, warning, info, debug)を呼び出すことでログ出力ができます。</p>



<p class="wp-block-paragraph">次に、logtest.pyの方を見てみましょう。logtest側でもモジュール用のロガーを用意していますが、こちらはsetLevelメソッドでログレベルをDEBUGに設定しています（main側はINFOです）。出力フォーマットについては結果を見てみればわかりますが、logmain側のbasicConfigで設定されたフォーマットに従います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># モジュール用のロガーを設定 DEBUGに設定
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)</pre>



<p class="wp-block-paragraph">上記を踏まえて結果を見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【logmain.logの出力結果】
2022-04-06 07:16:47,006:INFO:__main__:mainログ１
2022-04-06 07:16:47,006:INFO:logtest:logtestログ１
2022-04-06 07:16:47,006:DEBUG:logtest:logtestログ２</pre>



<p class="wp-block-paragraph">結果を見ると、main側のログはINFO以上のためdebugで出力している「logger.debug(&#8216;mainログ２&#8217;)」については出力されていません。一方で、logtest側のログについてはDEBUGとしているためINFO、DEBUGともに出力されていることが分かるかと思います。</p>



<p class="wp-block-paragraph">また、この例で<span class="marker"><strong>引数に__name__を指定していることも一つのポイント</strong></span>です。出力結果を見てみると分かりますが、%(name)sの部分にロガーの名前として__name__の値が入っています。これにより、main側で出力されたログなのか、呼び出し先のモジュールで出力されたログなのかを判別することができます。</p>



<p class="wp-block-paragraph">上記例のようにロガーを活用することで複数モジュールでのログ出力についても対応できます。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ハンドラの使用 (handler)</h3>



<p class="wp-block-paragraph">loggingモジュールには<span class="marker"><strong>ハンドラー(handler)</strong></span>というものが定義されています。ファイルに出力するFileHandlerやストリームに出力するStreamHandlerの他、ログをメールで送信するSMTPHandlerのようなものもあります。</p>



<p class="wp-block-paragraph">ハンドラーを設定することで、ログの出力動作を変更することができます。以下の例を見ていきましょう。この例は上記のロガーの説明と同じようにlogmain.pyと呼び出すモジュールのlogtest.pyがあるという構成になっています。</p>



<p class="wp-block-paragraph">[logmain.py]</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging

import logtest

# ロギングの基本設定
formatter = '%(asctime)s:%(levelname)s:%(name)s:%(message)s'
logging.basicConfig(level=logging.INFO,
                    format=formatter,
                    filename='logmain.log',
                    encoding='utf_8')

logger = logging.getLogger(__name__)
logger.info('mainログ１')
logger.debug('mainログ２')

# モジュールを呼び出し
logtest.simple_func()</pre>



<p class="wp-block-paragraph">[logtest.py]</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging

# モジュール用のロガーを設定 DEBUGに設定
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# ハンドラーを設定
h = logging.FileHandler('logtest.log', encoding='utf_8')
logger.addHandler(h)


def simple_func():
    logger.info('logtestログ１')
    logger.debug('logtestログ２')


def main():
    pass


if __name__ == '__main__':
    main()</pre>



<p class="wp-block-paragraph">[出力結果]</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[logmain.logの出力結果]
2022-04-07 06:32:16,907:INFO:__main__:mainログ１
2022-04-07 06:32:16,907:INFO:logtest:logtestログ１
2022-04-07 06:32:16,907:DEBUG:logtest:logtestログ２</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[logtest.logの出力結果]
logtestログ１
logtestログ２</pre>



<p class="wp-block-paragraph">以降で内容について説明します。logtest.pyの方で以下の部分でハンドラーを設定しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ハンドラーを設定
h = logging.FileHandler('logtest.log', encoding='utf_8')
logger.addHandler(h)</pre>



<p class="wp-block-paragraph">ハンドラーは種類によってクラスが用意されていて、上記はFileHandlerを使用しています。ハンドラーはロガーに設定することで使用することができ、対象ロガーのaddHandlerメソッドで設定します。この例では、&#8217;logtest.log&#8217;というファイルに出力するというハンドラーを設定しています。</p>



<p class="wp-block-paragraph">結果を見てみると&#8217;logmain.log&#8217;の方はmain及びlogtest側のログが&#8217;logmain.log&#8217;に出力されることが分かります。一方で、&#8217;logtest.log&#8217;にはlogtest.py側のログのみが出力されていることが分かります。</p>



<p class="wp-block-paragraph">このようにハンドラーを追加することで、各モジュール個別にログ出力の挙動を変えることができます。モジュール個別にログ調査や個別の処理を実施したい場合などに便利です。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">ログハンドラーについては、公式ドキュメントの<a href="https://docs.python.org/ja/3/library/logging.handlers.html" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">設定ファイルで制御したい場合</h2>



<p class="wp-block-paragraph">簡単なスクリプトや小規模なシステムであれば上記に記載の使用方法で十分なログ出力ができるかと思います。しかし、大規模なシステムになってくるとログ出力制御を設定ファイルで実施したくなってくるかもしれません。</p>



<p class="wp-block-paragraph">設定ファイルを使ってloggingの制御をする基本的な使い方について「<a href="https://tech.nkhn37.net/python-logging-config/" target="_blank" rel="noreferrer noopener">loggingの基本的な使い方 ~設定ファイル編~</a>」を参考にしてください。</p>



<h2 class="wp-block-heading jinr-heading d--bold">loggingの使い方をより細かく知る</h2>



<p class="wp-block-paragraph">上記でloggingの基本的な使用方法を紹介してきましたが、より細かく設定について調べたい場合は、公式ドキュメントの「<a rel="noreferrer noopener" href="https://docs.python.org/ja/3.9/howto/logging.html#logging-howto" target="_blank">Logging HOWTO</a>」を読むことがおすすめです。</p>



<p class="wp-block-paragraph">基本的なloggingチュートリアルから上級ロギングチュートリアルということで色々と記載されていますので、是非確認してみてもらえればと思います。本記事の内容は基本ロギングチュートリアルの内容を参考にしております。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-libraries/logging/basic" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-logging-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】loggingの基本的な使い方 ~設定ファイル編~</title>
		<link>https://tech.nkhn37.net/python-logging-config/</link>
					<comments>https://tech.nkhn37.net/python-logging-config/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Thu, 10 Feb 2022 00:00:00 +0000</pubDate>
				<category><![CDATA[logging]]></category>
		<category><![CDATA[formatters]]></category>
		<category><![CDATA[handler]]></category>
		<category><![CDATA[logger]]></category>
		<category><![CDATA[logging.Filter]]></category>
		<category><![CDATA[ハンドラー]]></category>
		<category><![CDATA[フォーマッタ]]></category>
		<category><![CDATA[ロガー]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=2618</guid>

					<description><![CDATA[Pythonでログ管理をする際に使用するloggingモジュールで設定ファイルを用いて制御する使い方を解説します。 loggingモジュール プログラムを開発する際にはログを出力して、実行時や障害が発生した時に何が起こっ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonでログ管理をする際に使用する<span class="marker"><strong>logging</strong></span>モジュールで設定ファイルを用いて制御する使い方を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="loggingモジュール">loggingモジュール</h2>



<p class="wp-block-paragraph">プログラムを開発する際にはログを出力して、実行時や障害が発生した時に何が起こっているのか把握することが非常に重要です。Pythonでログ出力する場合には<span class="marker"><strong>logging</strong></span>モジュールを使用することができます。</p>



<p class="wp-block-paragraph">本記事ではloggingモジュールを使う際に、設定ファイルを用意して制御をする方法について紹介します。なお、よりシンプルにloggingを使う方法については「<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-logging-basic/" target="_blank">loggingの基本的な使い方</a>」にまとめていますので参考にしてもらえればと思います。</p>



<p class="wp-block-paragraph">以下で説明する設定ファイルやロギングの使用例をコピーして利用いただくだけでも、基本的なログ出力については対応できるかと思いますので、参考に使ってみていただければと思います。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="loggingの設定ファイルの用意">loggingの設定ファイルの用意</h3>



<p class="wp-block-paragraph">loggingを使用する場合には、「logging.ini」といった形でログ設定ファイルを用意しておくと便利です。以下のサンプル例を使って内容を説明します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ===== logging settings
[loggers]
keys=root,simpleExample

[handlers]
keys=logFileHandler,streamHandler

[formatters]
keys=logFileFormatter,simpleFormatter

# ===== logger settings
[logger_root]
level=INFO
handlers=logFileHandler

[logger_simpleExample]
level=DEBUG
handlers=streamHandler
qualname=simpleExample
propagate=0

# ===== log handler settings
[handler_logFileHandler]
class=FileHandler
level=INFO
formatter=logFileFormatter
args=('app.log', 'a', 'utf-8')

[handler_streamHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

# ===== log handler settings
[formatter_logFileFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_simpleFormatter]
format=%(asctime)s - %(levelname)s - %(message)s</pre>



<h4 class="wp-block-heading jinr-heading d--bold" id="logging設定">logging設定</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ===== logging settings
[loggers]
keys=root,simpleExample

[handlers]
keys=logFileHandler,streamHandler

[formatters]
keys=logFileFormatter,simpleFormatter</pre>



<p class="wp-block-paragraph">上記の部分は、ログに関する要素として何があるかを列挙して定義している部分です。</p>



<ul class="wp-block-list jinr-list">
<li><strong>loggers</strong>：ロガーはログを出力するためのものです。ロガーの種類としてどのようなものがあるかを列挙します。</li>



<li><strong>handlers</strong>: 各ロガーがログをどのように扱うかといったハンドラーの種類を列挙します。</li>



<li><strong>formatters</strong>: ログ出力の際にどのような情報をどういったフォーマットで出力するかのフォーマッタの種類を列挙します。</li>
</ul>



<p class="wp-block-paragraph">それぞれkeysとして指定している項目については、以降で個別設定方法についての説明をしていきます。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="logger設定">logger設定</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ===== logger settings
[logger_root]
level=INFO
handlers=logFileHandler

[logger_simpleExample]
level=DEBUG
handlers=streamHandler
qualname=simpleExample
propagate=0</pre>



<p class="wp-block-paragraph"><span class="marker"><strong>logger</strong></span>の部分は、各ロガーの設定を定義します。まず、ロガーで理解しておいてもらいたいのはログレベルについてです。ログレベルには以下の種類があります。</p>



<ul class="wp-block-list jinr-list">
<li><strong>CRITICAL</strong></li>



<li><strong>ERROR</strong></li>



<li><strong>WARNING</strong></li>



<li><strong>INFO</strong></li>



<li><strong>DEBUG</strong></li>
</ul>



<p class="wp-block-paragraph">言葉の意味からも分かるように、上位に記載したレベルの方が緊急度が高いログレベルということなります。プログラムでログレベルを設定すると指定したログレベルより緊急度が高いレベルのログが出力されるようになります。</p>



<p class="wp-block-paragraph">例えば、ログレベルをINFOにしたとしましょう。その際には、ログとして出力されるのはCRITICAL, ERROR, WARNING, INFOです。DEBUGログは出力されません。</p>



<p class="wp-block-paragraph">DEBUGログは開発者がデバッグする際に使うログで、すべて出してしまうとログが大量に出力されてしまい、ログファイルの肥大化を招いてしまいます。そのため、通常アプリケーションを稼働する場合はINFOやWARNINGレベルに設定します。</p>



<p class="wp-block-paragraph">では、logging.iniの設定内容を見ていきましょう。[logger_ロガー名]という記載でそれぞれの定義を記載します。</p>



<ul class="wp-block-list jinr-list">
<li><strong>level</strong>: ログレベルを定義します。上記例では、rootロガーはINFO, simpelExampleロガーはDEBUGとしています。</li>



<li><strong>handlers</strong>: ロガーが使用するログハンドラーを指定します。ハンドラーの詳細は後述します。</li>



<li><strong>qualname</strong>: ロガーの名前を定義します。</li>



<li><strong>propagate</strong>: この値が真の場合は、ロガーに取り付けられたハンドラに加えて、上位のハンドラーにもイベントが渡されます。今回の例では0(偽)としているため、上位ハンドラーには渡されません。公式ドキュメントの説明は<a href="https://docs.python.org/ja/3.9/library/logging.html#logging.Logger.propagate" target="_blank" rel="noreferrer noopener">こちら</a>に記載があります。</li>
</ul>



<h4 class="wp-block-heading jinr-heading d--bold" id="handler設定">handler設定</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ===== log handler settings
[handler_logFileHandler]
class=FileHandler
level=INFO
formatter=logFileFormatter
args=('app.log', 'a', 'utf-8')

[handler_streamHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)</pre>



<p class="wp-block-paragraph"><span class="marker"><strong>handler</strong></span>の部分はログハンドラーの設定を定義します。</p>



<p class="wp-block-paragraph">Pythonにはログハンドラーというものがいくつも定義されています。詳しくは公式ドキュメントの<a rel="noreferrer noopener" href="https://docs.python.org/ja/3.9/library/logging.handlers.html#module-logging.handlers" target="_blank">こちら</a>に記載があります。ファイルに出力する<a rel="noreferrer noopener" href="https://docs.python.org/ja/3.9/library/logging.handlers.html#filehandler" target="_blank">FileHandler</a>やストリームに出力する<a rel="noreferrer noopener" href="https://docs.python.org/ja/3.9/library/logging.handlers.html#streamhandler" target="_blank">StreamHandler</a>の他、ログをメールで送信する<a rel="noreferrer noopener" href="https://docs.python.org/ja/3.9/library/logging.handlers.html#smtphandler" target="_blank">SMTPHandler</a>など色々とあります。</p>



<p class="wp-block-paragraph">ハンドラー設定は[handler_ハンドラー名]という記載で、それぞれのハンドラーの挙動を定義します。</p>



<ul class="wp-block-list jinr-list">
<li><strong>class</strong>: ハンドラーのクラスを指定します。上記の例では、logFileHandlerは「FileHandler」でapp.logにutf-8で追記出力、streamHandlerは「StreamHandler」で標準出力へ出力という設定になっています。</li>



<li><strong>level</strong>: ハンドラーのログレベルを指定します。指定レベルよりも深刻ではないログメッセージは無視されます。</li>



<li><strong>formatter</strong>: ログ出力フォーマットを規定するフォーマッタを指定します。フォーマッタの設定は後述します。</li>



<li><strong>args</strong>: 各ハンドラーの入力引数を指定します。引数は各ハンドラの記載がある公式ドキュメントの<a href="https://docs.python.org/ja/3.9/library/logging.handlers.html#module-logging.handlers" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。</li>
</ul>



<h4 class="wp-block-heading jinr-heading d--bold" id="formatter設定">formatter設定</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ===== log handler settings
[formatter_logFileFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s

[formatter_simpleFormatter]
format=%(asctime)s - %(levelname)s - %(message)s</pre>



<p class="wp-block-paragraph"><span class="marker"><strong>formatter</strong></span>の部分はログ出力フォーマットを指定するフォーマッタの設定を定義をしています。</p>



<p class="wp-block-paragraph">フォーマッタ設定は、[formatter_フォーマッタ名]という記載でそれぞれのフォーマットを定義します。</p>



<p class="wp-block-paragraph">「format=」で指定していますが、%で書かれた部分はLogRecord属性というもので、その部分は属性に該当する情報で補完してログ出力してくれます。上記の例に出てくる項目の意味は以下の通りです。</p>



<ul class="wp-block-list jinr-list">
<li><strong>asctime</strong>: ログが生成された時刻を表示する（例: 2022-02-10 00:00:00,000 ※カンマ以降はミリ秒）</li>



<li><strong>names</strong>: ロギングに使われたロガーの名称</li>



<li><strong>levelname</strong>: ロギングレベル</li>



<li><strong>message</strong>: ログメッセージ</li>
</ul>



<p class="wp-block-paragraph">フォーマットで指定できるLogRecord属性名は他にも色々ありますので、公式ドキュメントの<a rel="noreferrer noopener" href="https://docs.python.org/ja/3.9/library/logging.html#logrecord-attributes" target="_blank">こちら</a>を参照して自分に必要な情報を組み合わせてみてください。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="loggingの基本的な使い方">loggingの使い方</h3>



<p class="wp-block-paragraph">上記で説明してきた「logging.ini」を用意すると後は開発したプログラム側でログを出力するコードを書くことでログが出力できます。以降で開発プログラム側でのログ出力方法について説明します。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="ログの出力方法">ログの出力方法</h4>



<p class="wp-block-paragraph">以下のサンプルプログラムのように記載することでログ出力することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging
import logging.config


def main():
    logging.config.fileConfig('logging.ini')

    # ===== ルートロガーを使用する場合
    logger = logging.getLogger(__name__)

    # アプリケーション内でのログ記載方法
    logger.debug('デバッグメッセージ')
    logger.info('インフォメッセージ')
    logger.warning('ワーニングメッセージ')
    logger.error('エラーメッセージ')
    logger.critical('クリティカルメッセージ')

    # ===== simpleExampleロガーを使用する場合
    logger_s = logging.getLogger('simpleExample')

    # アプリケーション内での記載方法
    logger_s.debug('デバッグメッセージ')
    logger_s.info('インフォメッセージ')
    logger_s.warning('ワーニングメッセージ')
    logger_s.error('エラーメッセージ')
    logger_s.critical('クリティカルメッセージ')


if __name__ == '__main__':
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【app.log出力内容】
2022-02-10 12:27:28,961 - __main__ - INFO - インフォメッセージ
2022-02-10 12:27:28,961 - __main__ - WARNING - ワーニングメッセージ
2022-02-10 12:27:28,961 - __main__ - ERROR - エラーメッセージ
2022-02-10 12:27:28,961 - __main__ - CRITICAL - クリティカルメッセージ</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【コンソールへの標準出力内容】
2022-02-10 12:27:28,962 - DEBUG    - デバッグメッセージ
2022-02-10 12:27:28,962 - INFO     - インフォメッセージ
2022-02-10 12:27:28,962 - WARNING  - ワーニングメッセージ
2022-02-10 12:27:28,962 - ERROR    - エラーメッセージ
2022-02-10 12:27:28,962 - CRITICAL - クリティカルメッセージ</pre>



<p class="wp-block-paragraph">使用方法としては以下の手順で行います。まずは、loggingとlogging.configをインポートします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging
import logging.config</pre>



<p class="wp-block-paragraph">次に、ログ設定ファイル「logging.ini」を読み込みます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">logging.config.fileConfig('logging.ini')</pre>



<p class="wp-block-paragraph">これで設定ファイルの内容が読み込まれます。次に、getLoggerを使って、使用するロガーのインスタンスを作成します。作成している場所は以下の部分です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ===== ルートロガーを使用する場合
logger = logging.getLogger(__name__)

# ===== simpleExampleロガーを使用する場合
logger_s = logging.getLogger('simpleExample')</pre>



<p class="wp-block-paragraph">よく使うのは引数に「__name__」を指定する方法です。これによりメインで動いているときはログに&#8221;__main__&#8221;と出力されますし、パッケージなどを呼び出している際には該当するプログラム名が入ります。</p>



<p class="wp-block-paragraph">また、個別にsimpleExampleロガーをlogger_sの方でインスタンス化しています。</p>



<p class="wp-block-paragraph">ここまででログを出力する準備が整いました。ログを出力する場合には、以下のコードのように使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># アプリケーション内でのログ記載方法
logger.debug('デバッグメッセージ')
logger.info('インフォメッセージ')
logger.warning('ワーニングメッセージ')
logger.error('エラーメッセージ')
logger.critical('クリティカルメッセージ')</pre>



<p class="wp-block-paragraph">メソッド名を見ていただければわかるように、メソッド名がそのままログレベルを表していますので、debugメソッドを使えばDEBUGレベルとして出力をします。</p>



<p class="wp-block-paragraph">ログ出力結果を確認してみましょう。まず、ルートロガーはFileHandlerを使っているためapp.logに出力されます。また、INFOレベルの設定のためDEBUGは出力されていないことが分かるでしょう。</p>



<p class="wp-block-paragraph">一方で、simpleExampleロガーの方は、StreamHandlerを使って標準出力に出力する設定となっているため、ターミナルに結果が表示されます。またDEBUGレベルの設定のためDEBUG以上の全てのレベルが表示されていることが分かるかと思います。</p>



<p class="wp-block-paragraph">以上のようにすることで簡単にログを出力することができます。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="応用-ログフィルタ">応用：ログフィルタ</h4>



<p class="wp-block-paragraph">応用編として、ログの出力内容をフィルタリングする例を見てみましょう。</p>



<p class="wp-block-paragraph">方法としては<span class="marker"><strong>logging.Filter</strong></span>を継承したフィルタ用のクラスを作成して、ロガーをインスタンス化する際に<span class="marker"><strong>addFilterメソッド</strong></span>で設定をしてあげることで実現がきます。</p>



<p class="wp-block-paragraph">以下は&#8217;password&#8217;という文字列が入っているメッセージをログ出力しないようにするためのフィルタ作成例です。passwordのような出力されては問題となるようなものを誤ってプログラムに書いてしまった時の対策として使用できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import logging
import logging.config


class LogPwFilterSample(logging.Filter):
    """ログ出力のフィルタ例
    例）passwordというテキストが入るログメッセージは出力しない
    """
    def filter(self, record: str) -> None:
        """
        :param record: ログレコード
        :return: None
        """
        log_message = record.getMessage()
        return 'password' not in log_message


def main():
    logging.config.fileConfig('logging.ini')

    # ===== simpleExampleロガーを使用する場合
    logger_s = logging.getLogger('simpleExample')
    logger_s.addFilter(LogPwFilterSample())

    # アプリケーション内での記載方法
    logger_s.debug('デバッグメッセージ')
    logger_s.info('インフォメッセージ')
    logger_s.warning('ワーニングメッセージ')
    logger_s.error('エラーメッセージ')
    logger_s.critical('クリティカルメッセージ')
    # ログフィルタを設定しているので以下は出力されない
    logger_s.info('password = xxxxxx')


if __name__ == '__main__':
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
2022-02-10 17:50:46,178 - DEBUG    - デバッグメッセージ
2022-02-10 17:50:46,178 - INFO     - インフォメッセージ
2022-02-10 17:50:46,178 - WARNING  - ワーニングメッセージ
2022-02-10 17:50:46,178 - ERROR    - エラーメッセージ
2022-02-10 17:50:46,178 - CRITICAL - クリティカルメッセージ</pre>



<p class="wp-block-paragraph">確認しやすいように標準出力のストリームに出力するsimpleExampleロガーの方だけで確認しています。</p>



<p class="wp-block-paragraph">結果を見てもわかるように最後に記載している&#8217;password&#8217;という記載があるログについては出力されていないことが分かります。</p>



<p class="wp-block-paragraph">他にも色々なフィルタを試しに作ってみてください。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="loggingの使い方をより細かく知る">loggingの使い方をより細かく知る</h2>



<p class="wp-block-paragraph">上記でloggingの基本的な使用方法を紹介してきましたが、より細かく設定について調べたい場合は、公式ドキュメントの「<a rel="noreferrer noopener" href="https://docs.python.org/ja/3.9/howto/logging.html#logging-howto" target="_blank">Logging HOWTO</a>」を読むことがおすすめです。</p>



<p class="wp-block-paragraph">基本的なloggingチュートリアルから上級ロギングチュートリアルということで色々と記載されていますので、是非確認してみてもらえればと思います。本記事の内容は上級ロギングチュートリアルの内容を参考にしております。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-libraries/logging/config-file" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-logging-config/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-12 05:49:49 by W3 Total Cache
-->