Этот оператор `log 'больше похож на инструкцию трассировки.
Logging: показать нормальные события и ошибки
Трассировка: показать путь выполнения, а также все регистрации событий
Лично я хочу протоколирования, чтобы узнать, какая работа была проделана моим и я хочу, чтобы инструкции трассировки проверяли путь выполнения и выясняли, что пошло не так. Я направлю инструкции трассировки в отдельный файл, который включает в себя оба типа сообщений журнала для контекста.
Итак, у вас должно быть 2 уровня журнала, по крайней мере, и возможность отключить отслеживание производительности. Вы должны иметь возможность маршрутизировать эти потоки событий в разные местоположения. Это позволяет вам легко вести журналы для исторических записей, не имея их загромождаемых информацией об отладке, которые вам нужны только для отслеживания проблем.
Многие ответы здесь сосредоточены на полях, которые вы включили бы в сообщение журнала, но я бы сказал, что уровень размещения и ведения журнала вызовов журнала более важен.Если вы используете log4net, вы сможете включать/исключать штамп даты по умолчанию через конфигурационные файлы, но вы не сможете размещать или удалять записи журналов без перекомпиляции, поэтому имеет смысл серьезно подумать о том, куда они идут. Помимо стандартных полей, таких как метка времени и идентификатор потока, и т. Д., Вы хотите узнать имя класса и метода, из которого был сделан вызов. Log4net et al. Заботится о имени класса уже, если вы перейдете к своей лучшей практике именования вашего регистратора после того типа, с которым вы связаны. Помимо этого, я обычно включаю имя метода. Это особенно необходимо для отслеживания, но я включаю его во все мои сообщения журнала.
Logging:
Вы хотите знать достаточно информации о том, какие действия собирается быть выполнены, чтобы вернуться назад и копаться, если что-то пойдет не так. Хорошими кандидатами являются идентификаторы сообщений, адреса электронной почты, то, что однозначно идентифицирует рабочий элемент. Такое сообщение должно появиться, как только будут доступны такие данные, чтобы при чтении через файл журнала вы увидите что-то вроде «попытки сделать x с y», а затем, если мы увидим исключение, мы знаем, какой рабочий элемент нам нужно посмотреть, чтобы понять, почему мы потерпели неудачу.
Ошибки регистрации должны быть соединены с сообщением журнала попыток, так что сообщение об ошибке имеет смысл в контексте при чтении журнала. Это означает мысль о структуре обработки исключений. Если вы используете .net, и вы хотите только регистрировать исключение, а не обрабатывать его, вы хотите повторно удалить исключение, а не новое, поэтому просто «бросайте», а не «бросайте e», где «e» ваш экземпляр исключения. Посмотрите это, если это не имеет смысла.
Трассировка:
Это на самом деле проще, как правило, я буду иметь сообщение в начале и в конце метода, представляющего интерес, как форзацев. В записи вы можете распечатать критические аргументы метода, влияющие на поток программы. Регистрация сообщения в конце метода является необязательным, обычно вам будет интересно посмотреть на трассировку вроде трассировки стека. Вы можете определить путь выполнения без них.
Performance:
Для выполнения строки, используйте методы '* Формат', если вы используете log4net или что-то подобное. Это внутренне будет использовать StringBuilder, чтобы вы не платили неизменную строчную штрафную сумму все время. Как правило, хотя ключ состоит в том, чтобы иметь возможность отключить трассировку для производительности и иметь протоколирование достаточно кратким, чтобы оставаться включенным, даже если сообщение журнала дорого. Когда это правильно сделано, их должно быть недостаточно, чтобы быть проблемой.
Это хорошо, потому что вы можете поместить MSG-12345 в wiki – 2008-11-06 23:39:56
В некоторых контекстах может быть полезным идентификатор процесса или PID (а иногда и идентификатор потока или TID). Но Стефан дает отличный совет. – 2008-11-07 06:36:31