概要
開発時や障害発生時等にログファイルを見るとき等にtail -f
コマンドで垂れ流してエラー内容を確認したりすると思いますが、その際less +F
の方が便利かもしれないですよーという話です。
詳細
$ less +F /var/log/httpd/error_log
またはオプションを指定せずに
$ less /var/log/httpd/error_log
で開いた後でShift + F
と入力することで、tail -f
と同じく追記されていくファイルの内容を見ることができます。
この状態のときは画面下部にWaiting for data... (interrupt to abort)
と表示されます。
この状態から抜けるにはCtrl + C
で抜け、ファイル自体を閉じるにはq
で閉じます。
メリット/デメリット
less +F
を使うメリットとして
-
less
の場合、Shift + F
でログの垂れ流しモード、Ctrl + C
で垂れ流しを止めて(ファイルの開き直しをすることなく)詳細を見ることができる- また、垂れ流しを止めた状態であれば検索やページスクロール等のコマンドを使うことができる
デメリットとして
-
tail -f
の場合、Enterを連続して押して空行を開けて次に表示されるログをわかりやすくすることができますが、less +F
の場合はEnterを押しても空行を開けることができない - スクロールするときには一旦
Ctrl + C
でコマンドが受け付けられる状態にする必要がある
という点で自分は多少デメリットに感じました。
また、tail
では
-
tail -F
とすることでローテートしたファイルを追従してくれる -
tail -f file1.log file2.log
のようにすると複数ファイルを追従することができる
といったメリットもありますが、自分は使ったことがなかったので、あまり大きなデメリットには感じませんでした。
使用例
他のオプションと併用した使用例を記載します。
※tailでも可能な場合はtailのコマンドも記載しています。
文字列検索(ハイライト)しながら表示する
### less の場合
$ less +F +/ERROR /tmp/test.log
コマンド | 説明 |
---|---|
+F | 追記される分も表示する |
+/文字列 | 指定文字列で検索(ハイライト表示される)します。(正規表現可) |
フィルターしながら表示する
### less の場合 (コマンド入力後、Enter2回押す必要あり)
$ less +F +\&ERROR /tmp/test.log
### または
$ less +F +'&ERROR' /tmp/test.log
### tail の場合
$ tail -f /tmp/test.log | grep ERROR
コマンド | 説明 |
---|---|
+F | 追記される分も表示する |
+&文字列 | 指定文字列が含まれる行のみ表示する |
※フィルターを解除するにはCtrl + C
で垂れ流し状態を終了し、
&
を押すと&/
(フィルター文字列指定状態)の表示になるため、何も入力せずにEnterを押します。
(別な文字列でフィルターを掛けるときは&/
が表示されている状態でフィルター文字列を入力しEnterを押します)
長い行を折り返さず表示
折り返さずに表示(エラーの発生時間と種類ぐらいが見れればいいとき等)したいときに使用
$ less +F -S /tmp/test.log
コマンド | 説明 |
---|---|
+F | 追記される分も表示する |
-S | 右端で折り返さずに表示 |
ただし、表示しきれていない横の範囲を表示するには一旦Ctrl + C
で+F
が効いている状態を抜けてからでないとカーソル左右が効かないので注意
行番号も表示する
(ログの表示とかではあんまり使わないかも。。。)
$ less +F -N /tmp/test.log
Lessコマンド使用時に使うオプションやコマンド等まとめ
よく使いそうなものだけ記載します。
コマンド | 内容 |
---|---|
+F | 追記される分も表示する |
-N | 行番号表示の切り替え |
-S | 右端で折り返しの切り替え |
/文字列 | 文字列で検索を行い、ハイライト表示する |
-J | /文字列で検索にヒットした行の左に * マークを表示する |
&文字列 | 文字列で検索を行い、ヒットした行のみを表示する |
備考等
パフォーマンスについて
参考: Stack Exchange: Is tail -f
more efficient than less +F
?
lessはファイル全体を読み込むのに対し、tailはファイルの最後の方しか読み込まないので大きなファイルを読み込む場合にはlessはパフォーマンスが悪くなるようです。
また、tailの場合、ファイル変更通知サービスを使って新しいデータを表示するのに対し、lessはループでチェックをするため、最大1秒のラグがあるそうです。
(QAサイトの回答参照で、コマンド実装のソースを見るまでは至っていませんが、上記のような理由でtailの方がパフォーマンスで劣る面もあるらしいです。)