Блог программиста
не только о программировании

Дружественные ресурсы:

IntSystem.org | Веб-разработка, все о ней

DevOps-заметки |

14.05.2017

Начали новый проект? Делайте подсистему логирования!

Порог вхождения в разработку ПО, неважно, будь то веб или десктоп приложение сегодня низок как никогда. И тенденция идет к еще большему снижению. И вроде бы всем от этого становится лучше: разработка становится проще, быстрее, дешевле… ровно до первых проблем с проектом, которые могут произойти на разных этапах, от разработки до поддержки.

Под катом вольные рассуждения о том, как диагностировать такие проблемы одним их самых старых и проверенных способов.

А всем ли проектам она нужна?

Если ответить на этот вопрос коротко: то скорее да, чем нет. А теперь подробнее. Самый минимум в ведении логов, который может быть, выглядит как на листинге ниже.

public class app
{
	public function print(String msg, Integer errCode)
	{
		System.out.println("Error: "+msg+" ("+errCode.toString()+")");
	}

	public function Main(String argv[])
	{
		if (!doSomething())
		{
			print("doSomething error", 1);
		}
	}
}

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

И как это сделать, так чтобы и удобно было и информативно?

Это уже вопрос, больше имеющий отношение к архитектуре проекта. Чем больше сам проект, тем обособленнее должно быть логирование.

Например, если разрабатывается какая-то библиотека, и код написан в процедурном стиле, то логичнее было бы завернуть все логирование в отдельный модуль. В случае ООП разработки со сложной архитектурой и/или зависимостями между разными проектами, логирование можно вынести в отдельной проект (библиотеку, как правило), который подключать в виде зависимости. Не ленитесь обращать внимание на то, как это сделано у других и использовать наиболее подходящие под ваш процесс практики. Также следует учитывать, что одна подсистема логирования может оборачиваться в другую. Например, для перенаправления логов системы в приложение. [Логирование в Android](http://elinux.org/Android_Logging_System") работает по этому принципу: несколько подсистем логирования, работающие на разных уровнях, но имеющие общую прослойку для чтения: logcat.

В случае Android все компоненты логирования находятся на одной машине, но это не всегда может быть так. Например, на портале с достаточно высокой нагрузкой логи могут быть вынесены на отдельный сервер (типичная кстати ситуация для микросервисной архитектуры).

Есть более конкретные предложения?

Для начала тезисно оформлю итоги, что же все таки хотелось сказать этим постом:

  • Логирование нужно;
  • С него нужно начинать;
  • Это должен мыть независимый компонент системы, органично вписывающийся в архитектуру проекта (прибитое гвоздями логирование доставляет иногда больше проблем, чем пользы);
  • Не забываем про уровни логирования (dev, test, prod и т.д.) и типы сообщений (info, error, exception, warning и т.д.);
  • В идеале подсистема логирования должна быть построена таким образом, чтобы ее можно было перенести на другой проект.

А теперь что касается матчасти… К счастью, все уже написано до меня, поэтому ниже привожу список статей, рекомендуемых к прочтению. Читайте и начинайте, наконец, делать свою подсистему логирования.

вариант "все в одном"

каждый компонент работает независимо, но логи отправляются в одно место

пример разбора полетов

много текста по log4j