web-dev-qa-db-ja.com

ファイル名に日付を含むログローテーションファイル

Tomcat6ログ用にRHELでlogrotateを構成しようとしています。現在、logrotateはcatalina.outログに対して正常に機能し、適切に回転および圧縮されます。

問題は、次のような日付を含むファイルにあります。

catalina.2012-01-20.log
catalina.2012-01-21.log
catalina.2012-01-22.log

これらのファイルはローテーションされていません。 catalina.outのローテーションが設定されている/etc/logrotate.d/Tomcat6ファイルでこれらを設定する必要があることを理解しています。ただし、構成することはできません。

現在の日付ログファイルを除き、これらの古いファイルを毎日圧縮するだけです。

誰でもこれを手伝ってくれますか?

ノーマン・Aに感謝します。

31
Noman Amir

(酔っ払ったクモがそれをフォーマットしたように見える場合は、最初の投稿ですのでごめんなさい)

友人のGoogleを使用した後、ここでは、logrotateを使用して(cronまたはその他の同等物ではなく)何かを達成した他の場所を思い出せません。

/ var/log/rsync /に次のものがあります。

-rw-r--r-- 1 root root 1.1M Apr  9 08:13 2014-04-09 07:48:18.log
-rw-r--r-- 1 root root 1.4M Apr 11 15:20 2014-04-11 15:02:52.log
-rw-r--r-- 1 root root 1.6M Apr 11 15:42 2014-04-11 15:22:04.log
-rw-r--r-- 1 root root 1.8M Apr 12 08:01 2014-04-12 07:45:31.log
-rw-r--r-- 1 root root 2.0M Apr 13 08:10 2014-04-13 07:53:38.log
-rw-r--r-- 1 root root 2.2M Apr 14 08:19 2014-04-14 07:51:09.log
-rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log
-rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log

および次のlogrotateファイル:

