Portage ログ
Portage ログは、パッケージのインストール、更新、または削除時に、情報を提示します。
emerge を使用してパッケージを構築すると、Portage 自身から送られるメッセージに気づくのは珍しいことではありません。メッセージには Gentoo 開発者からの重要な情報が含まれる場合がありますので読むべきです。しかし、多くの場合には急速に画面の外にスクロールしてしまって、そのときには読めません。これは、elog と呼ばれる Portage の機能を有効にすることで、容易に解決することができます。elog の目的は、あとから読むためにメッセージをディスクに保存することです。しかし、他のロギング機能も同様に存在します……。
Portage elog サブシステム
Portage elog サブシステムは、システム管理者または root ユーザーの注意を引き付けるために ebuild に開発者が入れた特定の、ebuild が生成したログメッセージを追跡します。 これらのメッセージにはパッケージのビルドに関連した情報が含まれ、それはしばしば重要だったり関心をもつべきものだったりします。
セットアップ
PORTAGE_ELOG_CLASSES 変数を介してログに記録する情報の種類を選択してください。可能な値は、info
、warn
、error
、log
および qa
です:
PORTAGE_ELOG_CLASSES="log warn error"
ファイルへの保存の設定
Portageは、多くの方法で elog イベントを処理することができます。
ディスクに elog のイベントを保存するためには、PORTAGE_ELOG_SYSTEM 変数の save
モジュールを有効化してください:
# 警告: 'save' だけでは emerge 時にメッセージが表示されません! 保存*および*表示を実行させるには 'echo' を追加してください。
#PORTAGE_ELOG_SYSTEM="save"
# emerge 後にメッセージを表示*および*保存する
PORTAGE_ELOG_SYSTEM="echo save"
メッセージは、/var/log/portage/elog または${PORTAGE_LOGDIR}/elog(当該の変数が設定されている場合)に保存されます。
カテゴリ毎に elog ファイルを作成するには、Portage のsplit-elog
機能を有効にしてください。これは、/var/log/portage/elog という場所にカテゴリベースのサブディレクトリを作成することを、Portage に強制します。
さらに、カテゴリ毎にビルドログを作成するには、Portage のsplit-log
機能を有効にしてください。これは、/var/log/portage/build という場所にカテゴリベースのサブディレクトリを作成することを、Portage に強制します。
ログを調べるためのスクリプト
ログが分割されていると、それらをひとつずつ確認するのはちょっと面倒です。以下は日付を使用して、それらを印字するスクリプトの例です:
#!/bin/bash
# このスクリプトは、portage がログを分離して /var/log/portage/elog に
# 保存するように設定されていることを仮定しています。
#
# 特定の日の情報が欲しい場合は、次のようにスクリプトを実行してください:
# GET_DATES="20230101 20230102" ./print_elog_messages.sh
#
# すべてのファイルを印字したい場合は、次のようにスクリプトを実行してください:
# GET_ALL="true" ./print_elog_messages.sh
#
# スクリプトファイル名が異なる場合は、それに従って修正してください!
# root として実行されているか確認し、もしそうであれば停止します。
current_user=$(whoami)
[ -z "$current_user" ] && echo "whoami が空文字列を返しました" && exit 1
[ "$current_user" == "root" ] && echo "root として実行しないでください、その必要はありません!" && exit 1
# 確認する期間を設定します。これらの文字列は "date" ツールによって解釈されます。
declare -a days=("today" "yesterday")
# カスタム日付が宣言されている場合は、配列をそれに変更します。
[ -n "$GET_DATES" ] && declare -a days=("$GET_DATES")
# すべてを印字する場合は複数回ループする理由はなく、
# 期間を "all" に変更するのは筋が通っています。
[ "$GET_ALL" == "true" ] && declare -a days=("all")
# 配列 "days" 内で設定されている期間を走査し、YYYYmmdd、例えば 20221215 を
# 含むファイル名を見つけるためにフォーマットします。デフォルトではそれが
# ファイル名の一部であるようなフォーマットだからです。その後、見つかった
# ファイル名を引数としてコマンド cat を実行し、ファイルの内容を端末の
# 出力に追加します。行番号を印字したくない場合は、cat から -n 引数を
# 削除してください。
for val in ${days[@]}; do
echo " ===== $val ====="
find /var/log/portage/elog -name \
"*$([ "$GET_ALL" == "true" ] || date --date=$val +%Y%m%d)*" \
-type f -print -exec cat -n '{}' \;
done
電子メール機能を設定
ログをメール送信するために、mail
モジュール有効化。 メールオプションは、いくつかの追加の変数を設定することが必要です。 詳細については、/usr/share/portage/config/make.conf.exampleをお読みください。
以下のセットアップ例がわかりやすいでしょう:
# これは e メールの送信のみを行います; 代わりに "mail save" のようにしたほうがいいかもしれません。
PORTAGE_ELOG_SYSTEM="mail"
# 送信先アドレスと、SMTP サーバ名
PORTAGE_ELOG_MAILURI="log-intake@example.com mail.example.com"
PORTAGE_ELOG_MAILFROM="portage@$(hostname).example.com"
PORTAGE_ELOG_MAILSUBJECT="\${PACKAGE} is \${ACTION} on \${HOST}"
nullmailerやsendmailを使う例もあります:
# これは e メールの送信のみを行います; 代わりに "mail save" のようにしたほうがいいかもしれません。
PORTAGE_ELOG_SYSTEM="mail"
# 送信先アドレスと、SMTP サーバ名
PORTAGE_ELOG_MAILURI="users@host /usr/sbin/sendmail"
PORTAGE_ELOG_MAILFROM="portage@$(hostname).example.com"
PORTAGE_ELOG_MAILSUBJECT="\${PACKAGE} is \${ACTION} on \${HOST}"
関連するソフトウェア
以下は、elog 関連のソフトウェアパッケージの一覧です。
- app-portage/elogv - curses ベースの、elog の内容を解析するユーティリティ。
- app-portage/elogviewer - Python ベースの elog ビューア。
ビルドログ
パッケージのビルドログは、make.conf で変数を設定することにより、ディスク上に保存したりリモートの宛先にメールで送信したりすることができます。これにより、システム管理者が後でビルドを確認できるようになります。
デフォルトでは emerge の実行中、Portage はパッケージのビルドログを一時的に /var/tmp/portage/<カテゴリ>/<パッケージ名-バージョン>/temp/build.log に保存します。emerge が成功したときにビルドディレクトリは削除されるため、成功したビルドログは失われるでしょう。一方、ビルドが失敗したときにはログは保持されるため、build.log はサポートチケットに添付するために利用することができるでしょう。
注意: FEATURES で compress-build-logs
が設定されていると、build.log に追加の拡張子が続いているかもしれません。デフォルトの PORTAGE_TMPDIR は /var/tmp です。それが make.conf で別の場所に設定されている場合は、それに従ってパスを微調整してください。
常にビルドログを保存する
ビルドログの保存を有効化するには、/etc/portage/make.conf を編集して、PORTAGE_LOGDIR
にログファイルを保存する場所を設定してください:
PORTAGE_LOGDIR="/var/log/portage"
ログファイルの場所としては、PORTAGE_LOGDIR が以前に空または未設定だった場合に elog サブシステムの elog ディレクトリとなる、/var/log/portage を選択するのが慣習的です。
/etc/portage/make.conf 内で多数の FEATURES 設定を設定することができます。これらは Portage がビルドログをどのように処理するかに影響を与えます:
binpkg-logs
を設定すると、バイナリパッケージの展開時にもログが保存されます。clean-logs
を設定すると、定期的にログファイルのクリーン操作が実行されます。実行されるコマンドは PORTAGE_LOGDIR_CLEAN によって定義され、デフォルトでは 7 日分のファイルが保持されます。split-elog
を設定すると、elog 通知は${PORTAGE_LOGDIR}/elog
の下の、各カテゴリの名前を付けられたサブディレクトリの中に保存されますsplit-log
を設定すると、ビルドログは${PORTAGE_LOGDIR}/build
の下の、各カテゴリの名前を付けられたサブティレクトリの中に保存されます
Portage バージョン 2.3.53 まで、PORTAGE_LOGDIR 変数はPORT_LOGDIR という名前でした。この古い名前は現在は非推奨です。
後片付け
/etc/portage/make.conf の FEATURES 変数で clean-logs
が有効化されている場合、Portage は PORTAGE_LOGDIR_CLEAN で定義されているコマンドを、毎回のビルドあるいは unmerge 操作後に実行します。デフォルトでは、以下のコマンドが使用されます:
PORTAGE_LOGDIR_CLEAN="find \"\${PORTAGE_LOGDIR}\" -type f ! -name \"summary.log*\" -mtime +7 -delete"
もし任意のコマンドを定義する場合、PORTAGE_LOGDIR 変数をエスケープするのを忘れないでください (あるいは直接正しい場所にハードコードしてください)。
Portage バージョン 2.3.53 まで、PORTAGE_LOGDIR_CLEAN 変数はPORT_LOGDIR_CLEAN という名前でした。この古い名前は現在は非推奨です。
その他の Portage ログファイル
Portage は /var/log/emerge.log および /var/log/emerge-fetch.log にもログファイルを作成することができます。
関連項目
外部資料
- Sven Vermeulen。"Underestimated or underused: Portage (e)logging"、2013 年 9 月 25 日。2019 年 5 月 30 日取得。