В функцию watchdog()
нельзя передавать динамические сообщения и сообщения на языках отличных от английского! Дело в том, что при выводе системного журнала, все сообщения проходят через t()
и при неаккуратном использовании можно запросто загадить таблицу locales_source
:
Неправильное использование watchdog()
:
// bad
watchdog(
'mymodule',
'Заблокировано спам сообщение. Имя: ' . $name . ', сообщение: ' . $message
);
Правильное использование watchdog()
:
// good
watchdog(
'mymodule',
'Blocked spam message. Name: @name, message: @message',
array('@name' => $name, '@message' => $message)
);
Добавлено 26/08/2012:
Если в watchdog третьим параметром передавать NULL
, то в качестве текста можно использовать любые сообщения на любом языке, так как они не будут проходить через t()
:
// not so bad
watchdog(
'mymodule',
'Заблокировано спам сообщение. Имя: ' . $name . ', сообщение: ' . $message,
NULL
);
Но это естественно bad practice.
Написанное актуально для
Drupal 6
Комментарии
Первый вариант (если текст будет на английском) вполне безопасен, при условии, что переменные жестко прописаны в коде и имеют фиксированные значения. Даже если это не одно значение, а несколько (массив).
Более того, в некоторых случаях это единственный возможный вариант.
Вот пример:
first, second, third в системе наверняка будут переведены как первый, второй, третий.
Строка "Added @number page" будет переведена как "Добавлена @number страница".
В результате на выходе получим вот такие переводы:
Поэтому, в данном конкретном случае больше подходит вот такой «неправильнй» код:
Теперь в locales_source попадёт все три строки, которые могут быть переведены с учётом правил русского языка.
@Ch, зачем?
лог это лог а не конфетка
Во первых, какой смысл тогда вообще переводить сообщений в логах? По мне так уж лучше пусть будут на английском, чем на кривом русском. Во вторых, это относится не только к watchdog, но и в первую очередь к функции t(), которую он использует. В примерах выше уберите mymodule и замените watchdog на t. Получится тот же эффект.
добавил замечание
А не появилось ли ничего для удобной очистки таблички? А то приходится лезть и туда ручками в базе удалять.
Для D6 есть простой модуль, который добавляет кнопку очистки таблицы логов
https://drupal.org/project/dblog_clear
Добавить комментарий