はじめに
今回もUbuntu Packages
を見ていたらlogsave
というコマンドを見つけたのでこれを試してみる。
logsave
コマンドは、コマンドの実行結果を指定したログファイルに自動的に保存するユーティリティである。
標準出力と標準エラー出力の両方をキャプチャしてコマンドの実行記録を残すことができるとのこと。
環境
Windows 11 Professional
WSL2 Ubuntu 24.04 LTS
logsave (e2fsprogs) 1.47.0
logsaveのインストール
logsave
はe2fsprogs
パッケージに含まれているため、Ubuntu
では標準でインストールされている。
もしインストールされていない場合は、以下のコマンドでインストールができる。
※今回はインストール済みだったため以下のコマンドは実施していない。
sudo apt update
sudo apt install e2fsprogs
man logsave
詳細
LOGSAVE(8) System Manager's Manual LOGSAVE(8)
NAME
logsave - save the output of a command in a logfile
SYNOPSIS
logsave [ -asv ] logfile cmd_prog [ ... ]
DESCRIPTION
The logsave program will execute cmd_prog with the specified argument(s), and save a copy of its
output to logfile. If the containing directory for logfile does not exist, logsave will accumu‐
late the output in memory until it can be written out. A copy of the output will also be written
to standard output.
If cmd_prog is a single hyphen ('-'), then instead of executing a program, logsave will take its
input from standard input and save it in logfile
logsave is useful for saving the output of initial boot scripts until the /var partition is
mounted, so the output can be written to /var/log.
OPTIONS
-a This option will cause the output to be appended to logfile, instead of replacing its cur‐
rent contents.
-s This option will cause logsave to skip writing to the log file text which is bracketed with
a control-A (ASCII 001 or Start of Header) and control-B (ASCII 002 or Start of Text).
This allows progress bar information to be visible to the user on the console, while not
being written to the log file.
-v This option will make logsave to be more verbose in its output to the user.
AUTHOR
Theodore Ts'o ([email protected])
SEE ALSO
fsck(8)
E2fsprogs version 1.47.0 February 2023 LOGSAVE(8)
logsaveを使ってみる
コマンド書式
logsave [オプション] ログファイル名 実行するコマンド
試してみる
logsave test.log echo "Hello,World!"
結果
~ logsave test.log echo "Hello,World"
Hello,World
~ cat test.log
Log of echo Hello,World
Sun Jun 8 05:04:59 2025
Hello,World
Sun Jun 8 05:04:59 2025
----------------
これでtest.log
ファイルに"Hello, World!“の出力が保存される。
ファイルシステムチェックの例
logsave
は元々ファイルシステムツールと一緒に使用されることを想定して作られている。
※fsck
(ファイルシステムチェック)など、起動時や回復時の重要コマンドの出力をログとして残すため
/dev/sdc
は各自のデバイスを確認すること(df
コマンドなど)
sudo logsave fsck.log sudo fsck -y /dev/sdc
この例では、/dev/sdc
のファイルシステムチェック結果をfsck.log
に保存する。
実用例
システムメンテナンス作業の記録例
システムメンテナンス作業で、作業履歴および時間を計測することができる。
# パッケージアップデートの記録
sudo logsave /var/log/system-update.log sudo apt update && sudo apt upgrade -y
# ディスク使用量チェックの記録
logsave disk-usage.log df -h
# システム情報の記録
logsave system-info.log uname -a
バックアップ作業の記録例
# rsyncを使ったバックアップの記録
logsave backup-$(date +%Y%m%d).log rsync -av /home/user/documents/ /backup/documents/
# tarを使ったアーカイブ作成の記録
logsave archive-$(date +%Y%m%d).log tar -czf backup.tar.gz /important/data/
長時間実行されるコマンドの監視例
# 大きなファイルのダウンロード記録
logsave download.log wget https://example.com/largefile.zip
# データベースダンプの記録
logsave db-backup.log mysqldump -u user -p database_name > backup.sql
便利なオプション
-a
オプション(追記モード)
既存のログファイルに追記したい場合は-a
オプションを使用する。
logsave -a system-check.log echo "=== System Check Started ==="
logsave -a system-check.log free -h
logsave -a system-check.log ps aux | head -10
logsave -a system-check.log echo "=== System Check Completed ==="
他のログ取得方法との比較
tee
コマンドとの違い
# teeの場合(標準出力とファイルの両方に出力)
echo "Hello" | tee output.log
# logsaveの場合(標準出力とファイルの両方に出力、コマンドを直接指定)
logsave output.log echo "Hello"
tee
はパイプラインで使用し、logsave
はコマンドを直接実行する。
リダイレクトとの違い
# リダイレクトの場合(標準出力のみ)
echo "Hello" > output.log
# logsaveの場合(標準出力と標準エラー出力の両方)
logsave output.log echo "Hello"
logsave
は標準エラー出力も自動的にキャプチャする。
とはいえ、リダイレクトであれば 2>&1
を指定すれば標準出力にエラー出力も含められるので、標準出力をファイルに保存するという観点であればあまり変わらない。
参考
Ubuntu Packages - logsave
https://packages.ubuntu.com/noble/admin/logsavelogsave | ubuntu manuals
https://manpages.ubuntu.com/manpages/focal/ja/man8/logsave.8.html
おわりに
logsave
コマンドは、コマンドの実行結果を確実にログファイルに保存する便利なツールである。
基本的にリダイレクト機能使えばコマンドの結果自体は保存できるが、タイムスタンプなども記録したい場合はlogsave
を使うとよさそう。
使う機会は多くないと思うがログ取りや時間を計測したいコマンドのログをとりたいというときに便利そうだなと思った。
実用例でも記載したが、特に以下の場面で有効と思う。
- システムメンテナンスの作業履歴と時間 (アップデートされるパッケージなど)
- 定期的なバックアップ処理
- 長時間実行されるバッチ処理
機会があれば使っていこうと思う。