/var/log/rsync/*.log {
       daily
       rotate 7
       compress
       delaycompress
       notifempty
       missingok
}

それは完全に合理的だと思いました。しかし、動作を拒否し、動作しないことを発見した後(この投稿のおかげで)、動作するようにファッジできるかどうか疑問に思いました。

多くのテストと微調整の後、私はなんとか次のようにそれをかじることができました:

/var/log/rsync/dummy {
        daily
        rotate 0
        create
        ifempty
        lastaction
                /usr/bin/find /var/log/rsync/ -mtime +7 -delete
                /usr/bin/find /var/log/rsync/ -mtime +1 -exec gzip -q {} \;
        endscript
}

/etc/logrotate.d/local-rsyncというlogrotate構成ファイルに保存します。次に、ダミーのログファイルを作成します。

touch /var/log/rsync/dummy

次に、次を使用してlogrotateを強制します。

logrotate -fv /etc/logrotate.d/local-rsync

与えるもの:

-rw-r--r-- 1 root root  71K Apr  9 08:13 2014-04-09 07:48:18.log.gz
-rw-r--r-- 1 root root  88K Apr 11 15:20 2014-04-11 15:02:52.log.gz
-rw-r--r-- 1 root root  82K Apr 11 15:42 2014-04-11 15:22:04.log.gz
-rw-r--r-- 1 root root  84K Apr 12 08:01 2014-04-12 07:45:31.log.gz
-rw-r--r-- 1 root root  87K Apr 13 08:10 2014-04-13 07:53:38.log.gz
-rw-r--r-- 1 root root  92K Apr 14 08:19 2014-04-14 07:51:09.log.gz
-rw-r--r-- 1 root root 2.5M Apr 15 08:05 2014-04-15 07:37:38.log
-rw-r--r-- 1 root root 2.7M Apr 16 08:11 2014-04-16 07:43:14.log
-rw-r--r-- 1 root root    0 Apr 16 12:11 dummy

明日の朝を待って...

Cronの方がきれいですが、logrotate configファイルに別の要素があり、2つをまとめたいと思っています。

ダミーファイルの利点は、スペースを占有しないことです!

ある日、何も回転していないように見える場合があります。理由を解明するのに時間がかかりましたが、それから小枝になりました。 find -mtime +1は丸1日(つまり24 * 60分)であり、ログが最後に作成されてから24時間以内に毎日のログローテーションが開始された場合、ログが機能していないように見えることがあります。わずらわしい場合は、find -mmin +1380で23時間使用する方が適切かもしれません。

39

私は多くのドキュメントを読んでかなりの時間を費やしました。 Logrotateは、ファイル名に日付が含まれるさまざまなファイルをグループ化できないようです。 Logrotateは、必要な処理を実行できません。

Java/Tomcatによって提供されるロギング機能を変更して、ファイル名に日付を含めないようにする2つのオプションがあります。 http://Tomcat.Apache.org/Tomcat-6.0- doc/logging.html

2番目の簡単な方法は、findを使用して、独自の小さなスクリプトを使用して作業を行うことです。 https://serverfault.com/questions/256218/logrotation-when-filenames-includes-datehttps://serverfault.com/a/256231/7112

find/pathtologs/* -mtime +5 -exec rm {} \;

開発者はファイル名に日付をコーディングしているため、2番目のオプションを選択しました。そのため、その方法を維持する必要があります。 -mtime +5は、5日より古いファイルのみを検索するように検索を設定します。

findのドキュメントから。

ファイルのデータはn * 24時間前に最後に変更されました。 -atimeのコメントを参照して、丸めがファイル変更時間の解釈にどのように影響するかを理解してください。

コメントごとに更新

/ pathtologs/*を検索-mtime +5 -delete

削除したい場合は、これが簡単な方法です。他のコマンドが必要な場合は、いつでもexec rm {} \;何か他のものと。

11
nelaaro

/etc/cron.d/rotate_Tomcat_logsにある次のようなもの:

# delete every log file over 100 days old, and compress every log file over 1 day old.
00 1 * * * root ( find /opt/Tomcat/logs -name \*log\* -name \*.gz -mtime +100 -exec rm -f {} \; >/dev/null 2>&1 )
05 1 * * * root ( find /opt/Tomcat/logs -name \*log\* ! -name \*.gz -mtime +1 -exec gzip {} \; >/dev/null 2>&1 )
5
DeBaan

また、logrotateをハードコードする代わりにcronを追加することもできます。

1 0 * * * /usr/bin/find /var/log/Tomcat/ -mtime +30 -delete
2 0 * * * /usr/bin/find /var/log/Tomcat/ -mtime +1 -exec gzip -q {} \;

この方法で、30日より古いログを削除し、1より古いログを圧縮します。

2
Jhoval

回転したファイルに日付を含めるには、おそらく「dateext」オプションを使用できます。

$ cat logrotate.conf 
/var/nginx/logs/access.log {
    size 10k
    copytruncate
    dateext
    rotate 10
    compress
}

回転したファイルは以下のように作成されます

 root@nitpc:~# ls -lrt /var/nginx/logs/access.*
-rw-r--r-- 1 nginx root 5422 May 31 08:26 access.log
-rw-r--r-- 1 nginx root  466 May 31 08:26 access.log-20180531.gz

唯一の欠点は、ファイルにその日付の明確な名前があるため、1日に1回しか実行できないことです。

上記の例は、GCでk8sで実行されているNginxドッカーコンテナーからのものです。 logrotateバージョンは3.11.0です。

お役に立てば幸いです!

更新:manページから https://linux.die.net/man/8/logrotate

dateformatformat string

Strftime(3)関数と同様の表記を使用して、dateextの拡張子を指定します。 %Y%m%dおよび%s指定子のみが許可されます。デフォルト値は-%Y%m%dです。ログ名と拡張子を分離する文字もdateformat文字列の一部であることに注意してください。 %sが正しく機能するには、2001年9月9日を過ぎてシステムクロックを設定する必要があります。この形式で生成された日付スタンプは字句的にソート可能でなければならないことに注意してください(つまり、最初に年、次に月、日。たとえば、2001/12/01は問題ありませんが、01/12/2001はそうではありません。 2002年は下位に分類されますが)。これは、rotateオプションを使用すると、logrotateがすべての回転されたファイル名をソートして、どのログファイルが古くて削除する必要があるかを見つけるためです。

2
Nitb

/path/to/logs/*.log {missingok compress rotate 7}

他の人が指摘するように、Tomcatには独自のログローテーションがあるため、このタイプのことは正常に機能しません。単純なcronを使用して古いファイルを削除するか、アクセスログValveのローテーションをオフにすることができます。ログのローテーションをオフにする(およびファイル名のパターンを変更する)ことにより、上記のlogrotateおよび他の同様の構成が正常に機能します。

結論として、Tomcatではlogrotateまたは組み込みのログローテーションを使用する必要がありますが、両方を同時に使用することはできません。

2
dres

Tomcatログから日付パターンを削除する方法 で説明されているように、ログファイル名から日付を削除して、logrotateルールを使用できるようにすることができます。

これは、少なくともローカルホストのアクセスログでは機能しました。

1
geekQ

さて、logrotateがこれをサポートしていない(つまり他の人によって回転されたファイルを削除するだけではない) application)シナリオは確かに正しいです(おそらく、そのツールで機能要求を上げますか?)。

それで、私がやってきた代替アプローチを共有したいと思います。 「find /path/to/logs -mtime +7 -delete "解決策、この方法では削除されませんall指定された期間後の古いログ。ディスクに最後のN個のログのみを残す1行のbashコマンドの例があります(実行されるたびに):

for f in `ls -1r | grep -E "^catalina\.[0-9]{4}-[0-9]{2}-[0-9]{2}\.log$" | tail -n +$((N+1))`; do rm $f; done

最後に、トピックを完全にカバーするための最後の代替ソリューションは、ログファイルをローテーションしないことです(例:rotatable=false Tomcatの場合-そのドキュメントを参照)、通常どおりlogrotateを使用しますが、 'copytruncate' オプションとともに使用することを忘れないでください。

提案を歓迎します...

1
Petr Bodnár

Tomcatの毎日のログローテーションを有効にするには、catalinaファイルへの日付の後置を使用して、以下の変更を行います。

Cronologパッケージをダウンロードして、Linux OSにインストールします

wget http://pkgs.fedoraproject.org/repo/pkgs/cronolog/cronolog-1.6.2.tar.gz/md5/a44564fd5a5b061a5691b9a837d04979/cronolog-1.6.2.tar.gz

tar -zxvf cronolog-1.6.2.tar.gz
./configure
make
make install 

viコマンドを使用してApache-Tomcat-7.0.65/bin/catalina.shファイルを開き、以下の例のように行を変更します。/opt/Apache-Tomcat-7.0.65/bin/catalina.sh

shift
touch "$CATALINA_OUT"
# comment above line as below 
#touch "$CATALINA_OUT"
if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
  echo "Using Security Manager"
fi
shift
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $Java_OPTS $CATALINA_OPTS \
  -Djava.endorsed.dirs="\"$Java_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
  -Djava.security.manager \
  -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
  -Dcatalina.base="\"$CATALINA_BASE\"" \
  -Dcatalina.home="\"$CATALINA_HOME\"" \
  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
  org.Apache.catalina.startup.Bootstrap "$@" start \
  #>> "$CATALINA_OUT" 2>&1 "&"
  # comment above line and add below given line
2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" &
else
eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $Java_OPTS $CATALINA_OPTS \
  -Djava.endorsed.dirs="\"$Java_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
  -Dcatalina.base="\"$CATALINA_BASE\"" \
  -Dcatalina.home="\"$CATALINA_HOME\"" \
  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
  org.Apache.catalina.startup.Bootstrap "$@" start \
  #>> "$CATALINA_OUT" 2>&1 "&"         
  # comment above line and add below given line
2>&1 |/usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" &
fi

上記の変更後、ファイルを保存し、Tomcatを再起動して変更を適用します。

0

ログローテーションファイルで、rotate #を使用します。#は、削除する前に保持するログの数です。

回転数

ログファイルは、削除されるか、メールディレクティブで指定されたアドレスに送信される前に、ローテーションされます。 countが0の場合、古いバージョンは回転ではなく削除されます。

0
Paul Armstrong