2026年11月11日、Pythonで手軽にログを出せるライブラリLoguruの0.8.0が公開されました。前の0.7.3は2024年12月6日の公開だったので、およそ2年ぶりの新しい版です。
今回は、既定のログの形が変わり、時刻にタイムゾーンが付くようになりました。また、Python 3.14で入ったt-stringを、そのままログのメッセージとして渡せるようにもなっています。
ログは、毎日のように目にするものですよね。今回は、0.7.3と0.8.0で同じコードを動かしながら、何が変わったのかを見ていきます。
まずはLoguruとはどんなものか¶
最初に、Loguruを知らない方のために、どんなライブラリなのかを簡単に紹介します。Loguruは、プログラムの動きを記録するログを、少ない手間で出すためのライブラリです。
Pythonには、標準ライブラリのloggingもあります。ただし、loggingは設定の項目が多く、初めて使う人には少しとっつきにくいところがあります。
loggingとの違い¶
Loguruでは、from loguru import loggerの1行だけで、すぐに色付きのログを出せます。違いを、大まかに表にまとめます。
| 項目 | logging | Loguru |
|---|---|---|
| 準備 | ロガーやハンドラーの設定が必要 | importするだけで使える |
| メッセージの書き方 | %sを使う書き方が基本 |
{}を使う書き方 |
| ファイルへの書き出し | ハンドラーを組み立てる | logger.add("app.log")の1行 |
| 標準ライブラリか | 標準ライブラリ | 追加で入れるライブラリ |
loggingの使い方は、こちらで紹介しています。【関連記事】Pythonのロギング(logging)入門
0.8で何が変わったのかを整理しよう¶
続いて、0.8.0の主な変更を表にまとめます。内容は、Loguruの公式リポジトリにある変更履歴CHANGELOG.rstにもとづいています。
| 分類 | 主な変更 |
|---|---|
| 既定の形 | ログの時刻に、タイムゾーンのずれを付ける |
| 新機能 | t-stringを、ログのメッセージとして渡せる |
| 新機能 | 整形する前のメッセージを、record["template"]で取り出せる |
| 新機能 | 子プロセスでloggerを設定し直すlogger.reinstall() |
| 新機能 | rotationに、複数の条件をリストで渡せる |
| 色の設定 | 環境変数のNO_COLORとFORCE_COLORに従う |
| 安全面 | 色の指定を読む処理で、ReDoSと呼ばれる問題が起きうる点を修正 |
PyPIの記録によると、0.8.0が必要とするPythonは3.5以上と書かれています。古いPythonからも使える、間口の広いライブラリです。
ログの時刻に、タイムゾーンが付いた¶
まずは、誰にでも関係する変更から見ていきましょう。変更履歴によると、既定のログの形に、タイムゾーンのずれが含まれるようになりました。
変更履歴では、そのほうがあいまいさの少ないログになるから、と説明されています。
0.7.3と0.8.0で比べてみた¶
実際に、同じコードを2つの版で動かしてみました。
import sys
from loguru import logger
logger.remove()
logger.add(sys.stdout, colorize=False)
logger.info("注文を受け付けました")
logger.warning("在庫が残り{}個です", 3)
0.7.3と0.8.0を、それぞれ新しい仮想環境に入れ、日本時間に設定して、手元のPython 3.11で実行した結果です。
Loguru 0.7.3
2026-11-12 11:48:36.680 | INFO | __main__:<module>:7 - 注文を受け付けました
2026-11-12 11:48:36.680 | WARNING | __main__:<module>:8 - 在庫が残り3個です
Loguru 0.8.0
2026-11-12 11:48:36.764 +09:00 | INFO | __main__:<module>:7 - 注文を受け付けました
2026-11-12 11:48:36.764 +09:00 | WARNING | __main__:<module>:8 - 在庫が残り3個です
0.8.0では、時刻の後ろに+09:00が付きました。これは、世界の基準の時刻より9時間進んでいる、つまり日本時間であることを表しています。
なぜ嬉しいのか¶
サーバーは、日本時間ではなく、世界の基準の時刻で動いていることがよくあります。時刻だけでは、それが日本時間なのか、9時間ずれた時刻なのか、ログを見ただけでは判断できません。
タイムゾーンの考え方については、こちらで紹介しています。【関連記事】Pythonのdatetimeとは?
ログを読み取るプログラムに注意¶
一方で、ログの形が変わったので、ログを読み取って集計しているプログラムには影響が出るかもしれません。時刻の部分を決まった形で切り出している場合は、上げる前に確かめておきましょう。
もとの形に戻したい場合は、logger.add()のformat引数に、自分で形を指定すれば大丈夫です。
t-stringをそのまま渡せるようになった¶
続いて、新機能です。変更履歴によると、0.8.0では、テンプレート文字列、つまりt-stringをログのメッセージとして使えるようになりました。
t-stringは、Python 3.14で加わった、t"..."と書く新しい文字列の書き方です。f-stringとよく似ていますが、すぐに1つの文字列にせず、文字の部分と埋め込んだ値を分けたまま持っておけるのが特徴です。
Python 3.15で試してみた¶
t-stringはPython 3.14以上でしか書けないので、ここではPython 3.15.2を使いました。名前と個数をt-stringで埋め込んだメッセージを、2つの版で出してみます。
name = "taro"
count = 3
logger.info(t"{name}さんが{count}個買いました")
実行した結果です。
Loguru 0.7.3
INFO | Template(strings=('', 'さんが', '個買いました'), interpolations=(...))
Loguru 0.8.0
INFO | taroさんが3個買いました
0.7.3では、t-stringの中身がそのまま表示されてしまいました。0.8.0では、ふつうの文章として読める形で記録されています。
f-stringの基本は、こちらで紹介しています。【関連記事】Pythonのf-stringとは?
整形する前のメッセージを取り出せる¶
0.8.0では、record["template"]で、値を埋め込む前のメッセージを取り出せるようになりました。recordとは、Loguruが1つのログについて持っている、時刻やレベルなどの情報をまとめたものです。
試してみた¶
ログを受け取った関数の中で、整形後のメッセージと、整形前のメッセージを並べて表示してみました。
def show(message):
r = message.record
print("message :", r["message"])
print("template:", r.get("template"))
logger.add(show, format="{message}")
logger.info("{}さんが{}個買いました", "taro", 3)
0.8.0では、templateに{}さんが{}個買いましたと、値を埋める前の形が入っていました。0.7.3では、templateという項目そのものがなく、Noneでした。
値が違っても同じ種類のログを、1つにまとめて数えたいときに便利です。たとえば、どの種類のエラーが多いかを集計するときに役立ちます。
logger.catch()を、async withで使えるように¶
もう1つ、非同期のプログラムを書く人に嬉しい変更があります。logger.catch()は、ブロックの中で起きた例外をログに記録して、プログラムを止めずに続けるための仕組みです。
変更履歴によると、0.8.0では、このlogger.catch()を、async withで使える非同期のコンテキストマネージャーとしても使えるようになりました。
0.7.3と0.8.0で試してみた¶
非同期の関数の中で、わざと0で割るエラーを起こしてみました。
import asyncio
import sys
from loguru import logger
logger.remove()
logger.add(sys.stdout, colorize=False, format="{level} | {message}")
async def main():
async with logger.catch(message="注文の処理で問題が起きました"):
await asyncio.sleep(0)
1 / 0
print("プログラムは止まらずに続いた")
asyncio.run(main())
実行した結果の、要点だけを載せます。
Loguru 0.7.3
TypeError: 'Catcher' object does not support the asynchronous context manager protocol
Loguru 0.8.0
ERROR | 注文の処理で問題が起きました
ZeroDivisionError: division by zero
プログラムは止まらずに続いた
0.7.3では、async withに対応していないというTypeErrorになりました。0.8.0では、エラーがログに記録されたうえで、プログラムは止まらずに次の行へ進んでいます。
そのほかの変更¶
ほかにも、使い勝手が良くなる変更がたくさん入っています。手元で試したものを、表にまとめます。
| 変更 | 0.7.3 | 0.8.0 |
|---|---|---|
rotation=["100 KB", "00:00"]のように複数の条件を渡す |
TypeErrorで受け付けない | 受け付けた |
| FORCE_COLOR=1で、パイプに出すときも色を付ける | 色の記号が付かなかった | 色の記号が付いた |
rotationは、ログのファイルを一定の大きさや時刻で切り替える仕組みです。0.8.0では、大きさが100KBを超えるか、日付が変わるか、どちらかで切り替える、といった指定ができます。
変更履歴によると、子プロセスでloggerを設定し直すlogger.reinstall()も加わりました。multiprocessingで別のプロセスを使うときに便利だと説明されています。
プロセスの使い方は、こちらで紹介しています。【関連記事】Pythonのmultiprocessingとは?
上げる前にやっておきたいこと¶
最後に、Loguruを0.8.0へ上げる前に確かめておきたいことを整理します。
| 順番 | 確認すること |
|---|---|
| 1 | ログを読み取るプログラムが、時刻の後ろの+09:00で困らないか |
| 2 | 色の設定を、NO_COLORやFORCE_COLORの環境変数で変えていないか |
| 3 | Python 3.14以上なら、t-stringでログを書いてみる |
私は10年ほどエンジニアとして開発に関わってきましたが、障害のときに、ログの時刻が日本時間なのか世界の基準の時刻なのかわからず、原因の特定に時間がかかったことがあります。タイムゾーンが最初からログに付くのは、地味ですがとてもありがたい変更です。
まとめ¶
2026年11月11日、Loguru 0.8.0が、およそ2年ぶりに公開されました。既定のログの形にタイムゾーンが付くようになり、t-stringをログのメッセージとして使えるようになったほか、整形前のメッセージの取り出しや、複数の条件でのファイルの切り替えにも対応しています。
ログの形が変わるので、ログを読み取るプログラムがある方は、上げる前に確かめておきましょう。
ここまでお読みいただきありがとうございました。