Drupal → Будьте внимательней с watchdog()

07.08.2012

В функцию 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
Похожие записи

Комментарии

Первый вариант (если текст будет на английском) вполне безопасен, при условии, что переменные жестко прописаны в коде и имеют фиксированные значения. Даже если это не одно значение, а несколько (массив).
Более того, в некоторых случаях это единственный возможный вариант.

Вот пример:

foreach (array(t('first'), t('second'), t('third') as $number) {
  watchdog('mymodule', 'Added @number page.', array('@number' => $number));
}

first, second, third в системе наверняка будут переведены как первый, второй, третий.
Строка "Added @number page" будет переведена как "Добавлена @number страница".

В результате на выходе получим вот такие переводы:

  • Добавлена первый страница.
  • Добавлена второй страница.
  • Добавлена третий страница.

Поэтому, в данном конкретном случае больше подходит вот такой «неправильнй» код:

foreach (array('first', 'second', 'third') as $number) {
  watchdog('mymodule', "Added $number page.");
}

Теперь в locales_source попадёт все три строки, которые могут быть переведены с учётом правил русского языка.

@Ch, зачем?
лог это лог а не конфетка

Во первых, какой смысл тогда вообще переводить сообщений в логах? По мне так уж лучше пусть будут на английском, чем на кривом русском. Во вторых, это относится не только к watchdog, но и в первую очередь к функции t(), которую он использует. В примерах выше уберите mymodule и замените watchdog на t. Получится тот же эффект.

А не появилось ли ничего для удобной очистки таблички? А то приходится лезть и туда ручками в базе удалять.

UnderQuak3r
28.06.2013, 17:08

А не появилось ли ничего для удобной очистки таблички? А то приходится лезть и туда ручками в базе удалять.

Для D6 есть простой модуль, который добавляет кнопку очистки таблицы логов
https://drupal.org/project/dblog_clear

Добавить комментарий