web-dev-qa-db-ja.com

RHEL / CentOSでmemcachedのログファイルを指定する方法

RHEL5.5でmemcached 1.4.5を実行しています。これは、標準のmemcachedスクリプトを/etc/init.dに、構成ファイルを/etc/sysconfig/memcachedにインストールしたyumを使用してインストールしました。

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="256"
OPTIONS=""

1つの例外を除いてすべてが正常に機能しています。ログファイルの場所を指定する方法がわかりません。ログファイルを/var/logに入れたいのですが、ヘルプやマニュアルでは、その方法を指定しています。

基本スクリプトを使用してこれを達成することは可能ですか?

5
Olly

以前の投稿でmemcachedのデバッグログを作成する提案:

ユーザーに/ tmpへの書き込み権限がないと仮定して、2の位置に注意して次のことを試してください。


memcached -d -m 3072 -l localhost -p 11211 -u nobody -v 2 >>/tmp/memcached.log

ユーザーが誰も/ var/logに書き込めない場合、上記のコマンドで/ tmpを/ var/logにスワップアウトできると思います。

1
Hesh

最後に/etc/sysconfig/memcachedを追加して">> /var/log/memcached 2>&1"のOPTIONS行を変更します。 IE

OPTIONS="-vv >> /var/log/memcached 2>&1"
31
Ben Johnson

OPTIONSまたはinitスクリプトで2>&1 >> logfileを使用することは賢明ではありません。もちろん、ログローテーションが発生したときにログファイルが再度開かれることはありません。これは、ローテーションされたログファイル(ローテーションの設定によっては空)になり、実際のログデータがディレクトリエントリが実際に存在しないファイルに書き込まれることを意味します。つまり、次の場合に削除されます。ファイルは閉じています。ログファイルが意図したとおりに閉じられ、安全にローテーションされるようにするには、memcached(さようならキャッシュ!)を再起動する必要があります。

代わりに、logger(1)コマンドのようなものを使用して、syslogにログを記録します(local1などの特定の機能を使用して、syslogルールで適切にルーティングします(helloタイムスタンプ!)、

OPTIONS=" 2>&1 | logger -i -p local1.info -t memcached"

特別にsyslogでメッセージをルーティングするルールはオプションですが、rsyslogを使用している場合は、これが役立ちます。

local1.debug  /var/log/memcached/memcached.log

Logrotateルールを忘れないでください。ロガーを使用しているため、ログファイルを閉じることを心配する必要はありません。syslogによって自動的に行われます。

# cat /etc/logrotate.d/memcached
/var/log/memcached/memcached.log {
    daily
    rotate 3
    dateext
    missingok
    create 0640 root root
    compress
    delaycompress
    postrotate
        #/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/syslogd.pid`
    endscript
}

FWIW、状況はEL7(systemd)システムでは異なります

Systemdシステムの場合、stderrの出力を収集してログに記録するので、-v(まだ非常に静か)または-vv(冗長すぎる)を含めると、それらのログをクエリできますjournalctlを使って:

# journalctl --since '2012-01-01' _SYSTEMD_UNIT=memcached.service
-- Logs begin at Fri 2015-07-10 11:00:21 NZST, end at Mon 2015-08-03 23:36:49 NZST. --
Aug 03 23:36:49 HOSTNAME memcached[4318]: slab class  17: chunk size      3632 perslab     288
Aug 03 23:36:49 HOSTNAME memcached[4318]: slab class  18: chunk size      4544 perslab     230
...
Aug 03 23:36:49 HOSTNAME memcached[4318]: slab class  42: chunk size   1048576 perslab       1
Aug 03 23:36:49 HOSTNAME memcached[4318]: <26 server listening (auto-negotiate)
Aug 03 23:36:49 HOSTNAME memcached[4318]: <27 send buffer was 212992, now 268435456
Aug 03 23:36:49 HOSTNAME memcached[4318]: <27 server listening (udp)
Aug 03 23:36:49 HOSTNAME memcached[4318]: <27 server listening (udp)
Aug 03 23:36:49 HOSTNAME memcached[4318]: <27 server listening (udp)
Aug 03 23:36:49 HOSTNAME memcached[4318]: <27 server listening (udp)

これらのログは/ var/log /の下には存在しませんが、ログはバイナリ形式で保持されるため、必要に応じてjournalctl --output json ...を使用できます。詳細については、/ etc/systemd/journald.confを参照してください。

最初から最後まで(ただし、RHEL7/systemdサーバーの場合)

# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1 -vv"


# cat /usr/lib/systemd/system/memcached.service
[Unit]
Description=Memcached
Before=httpd.service
After=network.target

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS

[Install]
WantedBy=multi-user.target


# cat /etc/systemd/system/memcached.service.d/local.conf
[Service]
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=memcached
SyslogFacility=local1
SyslogLevel=debug
SyslogLevelPrefix=false


# systemctl daemon-reload
# systemctl restart memcached.service

# systemctl status memcached
memcached.service - Memcached
   Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled)
  Drop-In: /etc/systemd/system/memcached.service.d
           └─local.conf                                                      <---------- NOTE
   Active: active (running) since Tue 2015-08-04 01:07:50 NZST; 7s ago
 Main PID: 3842 (memcached)
   CGroup: /system.slice/memcached.service
           └─3842 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024 -l 127.0.0.1 -vv
...

// Note: rsyslogd uses its imjournal module to read logs from journald;
// make sure you have this configured if you've brought your rsyslog
// config from a previous version of RHEL

# echo "local1.debug  /var/log/memcached/memcached.log" >> /etc/rsyslog.d/memcached.conf
# mkdir /var/log/memcached
# systemctl restart rsyslog.service
# systemctl status rsyslog.service

// Don't forget log rotation

# cat /etc/logrotate.d/memcached
/var/log/memcached/memcached.log {
    daily
    rotate 3
    dateext
    missingok
    create 0640 root root
    compress
    delaycompress
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
9
Cameron Kerr

Memcachedには、ログファイルの場所のコマンドラインオプションはありません。 Ubuntuには、start-memcachedというラッパースクリプトがあり、logfileパラメータを含む/etc/memcached.confを解析します。残念ながら、これはCentOS/RHELには存在しないようです。私はあなたが望むものを達成するためにinitスクリプトを修正する必要があると思います。それは少し見落としのように見えます-すばやくグーグルで見ると他の人にもこの問題があることを示しているので、おそらくすぐに修正されるでしょう(またはすでに修正されていて、私は気づいていません)。または、Ubuntuの起動スクリプトを試すこともできます。

2
Rafiq Maniar