如何在RHEL / CentOS上指定memcached的日志文件

我在RHEL5.5上运行memcached 1.4.5。 我使用了在/etc/init.d安装了标准memcached脚本的yum和/etc/sysconfig/memcached的configuration文件来安装:

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

一切工作正常,但有一个例外 – 我不知道如何指定日志文件的位置。 我想把日志文件放在/var/log但是帮助和手册都指定了如何做到这一点。

是否有可能使用基本脚本实现这一点?

build议在上一篇文章中为memcached创build一个debugging日志:

假设用户nobody没有对/ tmp的写入权限,请尝试以下操作,注意2的位置:


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

如果用户没有人可以写入/ var / log,那么我认为可以在上面的命令中用/ var / logreplace/ tmp。

修改/etc/sysconfig/memcached的OPTIONS行,在末尾添加">> /var/log/memcached 2>&1" 。 IE

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

在OPTIONS或init脚本中使用2>&1 >> logfile并不明智,因为日志文件在发生日志旋转时不会重新打开,当然假设您已经为此发生了一些事情。 这意味着你将最终得到旋转的日志文件(空的,取决于旋转设置),你的实际日志数据将写入一个没有实际存在目录条目的文件,这意味着它将被删除该文件被closures。 为了使日志文件在预期时closures,并因此安全地轮换,您将不得不重新启动memcached(再见caching!)。

相反,使用类似logger(1)命令login到系统日志(使用特定的设施,如local1,并有你的系统日志规则适当的路由(你好时间戳!),

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

在syslog中专门路由消息的规则是可选的,但是如果您使用的是rsyslog,那么这将有助于:

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

不要忘记logrotate规则,因为你使用的是日志logging器,所以你不必担心closures任何日志文件,因为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的输出和日志logging,所以如果你只包含-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) 

尽pipe在/ var / log /下找不到这些日志, 日志保存在一个二进制格式,所以你可以使用journalctl --output json ...如果你想。 有关更多信息,请参阅/etc/systemd/journald.conf。

从开始到结束(尽pipe对于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 } 

Memcached不提供日志文件位置的命令行选项。 在Ubuntu上,有一个名为start-memcached的包装脚本,用于parsing包含日志文件参数的/etc/memcached.conf。 不幸的是,这在CentOS / RHEL上似乎并不存在。 我想你不得不修改init脚本来完成你想要的。 这似乎有点疏忽 – 一个快速的谷歌search表明,其他人也有这个问题,所以也许它的东西,他们很快就会修复(或已经修复,我不知道)。 或者你可以尝试Ubuntu的启动脚本。