Я использую 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
}
Для систем 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 для получения дополнительной информации.
# 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:
Если пользователь не может писать в / var / log, я бы предположил, что можно заменить / tmp на / var / log в приведенной выше команде.