Help us understand the problem. What is going on with this article?

tailコマンドが便利だった件

More than 1 year has passed since last update.

tailコマンドとは

tailはファイルの最終行から数行を表示するコマンドです。デフォルトでは10行表示します。
あるファイルをtailコマンドを使用して表示してみます。

[vagrant@local logs]$ ll
合計 148
-rwxrwxrwx 1 vagrant vagrant  2185 11月  4 02:16 cli-debug.log
-rwxrwxrwx 1 vagrant vagrant 72566 11月  4 02:15 cli-error.log
-rwxrwxrwx 1 vagrant vagrant 11205 11月  4 03:12 error.log
[vagrant@local logs]$ 
[vagrant@local logs]$ tail error.log 
)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history
Stack Trace:
#0 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(114): Cake\Controller\Controller->invokeAction()
#1 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\InquiresController))
#2 /vagrant/sample.com/profile/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}


[vagrant@local logs]$ 

このように最終行から10行表示されました。

また、tailコマンドの後ろにオプションを付ける事が出来ます。

オプション名 意味
-c 出力する文字数を指定
-n 出力する行数を指定
-q ファイル名を表示しない
-v ファイル名を常に表示する
-f 出力を監視する

オプション説明

-cオプション

-cオプションは、tail -c 100 ファイル名とする事で最終行から100文字を出力します。

[vagrant@local logs]$ tail -c 100 error.log 
uting\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}


[vagrant@local logs]$ 

-nオプション

-nオプションは、tail -n 5 ファイル名とする事で最終行から5行表示します。

[vagrant@local logs]$ tail -n 5 error.log 
#1 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\InquiresController))
#2 /vagrant/sample.com/profile/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}


[vagrant@local logs]$ 

-qオプション

-qオプションは、ファイル指定によるコマンド実行以外で使用する際にファイル名を非表示にします。

例えばtail -q error.log←これを叩いてもtail error.logの動きと全く変わりません。
logsディレクトリ配下の.log拡張子のファイルを開きたい時tail *.logとする事で、拡張子が.logのファイルを開きます。

[vagrant@local logs]$ tail *.log
==> cli-debug.log <==
2018-11-04 02:09:41 Debug: command 'whitespace' in plugin 'DebugKit' was not aliased, conflicts with 'DebugKit'
2018-11-04 02:09:41 Debug: command 'migrations' in plugin 'Migrations' was not aliased, conflicts with 'Migrations'

==> cli-error.log <==
#16 [internal function]: Migrations\Shell\MigrationsShell->main('migrations', 'rollback')
#17 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Console/Shell.php(455): call_user_func_array(Array, Array)



==> error.log <==
)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history


[vagrant@local logs]$ 

この時どのファイルを開いているか示されていますよね。
これを非表示にするというのが-qオプションです。
tail -q *.logを叩きます。

[vagrant@local logs]$ tail -q *.log
2018-11-04 02:09:41 Debug: command 'whitespace' in plugin 'DebugKit' was not aliased, conflicts with 'DebugKit'
2018-11-04 02:09:41 Debug: command 'migrations' in plugin 'Migrations' was not aliased, conflicts with 'Migrations'
2018-11-04 02:12:43 Debug: command 'bake' in plugin 'Bake' was not aliased, conflicts with 'Bake'
2018-11-04 02:12:43 Debug: command 'benchmark' in plugin 'DebugKit' was not aliased, conflicts with 'DebugKit'
#16 [internal function]: Migrations\Shell\MigrationsShell->main('migrations', 'rollback')
#17 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Console/Shell.php(455): call_user_func_array(Array, Array)
#18 /vagrant/sample.com/profile/vendor/cakephp/migrations/src/Shell/MigrationsShell.php(156): Cake\Console\Shell->runCommand(Array, true, Array)


)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history
Stack Trace:


[vagrant@local logs]$ 

-vオプション

-vオプションは、ファイル名を常に表示するコマンドなので、ファイル指定してもファイル名を表示させます。
tail -v ファイル名を叩きます。

[vagrant@local logs]$ tail -v error.log 
==> error.log <==
)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history
Stack Trace:
#0 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(114): Cake\Controller\Controller->invokeAction()
#1 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\InquiresController))
#2 /vagrant/sample.com/profile/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}


[vagrant@local logs]$ 

-fオプション

-fオプションは、tail -f ファイル名とする事で、そのファイルの最終行を監視します。

[vagrant@local logs]$ tail -f error.log 
)
Request URL: /inquires/inquires/index
Referer URL: http://local.profile/inquires/history
Stack Trace:
#0 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(114): Cake\Controller\Controller->invokeAction()
#1 /vagrant/sample.com/profile/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\InquiresController))
#2 /vagrant/sample.com/profile/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#3 {main}



最終行を表示したままにします。終了したいときはCtrl+Cで監視を終了します。

何が便利なのか

ログを監視したい時にtailコマンドの-fオプションが非常に相性が良いです。
ログファイルを監視状態にしておく事でリアルタイムでログを確認できます。
これをデバックに使用する事もできる為、便利だと思ったのです。

まずtail -f debug.logでdebugファイルを監視します。

[vagrant@local logs]$ tail -f debug.log 



そしてどこかにdebugコードを仕込みます。
その後、debugコードを仕込んだ対象画面を更新します。
そうするとdebugした内容がリアルタイムで表示されます。

[vagrant@local logs]$ tail -f debug.log 


2018-11-21 09:57:08 Debug:  ほげ

いちいちファイルを開く必要がない、というメリットも便利だと思った理由です。

もし試したことの無い方がいましたら一度いかがでしょうか?
Linuxコマンドと友達になると幸せになります!

tatsuo-iriyama
Web Engineer|96'|高卒|前職:溶接工|2019-01〜ユアマイスター株式会社|
yourmystar
サービス産業のIT化プラットフォーム「ユアマイスター」と大切なものをもっと大切にするメディア「ユアマイスター スタイル」を運営するスタートアップです。
http://corp.yourmystar.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした