• 締切済み

logrotateのリネーム後のファイル生成

ログローテート のツールとクーロンを利用して、ログファイルを定期的にローテートさせます。 以下の順でローテートさせます。 (1)ログファイルをリネームする (例access.log→access_20041001.log) (2)新たにログファイルを生成させています。 (例access.log) そこで、質問ですが、(1)と(2)の間にログを出力する間はわずかでも間隔があるのでしょうか? その間にログを出力させようとしたときは、(2)のファイルが未だ存在が存在しないので、出力できないのでしょうか? 以上のことは、起こりえないのでしょうか? 以下にlogrotate.confの一部を示します。 /home/review/log/review/access.log { daily create 0644 review review rotate 1 postrotate EXT=`date --date '1 days ago' +%Y%m%d` for f in $1; do mv $f.1 /home/review/log/review/access_$EXT.log; done endscript }

みんなの回答

  • notnot
  • ベストアンサー率47% (4852/10266)
回答No.2

もし、ログ発生の都度にログファイルをオープン、ライト、クローズしているなら、ご心配のようなタイミングが生じますが、アペンドライトのオープン時にはファイルが無ければ作られ、その後、create 0644 review reviewの記述によって、chmod や chown が行われるので大丈夫です。 でも多くのデーモンプログラムでは、ログファイルをオープンしっぱなしで、ログ発生時にはライトだけ行っています。そのためリネームしてもそのままリネーム後のファイルに書き続けます。またSIGHUPシグナルを受け取るとログファイルのクローズ・オープンをし直すように作ってあるので、ログファイルのリネーム、作成後に、kill -HUPすると新しいファイルに書かれるようになります。 いずれのケースでも大丈夫ですが、初心者が作ったようなプログラムだと駄目なものもあるかもしれません。

全文を見る
すると、全ての回答が全文表示されます。
  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.1

