Как я могу регистрировать исключения в PHP?

Я узнал, как преобразовывать ошибки в исключения, и я показываю их красиво, если они не пойманы, но я не знаю, как правильно их записывать. Просто написать их в файл не будет полезно, не так ли? И вы рискуете получить доступ к базе данных, когда еще не знаете, что вызвало исключение?

Ответ 1

Мне очень нравится log4php для ведения журнала, хотя он еще не вышел из инкубатора. Я использую log4net почти во всем, и нашел для меня стиль вполне естественным.

Что касается сбоев системы, вы можете зарегистрировать ошибку для нескольких адресатов (например, есть приложения, чей порог CRITICAL или ERROR, которые вступают в игру только тогда, когда что-то идет не так). Я не уверен, насколько безопасны существующие существующие приложения - если база данных не работает, как это приложение не удается? - но вы могли бы легко написать свой собственный appender, который будет неудачно изящно, если он не сможет зарегистрировать.

Ответ 2

Вы можете использовать set_error_handler, чтобы настроить собственное исключение для регистрации ваших ошибок. Я бы лично подумал о сохранении их в базе данных, поскольку по умолчанию обработчик BackException Exception может предоставить информацию о том, что вызвало его, - это, конечно, будет невозможно, если обработчик базы данных инициировал исключение.

Вы также можете использовать error_log, чтобы регистрировать свои ошибки. Он имеет выбор адресатов сообщений, включая:

Цитата из error_log

  • Регистратор систем PHP, используя механизм ведения журнала операционной системы или файл, в зависимости от того, для чего установлена ​​директива конфигурации error_log. Это опция по умолчанию.
  • Отправляется по электронной почте по адресу в параметре назначения. Это единственный тип сообщения, в котором используется четвертый параметр extra_headers.
  • Добавлен в пункт назначения файла. Новая строка не добавляется автоматически в конец строки сообщения.

Изменить: имеет ли уценка тег noparse для подчеркивания?

Ответ 3

Просто записать их в файл не будет полезно, не так ли?

Но, конечно же, это - отличная вещь, гораздо лучше, чем отображение их на экране. Вы хотите показать пользователю хороший экран, в котором говорится: "Извините, мы разобрались. Инженеры были уведомлены. Вернитесь назад и повторите попытку" и абсолютно БЕСПЛАТНО ТЕХНИЧЕСКИЕ ДЕТАЛИ, потому что для этого будет риск для безопасности. Вы можете отправить электронное письмо в общий почтовый ящик и зарегистрировать исключение для файла или базы данных для последующего рассмотрения. Это будет лучшей практикой.

Ответ 4

Я бы записал их в файл - и, возможно, установил систему мониторинга, чтобы проверить изменения даты или даты последнего изменения. Webmin - это простой способ, но есть более полные программные решения.

Если вы знаете его одноразовую ошибку, то отправка сообщения по электронной почте может быть прекрасной. Тем не менее, со множеством посещений за минуту веб-сайта, никогда не отправляйте уведомления по электронной почте. Я видел, что веб-сайт сбил сотни писем в минуту, созданных, чтобы сказать, что система не может подключиться к базе данных. Тот факт, что он также имел LoadAvg > 200 из-за почтового сервера, запускаемого для каждого нового сообщения, вообще не помог. В этом случае лучшим сценарием был, во всяком случае, сторожевой таймер, проверяющий файлы и подключение к внешней службе для отправки SMS (возможно, IM) или внешний вид системы на веб-странице для сообщения об ошибке не должен быть видимым на экране - он может быть в комментарии HTML).

Ответ 5

Я думаю, что это зависит от того, где произошла ваша ошибка. Если БД не работает, то записывает его в БД, нет хорошей идеи;)

Я использую syslog() для регистрации ошибки, но у меня нет проблем записывать ее в файл, когда я нахожусь система, не имеющая поддержки syslog. Вы можете легко настроить свою систему для отправки вам сообщения электронной почты или сообщения jabber, например, logwatch или стандартный syslogd.

Ответ 6

I второй log4php. Обычно я настроен на отправку таких вещей, как исключения, в ERROR или CRITITCAL и их запись в syslog. Оттуда вы можете добавить свой файл syslog в Zenoss, Nagios, Splunk или что-нибудь еще, что syslog может поговорить.