読者です 読者をやめる 読者になる 読者になる

logrotateメモ

前提

logrotate 3.10.0
CentOS 7 (6でも一緒な気がする)

今回の内容

やりたいこと

  • ログのローテーションをlogrotateで管理したい
  • ファイルサイズが特定値に達したらローテーションして、また1日1回ローテーションしてほしい

補足

logrotateの設定で、sizeとdailyを指定していたのですが、ファイルサイズが指定サイズを超えてもローテーションしてくれませんでした。minsizeというものを知ったので、minsizeとdaily指定をしてみたがそれでも結果は同じでした。
いろいろ調べてごにょごにょやった結果、やりたいことはほぼできました。
その結果をまとめます。

結論

どうすることにしたのか、先に結論を書いておきます。

  • maxsizeとdaily指定(copytruncate, dateext, dateformat -%Y%m%d-%H%M%S)
  • /etc/cron.daily/logrotateを/etc/cron.hourly/へコピー

試行(思考)錯誤

size + dailyで試す

これでいけるだろうと思って設定していましたが、ログが出力され続けファイルサイズがsize指定値になってもローテーションされませんでした。
このころ、どういう仕組みでローテーションが実行されているのか知りませんでした。単純に、logrotateの設定でsize指定をしておけば"勝手に"ファイルサイズを検知してローテーションされると思っていました。この考え方が間違い。

minsize + dailyで試す

調べていると、minsizeというものがあることを知りました。すぐに試してみましたが結果は同じでした。
このころようやくmanコマンドを利用することに。

# 下記は3.10.0のもの。
       size size
              Log files are rotated only if they grow bigger then size bytes. If size is followed by k, the size is assumed to
              be in kilobytes.  If the M is used, the size is in megabytes, and if G is used, the size  is  in  gigabytes.  So
              size 100, size 100k, size 100M and size 100G are all valid.

       minsize  size
              Log files are rotated when they grow bigger than size bytes, but not  before  the  additionally  specified  time
              interval  (daily,  weekly,  monthly,  or yearly).  The related size option is similar except that it is mutually
              exclusive with the time interval options, and it causes log files to be rotated  without  regard  for  the  last
              rotation time.  When minsize is used, both the size and timestamp of a log file are considered.

どっちもサイズでローテーションするんやないの?ん?ってめっちゃ迷った時期です。
but not beforeってどう訳せばいいんやろ、not rotated beforeってことなのかなーとかいっぱい考えていました。
minsizeについてググりまくりました。stackoverflowのいくつかのコメントにはmanコマンドでの説明が十分じゃないからややこしいみたいなことも書いてあったような気がします。
このころもminsizeとか書いておけば"勝手に"検知して対応してくれると思っていた時期です。

maxsize + dailyで試す

ひたすら調べていると、logrotateのバージョンをあげるとmaxsizeというのが使えることがわかり、バージョンをあげて調べていた時期。

# 下記は3.10.0のもの。
       maxsize size
              Log files are rotated when they grow bigger than size bytes even before the additionally specified time interval
              (daily, weekly, monthly, or yearly).  The related size option is similar except that it  is  mutually  exclusive
              with the time interval options, and it causes log files to be rotated without regard for the last rotation time.
              When maxsize is used, both the size and timestamp of a log file are considered.

これを見ると分かるように、even before〜とあるので「これで!」とテンションが上がったのを覚えています。
結論の部分に書いてしまっていますけど、単純にmaxsizeを指定するだけではダメでした。

hourly

このころhourlyというものも指定できることを知りました。
指定してみましたがうんともすんとも言いませんでした。

ただ、hourlyやmaxsizeについて調べているとき、参考4に出会い、それが私の固定観念を捨てるのに役に立ちました。
あ、logrotate自体は自分で実行しないといけなくて、そのときに各設定がチェックされるのか、と。
そして同時期、参考1~3に出会い、logrotateがうまく勝手に検知してローテーションしているのではなく、cronやanacronのおかげなのかと知りました。
それらの記事が分かりやすすぎて書くことがありません。見てください。

ちなみにhourlyの説明

       hourly Log  files  are  rotated  every hour. Note that usually logrotate is configured to be run by cron
              daily. You have to change this configuration and run logrotate hourly to be able to really rotate
              logs hourly.

その後の私の頭の中

/etc/cron.d/0hourlyに書かれてあるように、毎時01分に/etc/cron.hourly配下のスクリプトが実行される。
/etc/cron.hourlyには0anacronというスクリプトが置いてあり、1~2つめのif文で、すでに本日分のcron.dailyが実行されていたら実行せずに終わる。そうでなければ(on_ac_powerのチェックはあるけど)anacronが実行される。
/etc/anacrontabに/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly配下のスクリプトが実行されるよう記述してあり、実行される。
logrotateスクリプトは/etc/cron.hourlyにはなく/etc/cron.dailyのみにあった。
ってことはhourlyを指定しててもlogrotate自体は1日に1回の実行になるのか。
/etc/cron.hourly配下にlogrotateスクリプトを置けば、毎時01分に実行されて、maxsizeチェックが働いてローテーションされるのか。
dailyチェックはいつ働くんやろう?00:01の実行で、/etc/cron.d/0hourlyの1~2つめのif文内には入らないはずやから、anacronが実行されるけど、/etc/anacrontabに書いてあるようにSTART_HOURS_RANGE=3-22やからこのとき/etc/cron.daily等配下のスクリプトは実行されないはず。logrotateスクリプトを/etc/cron.hourly配下に置いていたら実行される。あれっ、logrotateのdailyってどうやって判定してるんやろ・・・ソースコード見るしかないか・・・