普通、ログファイルをローテートするときは、そのログファイルに 吐き出しているサービスを止めるのが一番安全です。 (1)サービスを止める (2)ログファイルをローテートする (3)サービスを起動する また、場合によってはログファイルが存在しないと、起動できない サービスもありますので、 touchコマンド等で、0バイトのログファイルを作成しておく必要もあります。 (1)サービスを止める (2)ログファイルをローテートする (3)ログファイルを作成する(touch ログファイル名) (4)サービスを起動する さらにもうひとつ、 ローテート後に、作成したログファイルの所有者・権限も、ちゃんと 設定する必要があります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • logrotateの設定にういて

    掲題の通り、logrotateの設定についてご教授いただきたいのですが、 現在、/etc/logrotate.confには以下のように設定を入れています。 (OSはDebian3.1を使用しています) 【/etc/logrotate.conf】 daily rotate 93 create ifempty nocompress noolddir include /etc/logrotate.d 「ifempty」と書いておくことで、サイズ0のファイルもローテートされるという認識でいたのですが、実際に動かしてみると、サイズ0のファイルハローテートされていません。 -vオプションで動かしてみると「log does not need rotating」と出ます。 「/etc/logrotate.d」配下の設定ファイルにも 「notifempty」が設定されていないのは確認しているのですが 他にどこを確認すれば良いのでしょうか? ご教授よろしくお願いいたします。

  • logrotateにつきまして

    CentOS6.3にて logrotateの対象ファイルのパスを間違って記述してました。 (/var/log/iptables.log を /home/iptables.log と記述していました) 【/var/lib/logrotate.status 中身】  "/home/iptables/iptables.log" 2013-2-21" 【一次対応】 /etc/logrotate.d/iptables ファイルの中身を、/var/log/iptables/iptables.log と修正し、 コマンド:logrotate -dv /etc/logrotate.d/iptables  を実行しましたが、下記エラー?が表示されました 【エラー】 reading config file /etc/logrotate.d/iptables reading config info for /var/log/iptables/iptables.log Handling 1 logs rotating pattern: /var/log/iptables/iptables.log after 1 days (30 rotations) empty log files are rotated, old logs are removed considering log /var/log/iptables/iptables.log log does not need rotating 【質問】 iptables.log" 2013-2-21"から1日ずつログを取り出し、ロテートさせて ファイルを作成したいのですが、どのように対応すればよいのでしょうか? ご教授お願いします。

  • apacheのアクセスログについて

    ログを自動的に整理しようと、/etc/logrotate.conf定義でrotate 8から rotate 4に戻しましたが a_access_log.1085011200というファイルが作成されますが、こちらの方に最新のログが記録されていて、 肝心のa_access_logには、1ヶ月半以上前のデータが残っています。 意味的に正しいのでしょうか?アクセス解析で常に最新のデータを使いたいのですが、これでは 古いデータを使うことになります。

  • cronの実行がうまくいかない。

    ubuntu18.04 LTSでcronのテストをしているのですが期待通りに動きません。 下記で、6時42分にログローテートが行われません。 原因と対策について教えて下さい。 ・/etc/crontab 42 6 *** root test -x /usr/sbin/anacron || (cd /&& run-parts --report /etc/cron.daily) ・/etc/cron.daily logrotate の記述がある。 ・/etc/logrotate.conf include /etc/logrotate.d の記載がある。 ・/etc/logrotate.d/logrotate_1.conf /tmp/rotate/test.log {   daily compress maxsize 1M create 0660 root root rotate 5 } ・/tmp/rotate/test.log が存在している。 尚、 ・手動実行 sudo logrotate -f /etc/logrotate.d/logrotate_1.conf では、 /tmp/rotate 実行後に、 test.log test.log.1.gz が存在します。

  • logrotateの実行時間

    logrotateで「/etc/cron.daily/」以下に日次で実行したいスクリプトを置いていますが、 一部のログファイルを「0時」にローテートされるようにしたいです。 ネットで検索してみたところ「/etc/crontab」にrun-partsの指定があるという資料は見つけたのですが 私のサーバ(CentOs6)にはそのような記述が見当たりません。 「/etc/cron.daily0」のようなディレクトリを作成し、そこに記述された内容は毎日0時に実行するといったことは可能でしょうか?

  • ログローテート

    今まであまり意識しなかったんですが、ふと疑問に思ったので教えてください。 今までアプリケーションログをローテートする場合に、以下のようなスクリプトを書いていました。 cp -p log log.old・・・(1) cp /dev/null log・・・(2) でもこれって(1)と(2)の間でlogに書き込みがあるとその箇所が消されてしまうんじゃないか?と思いますがこの認識は合っていますでしょうか? また、linuxのlogrotateは書き込み中であっても欠落なくローテートされることが保証されているのでしょうか?

  • apacheのアクセスログのファイル名について

    【環境】 centos4.5 apache2.2.6 現在、テストの為、アクセスログを5分ごとにローテーションさせて、 ファイル名には「年月日時分秒」が入るように設定してますが、 出力されるアクセスログファイル名の時刻がおかしくて困ってます。 【httpd.confの設定値】 CustomLog "|/usr/local/apache2/bin/rotatelogs /usr/local/apache2/logs/access_log.%Y%m%d%H%M%S 300" combined 15時55分に出力されたファイル名 access_log.20071104065500 16時5分に出力されたファイル名 access_log.20071104070500 上記のように 15時だと06 16時だと07 になってしまいます。 年・月・日・分・秒は正確にファイル名に入るのですが、 時だけおかしいです。 dateコマンドだと正常に表示されます 2007年 11月 4日 日曜日 16:44:02 JST 原因が分からず困っています。 どなたか教えて下さい。宜しくお願いします。

  • リダイレクトで空ファイルを生成しない方法

    以下のようにcronの実行結果にgrepをかけて、出力をファイルに書き出しているのですが、grepの結果出力がないときにサイズ0のファイルが生成されます。 cron.php | grep -v '\[ OK \]\|#!/usr/bin/php' > log/`date +%Y%m%d`cron.log 出力があるとき以外ファイルを生成させない方法はありますか? 宜しくお願い致します。

  • apacheのログファイルがいつの間にか消える

    Redhat Linux7.0J apache_1.3.19 openssl_0.9.6b apache_1.3.19+ssl_1.44の環境で 下記のログファイルの中身が、いつの間にか 全て消えてなくなるのです。  マシンを再起動すれば、たちまちログ出力は 開始されるのですが、また気付いたら消えています。  消えるまでにどれだけの日数がかかるのかは 分かりません。サーバの再起動は3ヶ月に1回ぐらいは 実施していますが、毎回logのことを調べてはいないので どのタイミングで消えたかは全く不明です。 定期的に消えるような処理が自動的に動いているのでしょうか?(それはcronという機能のことですか?cronの設定とかよく分からないのですが現状どのようなcronが動いているか確認する手段(コマンド)はありますか?) [ログファイルは、下記のように1ファイル/1Wずつ保存されていて気付いたら中身が消えている] /usr/local/apache/logs/httpsd_access_log ・・・ /usr/local/apache/logs/httpsd_access_log.4 /usr/local/apache/logs/httpsd_error_log ・・・ /usr/local/apache/logs/httpsd_error_log.4 ログのrotationについては /etc/logrotate.d/syslogファイルに 下記を記述しています。  この記述方法が悪いのでしょうか? インストールの初期状態で自動的に記述されていた maiilogファイルなどを真似して記述したのですが 間違いがありますか? [/etc/logrotate.d/syslogファイルの記述] /usr/local/apache/logs/httpsd_access_log { postrotate /bin/kill -HUP `cat /var/run/xinetd.pid 2>/dev/null` 2>/dev/null || true endscript } /usr/local/apache/logs/httpsd_error_log { postrotate /bin/kill -HUP `cat /var/run/xinetd.pid 2>/dev/null` 2>/dev/null || true endscript }

  • 5秒に1回以上アクセスしてくる接続元IPをアクセスログから抽出したい

    1分おきにアクセスログを調査し、"/cgi/test.cgi" というファイルに 過去1分間 に12回以上(5秒に1回以上)アクセスしている接続元IPがあるかを 検査したいと思っています。 調査するアクセスログファイルは以下のような位置にドメイン名ごとに在ります。 /home/account/ドメイン名1/access_log /home/account/ドメイン名2/access_log /home/account/ドメイン名3/access_log そしてアクセスログのフォーマットは以下のように、 接続元IP、アクセス日時、アクセス先ファイル、User-agent の順です。 66.77.88.99 - - [01/Mar/2010:21:56:39 +0900] "GET /cgi/test.cgi?order=&class=1& HTTP/1.1" 200 3191 "-" "Mozilla/5.0 (compatible; Googlebot/2.1)" ------------------------------- 例えば単純に #tail -n 100 /home/account/*/access_log |grep "/cgi/test.cgi" で、過去ログ100行分の中で /cgi/test.cgi にアクセスしている 接続元IPの一覧は分かりますが、 「過去1分間に12回以上出現しているIP」を抽出するには、 うまい方法が分かりません。 shはcronで1分おきに実行させる予定です。 よい方法がありましたら、ぜひご提示頂きましたら嬉しいです。どうぞ宜しく御願いいたします。