Назад | Перейти на главную страницу

Как указать файл журнала для memcached на RHEL / CentOS

Я использую memcached 1.4.5 на RHEL5.5. Я установил это с помощью yum, который установил стандартный скрипт memcached в /etc/init.d и файл конфигурации в /etc/sysconfig/memcached:

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

Все работает нормально, за одним исключением - я не могу понять, как указать местоположение файла журнала. Я хотел бы поместить файл журнала в /var/log но в справке и руководстве не указано, как это сделать.

Можно ли этого добиться с помощью базовых скриптов?

Измените строку OPTIONS в /etc/sysconfig/memcached добавление ">> /var/log/memcached 2>&1" в конце. IE

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

С помощью 2>&1 >> logfile в OPTIONS или сценарии инициализации неразумно, так как файл журнала не будет повторно открываться, когда произойдет ротация журнала, конечно, при условии, что вы что-то сделали для этого. Следствием этого является то, что в конечном итоге вы получите повернутые файлы журнала (пустые, в зависимости от настроек ротации), и ваши фактические данные журнала будут записаны в файл, для которого на самом деле нет записи в каталоге, что означает, что он будет удален, когда файл закрыт. Чтобы файл журнала был закрыт по назначению и, следовательно, безопасно вращался, вам придется перезапустить memcached (до свидания, кеш!).

Вместо этого используйте что-то вроде команды logger (1) для входа в системный журнал (с определенным средством, таким как local1, и пусть ваши правила системного журнала маршрутизируют его соответствующим образом (привет, временные метки!),

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
}

Memcached не предоставляет параметр командной строки для определения местоположения файла журнала. В Ubuntu есть сценарий-оболочка start-memcached, который анализирует файл /etc/memcached.conf, содержащий параметр файла журнала. К сожалению, в CentOS / RHEL этого, похоже, нет. Я думаю, вам придется изменить сценарий инициализации, чтобы добиться того, что вы хотите. Это действительно похоже на недосмотр - быстрый поиск в Google показывает, что у других людей тоже есть эта проблема, так что, возможно, они скоро это исправят (или уже исправили, а я не знаю). Или вы можете попробовать сценарии запуска из Ubuntu.

Предложение создать журнал отладки для memcached в предыдущем посте:

Предполагая, что у пользователя нет прав на запись в / tmp, попробуйте следующее, отметив позицию 2:


memcached -d -m 3072 -l localhost -p 11211 -u никто -v 2 >> / tmp / memcached.log

Если пользователь не может писать в / var / log, я бы предположил, что можно заменить / tmp на / var / log в приведенной выше команде.