ってな感じです。

まだやっていないこと

size、minsize、maxsizeの違いを実際に実行して比較。
logrotateのdaily判定についてソースコードを追う。

logrotateインストールメモ

必要なライブラリ

$ sudo su -

## libtool
# yum install libtool

## libpopt
# yum install popt-devel

logrotateインストール

$ sudo su -

## compile
# git clone https://github.com/logrotate/logrotate.git
# cd logrotate
# ./autogen.sh
# ./configure
# make
# make install
# make clean

上記でやると、/usr/local/sbin/logrotateになります。既存の/usr/sbin/logrotateはそのまま。
cronのPATHは/usr/sbinとかだったので、下記のようにprefixつけたほうがいいかもしれません。
Logrotate-3.9.1

メモ

autogen.shを実行するまで時間がかかりました。
test: let tests run on 'make distcheck' · logrotate/logrotate@63be219 · GitHub
なんでautogen.shの説明削ったんやろ。

3.10.0にあげたことでいろいろ便利そうなのが使えます。
logrotate/CHANGES at master · logrotate/logrotate · GitHub

名前空間とバックスラッシュや円マーク、ほんとフォント

起きたこと

プライベートでLaravel使ってて、名前空間のセパレータを¥で書いたらエラーが起きました。
(会社でSymfonyPHPファイル見てると¥表記になっていたので普通にいけると思っていました)

詳細

会社
Windows
・USキーボード
・Tera Term
Emacs
IPAゴシック

Mac
・USキーボード
・ターミナル
VirtualBox
Emacs
・フォントはいじってない

会社で開発をしていて、バックスラッシュをタイプすると円マークが表示されていました。
何の違和感もありませんでした。名前空間のセパレータも円マーク。
円マークもバックスラッシュと同じ役割を果たすんだなーって思っていました。無意識。

そんな中、家でLaravelを触っていると名前空間のセパレータがバックスラッシュで書かれていました。
円マークのほうが慣れてるしーって思って円マークで書き直すとエラーが起きました。
なんでだろーと1時間は粗探ししたと思います。

結論

PHP名前空間のセパレータはバックスラッシュ。
(メモ: https://wiki.php.net/rfc/namespaceseparator
会社で開発しているときに円マークで表示されていたのは、IPAゴシックがUnicodeのU+005Cにも円マークを割り当てていたからっぽい。
https://www.ipa.go.jp/files/000008666.pdf
http://www.unicode.org/versions/Unicode9.0.0/UnicodeStandard-9.0.pdf
バックスラッシュ - Wikipedia
円マークとバックスラッシュ | イツカツクッテ

ということで、会社でのフォントをMyricaMにしました。
MyricaM | プログラミングフォント Myrica / Estable

理想と現実

理想

月:ESLpodcastがっつり、筋トレ
火:ランニング
水:ESLpodcastがっつり、筋トレ
木:ランニング
金:ESLpodcastがっつり、筋トレ
土:ランニング
日:体を休める

直近のToDo:発表用パワポ
ちょっとずつやってること:Ruby技術者認定試験合格教本 Silver/Gold対応 Ruby公式資格教科書
他にやりたいこと:持っている技術書やその他本の消化。

現実

家に帰る、ご飯食べる、いつのまにか1時過ぎてる、寝る。


んー><

整理

やることやってみたいこと - にっちとだじゃれ
これ昔書いたけどちょっと整理。
RubyPHPJavaScriptjQuery)、HTMLの優先度が急上昇。
Emacsも浮上。そして英語。そしてGaroonAPI利用。
Perl6でたのにどんどん落ちていく。
パンパンですね。。。疲れます。

ガルーンインストール

API使ってみたいので。

1. サーバー用意

VirtualBox + CentOS 6.7

CentOS7系じゃないのは、6系に慣れているからです。
特にポート系の扱い。
CentOS-6.7-x86_64-bin-DVD1.isoでやりました。
ネットワークインストールはinstall.imgが取得できないとかでうまくいきませんでした。
apacheとか80番とかもろもろやっておく。

2. Garoon4お試し版インストール

試用する(パッケージ版) | サイボウズ ガルーン

インストールマニュアルを見て、あらかじめ必要なライブラリはインストール・アップデートしておきました。
あとはインストールマニュアルに沿ってインストールしました。
(単体構成、MySQLは同梱のもの利用、サンプルデータインストール)

3. 確認

f:id:mfham:20151129020112p:plain

できた!
予定の登録もできています。

その他

mac買いました。
ブログのタイトル変えました。恥ずかしくなって・・・

YAPC行ってきた。が><

Perl YAPC
前夜祭

まともにスケジュール見ずに、夕方に懇親会みたいなのがあるだけかなーと思い込んでおり、普通に仕事してた。

1日目

仕事の関係で、しょっぱな1つだけ見ることに。
会場に数分遅れで到着。
なんとか座ることができた。
前の方にCH1. CH2.って書いてるけどなんだろーって思いながら聞いてた。# 意識朦朧・・・
講演が終わってから翻訳機の存在を知った・・・ひぃー><

2日目

お昼から行こうと思っていた。
LTからの参戦になってしまった・・・とても面白かった!

おみやげ

タンブラーカッコ良かった!
中に合格証が入っていたけど、日付が2014年7月って書いてた。どういうことやろ・・・

まとめ

もったいないことをした。
お疲れ様でした。