值得一提的是,EL7(systemd)系统的情况有所不同

值得一提的是,EL7(systemd)系统的情况有所不同

我在 RHEL5.5 上运行 memcached 1.4.5。我使用 yum 安装了它,它已在中安装了标准 memcached 脚本,/etc/init.d并在中安装了配置文件/etc/sysconfig/memcached

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

一切都运行良好,但有一个例外——我不知道如何指定日志文件位置。我想把日志文件放进去,/var/log但帮助和手册都没有说明如何做到这一点。

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

答案1

上一篇文章中建议为 memcached 创建调试日志:

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


memcached -d -m 3072 -l 本地主机 -p 11211 -u 没人 -v 2>>/tmp/memcached.log

如果用户 nobody 可以写入 /var/log 那么我认为可以在上面的命令中用 /var/log 替换 /tmp。

答案2

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

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

答案3

在 OPTIONS 或 init 脚本中使用2>&1 >> logfile是不明智的,因为当日志轮换发生时日志文件不会重新打开,当然前提是你已经为此做好了准备。这意味着你最终会得到轮换后的日志文件(空的,取决于轮换设置),而你的实际日志数据将被写入一个实际上不存在目录条目的文件中,这意味着当文件关闭时它将被删除。为了在预期的时间内关闭日志文件,从而安全地轮换,你必须重新启动 memcached(再见缓存!)。

相反,使用类似 logger(1) 命令的东西来记录到 syslog(使用特定的工具,比如 local1,并让你的 syslog 规则正确地路由它(你好时间戳!),

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

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

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

不要忘记 logrotate 规则,因为您正在使用 logger,所以您不需要担心关闭任何日志文件,因为 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
}

值得一提的是,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
}

答案4

为那些想要在 /var/log/messages 中查看快速日志(无轮换)的人添加了这个答案

考虑到您的 memcached 配置位于 [/etc/sysconfig/memcached](Redhat RHEL 和 Centos 8 等),您只需将以下开关添加到您的选项并重新启动 memcached。然后它会将内容记录到/var/log/消息

OPTIONS="-vv"

如果你不想记录太多日志,请删除其中一个。重新启动 memcache

以下配置将使 memcache 监听 localhost 并禁用 udp,同时记录到 /var/log/messages

OPTIONS="-l 127.0.0.1, -U 0, -vv"

因为当您不再需要记录日志时,详细的 -vv 会记录太多内容,所以只需从选项 [OPTIONS=""] 中删除所有内容并重新启动 memcache,然后使用以下命令在需要时进行检查:

memcached-tool 127.0.0.1:11211 stats

或者

echo stats | nc 127.0.0.1 11211

相关内容