質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
logrotate

logrotateはログの世代管理やサイズ制限を行うLinux標準のツールです。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

3回答

6398閲覧

logrotateでdhcpd.logに追記されない

tanmen

総合スコア14

logrotate

logrotateはログの世代管理やサイズ制限を行うLinux標準のツールです。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2017/08/15 04:22

CentOS7.3.1611でDHCPサーバを構築し、logrotateを使用して/var/log/messagesとは分けてログ出力するよう設定しました。

希望としては、/var/log/dhcpd/dhcpd.logに新しいログを追記していくように設定したいのですが、実際は/var/log/dhcpd/dhcpd.log_YYYYMMDDの方に追記されてしまいます。(/var/log/dhcpd/dhcpd.logはローテートのタイミングで作成されますが、空ファイルのままです。。)

上記希望のようにログ出力するには、どのような設定を行えば良いでしょうか。

# vi /etc/logrotate.d/dhcp /var/log/dhcpd/dhcpd.log{ daily rotate 60 olddir /var/log/dhcpd/ compress delaycompress dateext missingok create 644 root root }

その他必要な情報がございましたらご教示ください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

サーバがログを出力するのは/var/log/dhcpd/dhcpd.logのファイル名ではなく、ファイルディスクリプタ(ざっくり言うとHDD上のデータそのもの)に出力します。なので、logrotate でファイルをローテートしても、古いファイルに対してログを出力し続けます。

これを解消するにはログファイルを再作成させてやれば良いのですが、その方法が、Kill -HUP となります。Kill -HUPをすればあらゆるものがログファイルの再作成を行うかと言うとそうではなく、サーバがそのように作られているからです。

ログの再作成の観点だけならば kill -HUP でもDHCPサーバのリスタートでも一緒です。が、ずいぶん乱暴なのでkill -HUP としたいところです。

で、/bin/systemctl reload dhcpd は同義かと言うと、systemctl status dhcpd で表示される /usr/lib/systemd/system/dhcpd.service を見て見るとExecReload が定義されていません。
よって、同義では無いとなります。

対応するにはdhcpd にpid ファイルを作成させる必要がありますので、systemd による起動ファイルを変更する必要があります。

cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/ systemd daemon-reload systemd status dhcpd Loaded: loaded (/etc/systemd/system/dhcpd.service....

で修正用のファイルができました。以下のように修正すればPIDファイルが作成されると思います。

ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid ↓ ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd

投稿2017/08/16 05:00

toytax

総合スコア104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanmen

2017/08/16 06:09

ご回答いただきありがとうございます。 kill -HUPを日次で実行すると、下記参照元の通りこれまでのリースファイルは削除されてしまうものでしょうか・・? だとすると、ログロ―テートが行われる前にdhcpd.leases~ ⇒ dhcpd.leasesにリネームするというシェル?も必要なのでしょうか・・? 【参照元】 http://linuxjm.osdn.jp/html/dhcp2/man5/dhcpd.leases.5.html (「説明」の下部参照)
toytax

2017/08/16 06:23

参照元の情報の"存在しなくなる危険性があります"は強制終了(kill -HUPではなく、Kill -9)の場合かつ、リースファイル(dhcpd.leasesファイル自体)が更新されている時のはずです。 通常の停止及びkill -9 ではリースファイルがなくなることは無いはずです。なのでリースファイルのリネームは必要ありません。逆にすでにあるリースファイルをdhcpd.leases~で更新すると実際のDHCPリース情報と差が出るので危険です。
toytax

2017/08/16 06:23

すみません。 通常の停止及びkill -9 ではリースファイルがなくなること ↓ 通常の停止及びkill -HUP ではリースファイルがなくなること です。
toytax

2017/08/16 06:32

あと、dhcpサーバの挙動が心配ならば、ログを -d とかで直接吐かせるのでなく、dhcpd.conf でlog-facilityを設定し、syslog(rsyslog)側でログファイルを分離するのも手です。これだとdhcpd をリロードさせる必要はありません。また、直接吐かせる場合でも、syslog のcopytruncate を利用する場合もdhcpd のリロードは必要ありません。
tanmen

2017/08/16 06:59

ありがとうございます…! kill -HUPではリースファイルが無くならないのですね、了解です。 ちなみに記載していなかったのですが、、 dhcpd.conf でlog-facilityを設定し、syslog(rsyslog)側でログファイルを分離しています。以下の通り設定しております。。 ``` #vi /etc/dhcp/dhcpd.master  ※failover構成になっているためconfファイルから分離させています。 (中略) log-facility local0; #vi /etc/rsyslog.conf (中略) # dhcpd log local0.* /var/log/dhcpd/dhcpd.log & ~ ```
toytax

2017/08/16 07:27 編集

なるほど、となると今回はdhcpd をリロードするのではなく、実際にログを吐いているrsyslog をリロードすることになります。なので /etc/logrotate.d/syslog を参考に /etc/logrotate.d/dhcp に postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript を入れてやればうまくローテートできるのではないでしょうか。
tanmen

2017/08/16 07:56

rsyslog をリロードするのですね…!なるほど!! まとめると、、以下のような設定で問題ないという認識なのですが、合っていますでしょうか?? ``` #vi /etc/logrotate.d/dhcp /var/log/dhcpd/dhcpd.log{ daily rotate 60 olddir /var/log/dhcpd/ compress delaycompress dateext missingok create 644 root root sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2>/dev/null || true endscript } ``` 度重なる質問となり恐縮です。。。
toytax

2017/08/16 08:15

問題ないかと思います。テストとしては logratate -dv /etc/logrotate.d/dhcp で確認できます。 -d, --debug Don't do anything, just test -v, --verbose Display messages during rotation あと、ポリシーや仕様の問題となりますが、設定はあまり書かない方が私的には好みです。 olddir /var/log/dhcpd/ は必要とは思われないですし、 dateext も CentOS7 ならば /etc/logrotate.conf に記載があります。 delaycompress も別途ログの参照をしていなければ即時圧縮でも問題ないと思います。 create 644 root root も仕様で明示されていないならばデフォルトに任せても良いかと(多分600 root root になるけど)
tanmen

2017/08/16 08:20

アドバイスありがとうございます! logrotate -dv ~は実施してみてましたが不安だったため念のため伺った次第です。。 設定についても最小限にしてみようと思います。 諸々ありがとうございました!
guest

0

dhcpdをリスタートする必要があるはずです。設定に

postrotate kill -HUP `cat /var/run/dhcpd.pid`

こんな感じでローテートをおこなった後の処理を追加してください。

pidファイルの場所は想像ですので実際に合わせて書いてください。

投稿2017/08/15 04:46

suzukis

総合スコア1449

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanmen

2017/08/16 00:12 編集

ありがとうございます。 kill -HUP `cat /var/run/dhcpd.pid` は /bin/systemctl reload dhcpd と同意義でしょうか・・? dhcpd.pidの生成をする設定をしておらず。。無知ですみません。。
suzukis

2017/08/16 05:12 編集

起動スクリプトの中身次第ですがおそらくそれでも大丈夫です。ただ、設定ファイルの再読込とかまで走るようだと、その問題で再起動に失敗するようなことがあるかもしれません。
tanmen

2017/08/16 05:43

追加で情報ありがとうございます。色々試してみます。。
guest

0

ログローテート時にrsyslogをkill HUPしていないのではないでしょうか

投稿2017/08/15 04:38

scsi

総合スコア2840

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanmen

2017/08/16 05:28

ありがとうございます。 他の皆さんからもいただいている通りkill HUPに関することが抜けているようでした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問