История болезни: при выводе в Syslog русских строк в кодировке UTF-8 появляются нечитаемые символы, а проще говоря, абракадабра.
Вопрос: Почему демон syslogd в отлично локализованном Debian не работает с такими строками?
Ответ: Он не должен этого делать в соответствии с своим стандартом RFC 3164 - The BSD Syslog Protocol (см. раздел 4.1 syslog Message Parts).
Решение: Так как нет никакой надежды на то, что сборщики консервативного Debian пойдут на нарушение стандарта в таком важном системном пакете, выход у нас только один: самостоятельное наложить патч и пересобрать пакет sysklogd.
Для пересборки пакета использовалось руководство «Сборка пакетов Debian» и UTF-8 патч
Получаем пакет с исходными кодами sysklogd и устанавливаем дополнительные пакеты для сборки:
user@host:~ sudo apt-get source sysklogd user@host:~ sudo apt-get build-dep sysklogd
Переходим в полученный каталог sysklogd_1.4.1 и правим файл syslogd.c функция printline():
--- syslogd.c.orig 2007-08-05 12:06:17.000000000 +0400 +++ syslogd.c 2007-08-04 14:58:35.000000000 +0400 @@ -1468,7 +1468,7 @@ else if (c < 040) { *q++ = '^'; *q++ = c ^ 0100; - } else if (c == 0177 || (c & 0177) < 040) { + } else if (c == 0177 /* this comment allow Russian messages in UTF-8: || (c & 0177) < 040 */) { *q++ = '\\'; *q++ = '0' + ((c & 0300) >> 6); *q++ = '0' + ((c & 0070) >> 3);
Изменяем changelog и собираем пакет:
user@host:~ dch -i user@host:~ debuild
Скачиваем пакет с репозитория (адрес см. в начале страницы) и обновляем:
user@host:~ sudo dpkg -i sysklogd_1.4.1.UTF8-18_i386.deb
Проверяем установленную версию и кандидата - новую доступную версию согласно apt_preferences:
user@host:~$ apt-cache policy sysklogd sysklogd: Установлен: 1.4.1-18 Кандидат: 1.4.1-18 Таблица версий: *** 1.4.1-18 0 500 cdrom://[Debian GNU/Linux 4.0 r0 _Etch_ - Official i386 DVD Binary-1 20070407-11:40] etch/main Packages 100 /var/lib/dpkg/status
Прописываем адрес репозитория в /etc/apt/sources.list
... deb http://avreg.net/debian/ etch contrib non-free main ...
Обновляем список, доступных пакетов:
user@host:~ sudo aptitude update
Снова проверяем версию кандидата:
user@host:~$ apt-cache policy sysklogd sysklogd: Установлен: 1.4.1-18 Кандидат: 1.4.1.UTF8-18 Таблица версий: 1.4.1.UTF8-18 0 500 http://192.168.0.241 etch/main Packages *** 1.4.1-18 0 500 cdrom://[Debian GNU/Linux 4.0 r0 _Etch_ - Official i386 DVD Binary-1 20070407-11:40] etch/main Packages 100 /var/lib/dpkg/status
Обновляем пакет sysklogd без изменения конфигурационных файлов.
user@host:~ sudo aptitude install sysklogd
Проверяем версию установленного пакета и откуда он был получен.
user@host:~$ apt-cache policy sysklogd sysklogd: Установлен: 1.4.1.UTF8-18 Кандидат: 1.4.1.UTF8-18 Таблица версий: *** 1.4.1.UTF8-18 0 500 http://avreg.net etch/main Packages 100 /var/lib/dpkg/status 1.4.1-18 0 500 cdrom://[Debian GNU/Linux 4.0 r0 _Etch_ - Official i386 DVD Binary-1 20070407-11:40] etch/main Packages
user@host:~$ logger 'Теперь демоны могут писать в сислог на русском языке в кодировке UTF-8' user@host:~$ tail /var/log/messages Jul 31 10:36:01 debian -- MARK -- Jul 31 10:54:59 host: user: Теперь демоны могут писать в сислог на русском языке в кодировке UTF-8