【Linux】tailとlessの使い分けが出来ないので、検証して考える。(ログ監視)

# tailとlessでログ監視を行える
linuxでログ監視を行う際に、tailコマンドを使用して監視する事があります。
運用業務では、`tail -f ファイル名`で監視を行う事が多いのではないのでしょうか？私は普段tailfコマンドを使用しています。

業務ではあまり使う事はないのですが、lessコマンドでもログ監視を行う事が出来ます。
tailとの違いは、ファイルを開いた状態で`!でコマンド実行や/で検索`が行える事でしょうか？


基本的には、好みで使い分けでいいのかなと考えています。
私がtailfコマンドを使っている理由はシンプルにログが見やすいからです。

今回は、二つのコマンドでログ監視を行う際にどのような違いがあるのかを検証しました。
結果を下記に記載しています。


* [tail -f コマンド と less +F の挙動について](#tail--f-コマンド-と-less-f-の挙動について)
* [tail -F コマンド と less -follow-name +F の挙動について](#tail--f-コマンド-と-less--follow-name-f-の挙動について) 
* [複数ファイルで監視する場合](#複数ファイルで監視する場合)

## tail -f コマンド と less +F の挙動について
`tail -f コマンド`と`less +F コマンド`を使用して、ログ監視を行っていきます。
ファイルに書き込むを行う、簡単なスクリプトを作成しました。
```:サンプルスクリプト
touch nyao.txt
sleep 3

for((i=1;i<6;i++))

do
    
    #5回nyao.txtに書き込み
    echo "${i}_にゃお" >> nyao.txt
    sleep 1

done
```

まず、tailで書き込みの監視を行います。
サンプルスクリプトをバックグラウンドで実行して、tailコマンドを叩きます。

```:tail -f コマンド検証
[root@localhost tmp]# bash test.sh &
[1] 1868
[root@localhost tmp]# tail -f nyao.txt
1_にゃお
2_にゃお
3_にゃお
4_にゃお
5_にゃお

```

想定通り動きました。5回の書き込みを行った後は、サンプルスクリプトは終了となります。
以降は書き込みされないので、`tail -f　コマンド`をCtrl + C で終了します。

お次は、`less +F コマンド`で監視します。
lessコマンド実行後は、ファイルが開かれ、`Waiting for data... (interrupt to abort)`とメッセージが出てきます。
検索したい/コマンド実行したいと思った場合はCtrl + C で監視から抜ける必要があります。また、監視したい場合は Shift + F で戻れます。
lessを終了したい場合は、Ctrl + C　の後に q を叩きます。



```:less +F コマンド検証
[root@localhost tmp]# rm -f nyao.txt
[root@localhost tmp]# bash test.sh &
[1] 1948
[root@localhost tmp]# less +F nyao.txt

...skipping...
1_にゃお
2_にゃお
3_にゃお
4_にゃお
5_にゃお
Waiting for data... (interrupt to abort)
```

lessで便利に色々やりたいという方は、lessの方がいいかもしれないですね。
編集して別名でファイル保存したりも出来ますからね。
私はlessを効率よく使えていないです。ファイル閲覧する位でしか使ってないです。
これを機に少し勉強してみようかな、、


## tail -F コマンド と less -follow-name +F の挙動について
お次は、`tail -F コマンド`を使用してみます。

ログローテでファイル名が変更されると、監視が途切れてしまう可能性があります。
ログローテした際にも、引き続きファイルの監視を行いたい場合に`tail -F コマンド`を使用します。
時間帯やファイルサイズをトリガーにして、ログローテしているファイル等を監視したい場合などに便利です。

では、サンプルスクリプトを作成します。

【サンプルスクリプトの動き】
まず、1_nyao.txtを作成します。
1_nyao.txt に 5回 "にゃお" と書き込んだ後に、ファイル名の変更を行っています。
最終的には1_nyao.txtのファイル名変更を行い、スクリプトは終了します。

今回は、`tail -F 1_nyao.txt`で監視を行います。


```:サンプルスクリプト
sleep 3

for((i=1;i<6;i++))

do

#ファイル作成
touch 1_nyao.txt && echo "${i}週目" > 1_nyao.txt

        for((j=1;j<6;j++))
        
        do
            
            echo "${j}_にゃお" >> 1_nyao.txt
            sleep 1
        
        done

#ファイル名変更
Time=`date '+%Y%m%d%H%M%S'`
mv 1_nyao.txt ${Time}_nyao.txt

done
```

では、サンプルスクリプトをバックグラウンドで実行します。
そして、tailコマンドを叩きます。


```:tail -F コマンド検証
[root@localhost tmp]# bash test_2.sh &
[3] 2834
[root@localhost tmp]# tail -F 1_nyao.txt
1週目
1_にゃお
2_にゃお
3_にゃお
4_にゃお
5_にゃお
tail: `1_nyao.txt' はアクセス不能になりました: そのようなファイルやディレクトリはありません
tail: `1_nyao.txt' が現れました。新しいファイルの終端を追跡します
2週目
1_にゃお
2_にゃお
3_にゃお

...etc

5週目
1_にゃお
2_にゃお
3_にゃお
4_にゃお
5_にゃお
tail: `1_nyao.txt' はアクセス不能になりました: そのようなファイルやディレクトリはありません
```

ファイル名が変更された際に、`tail:1_nyao.txt' はアクセス不能になりました: そのようなファイルやディレクトリはありません`と出力されました。そのままですが、1_nyao.txt がないよと言ってくれてます。

そして、1_nyao.txtが作成された際に`tail: 1_nyao.txt' が現れました。新しいファイルの終端を追跡します`と出力されました。これもそのままですが、1_nyao.txt を見つけたから監視するねと言ってくれてます。


最終的に 1_nyao.txt はリネームされてしまうので、`tail:1_nyao.txt' はアクセス不能になりました: そのようなファイルやディレクトリはありません`とメッセージが出力されてます。


お次に、`less --follow-name +F` コマンドを使用して監視します。
あんまり慣れていないので、便利な使い方が分からないのですが、、実行結果だけを残しておきます。
tailコマンドのように、プロンプトにローテ前のメッセージが残ってもらうと分かりやすいのですが、残っていないです。

![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710307/a15f6331-bbdc-924f-1f04-1c6c57078540.gif)

## 複数ファイルで監視する場合

最後に複数ファイルの監視を行います。
tail -f 複数ファイル　で複数ファイルの監視を行えます。

またまた、サンプルスクリプトを作成します。

```:サンプルスクリプト
touch nyao.txt wan.txt

sleep 3

for((i=1;i<4;i++))

do

        echo "${i}_にゃお" >> nyao.txt && echo "${i}_わん" >> wan.txt
        sleep 1

done
```

tailコマンドを実行します。
ワイルドカードを使用して、ファイルを指定します。

何かしらの検証でしか使った事ないです。運用作業ではあんまり使わない印象です。
アプリログ等をユーザー毎に分けてる時とかには使うのかな？

```:tail -f 複数ファイル検証
[root@localhost tmp]# bash test_3.sh &
[1] 3613
[root@localhost tmp]# tail -f *txt
==> nyao.txt <==
1_にゃお

==> wan.txt <==
1_わん

==> nyao.txt <==
2_にゃお

==> wan.txt <==
2_わん

==> nyao.txt <==
3_にゃお

==> wan.txt <==
3_わん
```

lessコマンドについても、tailコマンド同様に複数ファイルの監視を行えます。
`less +F 複数ファイル`で複数ファイルの監視をします。

監視から一旦抜けて、ページ移動を行い、監視に戻る で監視ファイルの切り替えが行えます。

```:less +F 複数ファイル検証
[root@localhost tmp]# bash test_3.sh &
[1] 3956
[root@localhost tmp]# less +F *.txt

～～～ less実行 ～～～
1_にゃお
2_にゃお
3_にゃお
Waiting for data... (interrupt to abort)

# Ctrl + C 実行

1_にゃお
2_にゃお
(END) - Next: wan.txt

# :n 実行

1_わん
2_わん
wan.txt　(file 2 of 2) (END)

# Shfit + f で監視再開
```

複数のファイルはtail/lessにしても、個人的には見づらいです。
複数のターミナルで見た方が見やすいです。

## 最後に
1ファイルの監視であれば、lessコマンド便利ですね。
複数ファイル/ローテーションがある場合は、個人的にはtailコマンドの方がいいなと思いました。

そして、検証に4時間位掛かったのが地味に痛かったです。
長い記事書いてる人、まじすごいです。