@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

バックアップについて

投稿者投稿内容
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2004-12-20 01:39
そもそも、スクリプトを書く前に、ローテートしたいログファイル、そしてその
ログファイルを出力するプログラムを特定しないと、たぶん無理だと思います。

なぜなら、ログファイルを切り替える処理はプログラムによってはまちまちなのです。
そこで、logrotate だとログを出力するプロセスごとに処理を分けてます。たとえば、
/etc/logrotate.d/のhttpdとsquidのpostrotate処理を比べてみてください。
(プログラムはログ出力時には、ファイル名ではなくiNodeを使っているのが原因)

ただし、/var/log/messages の用に syslogd 管理下のもの、あるいは /etc/syslog.conf を
修正して、ローテートしたいログをsyslogd管理下に置けるのであれば)、
/etc/syslog.confを修正してログ出力をスクリプトにして、そのスクリプトでログを
ローテートすればできそうです。
syslogdとは無関係ですが、Apacheに付属しているツールrotatelogsがそういうことを
やってますので、参考になるかもしれません。

また、既存のログファイルに手を付けず、別のファイルにバックアップを取るのであり、
さらにログファイルのエントリに年月日を識別できるようデータが入っているのであれば、
定期的にログファイルを(古いのも含めて)読んで、該当の日付の行だけ別ファイル
にコピーすればできそうです。

あと、履歴が残るようなファイルシステム(CVSの様な処理をファイルシステムで行う)が
存在したと思いますので、そういったものを使えば、もしかしたら、任意の日付の任意の
ログファイルを取り出す事もできるかもしれません。
(LVMのスナップショットではなくて、別のファイルシステムをどこか..SourceForgeあたり
かも..で見かけたような)
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-12-20 11:29
>理想は例えば、/var/log配下のmessagesを1日分の内容だけ違うフォルダの中
>に違うファイルに作成して(messages.2004_12_19.logのようにその日の日付を
>つけたい。)

簡単や。

replacer.sh
コード:
#!/bin/sh

#
stamp=`date | sed 's/年//' | sed 's/月//' | sed 's/日//'`
ymd=`echo $stamp | awk '{ print $1 "_" $2 "_" $3 }'
#
if [ -f /var/log/messages ]; then
if [ ! -d /var/log/$ymd ]; then
/bin/mkdir /var/log/$ymd
fi
/bin/mv /var/log/messages /var/log/$ymd/messages.$ymd.log
touch /var/log/messages
fi



後は、crontab -e で

1 0 * * * [ -x /どっか/適当な/パス/replacer.sh ] && /どっか/適当な/パス/replacer.sh

こいつを追加。
何れも root 権限での作業が必要。

$1 $2 $3 (プ
直す気無いんかえ・・・


[ メッセージ編集済み 編集者: コブラ 編集日時 2004-12-20 13:13 ]
komey
ベテラン
会議室デビュー日: 2003/11/27
投稿数: 76
投稿日時: 2004-12-20 13:02
たぶん、皆さんがおっしゃっていることがちんぷんかんぷんなのではないでしょうか?
シェルスクリプトが何かよくわかっていないんですよね?
まずはここを読んでください。
http://www.atmarkit.co.jp/flinux/rensai/theory08/theory08a.html

次は、使うべきコマンドがわからないということですが、
これはログファイルを加工したりしなかったりで必要になるコマンドが変わってきます。
引用:

理想は例えば、/var/log配下のmessagesを1日分の内容だけ違うフォルダの中に違うファイルに作成して(messages.2004_12_19.logのようにその日の日付をつけたい。)それを毎日をこない、行っできたファイルはその月の一ヶ月分しかそのフォルダに残して次の月になったらその中にあるフォルダを全部削除する


という処理がしたいのであれば、それをコマンドで行ってみてください。
コマンドでできるのであればそれをテキストファイルに書いて、実行してください。

⇒コマンドでできる場合
動的な値を算出する方法がわからないという問題に当たると思いますが、そうなったら、また上記のサイトを見て、なんとかできないかあがいてみてください。で、あがいたシェルスクリプトをここに載せて、自分の理想の処理は何なのか、理想に反してどうなるのかを書きましょう。

⇒コマンドでできない場合
コマンドでできないのであれば、コマンドを勉強する、他の方法がないか検討するのどちらかかと思います。
「〜〜な処理をしたいのですが、どうコマンドを実行すれば良いでしょうか、また、〜〜な処理をするために良い方法はないでしょうか」という質問をしましょう。


上記のように質問すれば、もっと的確なレスが付くと思います。
# 私のスタンスを言っておくと、よくわからないけどできるコードだけもらえれば良い、というのは賛成しません。

私も含めてみんな、これからさんのレベルがわからないのでレベルに合った解答ができないんですよ。


尤も、やりたいことや環境を具体的に書けば(「例えば」ではなく)、コブラさんがちゃんと動くスクリプトを書いてくれるかもしれませんが・・・・・・。
# replacer.shはdateの出力結果が想定と違うとちゃんと動きませんよ。
# あと、/var/log/以下にやたらとディレクトリができるので、もうひとつサブディレクトリを作った方が良いような気も。。。
okutin
ベテラン
会議室デビュー日: 2003/12/11
投稿数: 98
お住まい・勤務地: 広島
投稿日時: 2004-12-20 13:29
こんにちは。

日付は
date '+%Y%m%d'
こんな感じでフォーマットを指定して使うと扱いやすいかもです。
koji
常連さん
会議室デビュー日: 2004/11/04
投稿数: 36
お住まい・勤務地: 北海道
投稿日時: 2004-12-20 13:41
>コブラさん

stamp=`date | sed 's/年//' | sed 's/月//' | sed 's/日//'`
ymd=`echo $stamp | awk '{ print $1 "_" $2 "_" $3 }'`

こう書くんだったら

ymd=`date '+%Y_%m_%d'`

こんな感じでいいと思います。
フォーマットは結構柔軟に指定出来るので便利です。

かぶってしまいました。

[ メッセージ編集済み 編集者: koji 編集日時 2004-12-20 13:44 ]
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-12-20 15:43
date '+%Y_%m_%d'

シンプルでエエな。。。
こっち使いましょう (プ

スキルアップ/キャリアアップ(JOB@IT)