Допустим есть некий ILog , который содержит необходимое для логирования.
Вариант 1. Создать глобальный объект статический класс и статическое поле , доступно везде, только проблема что будет во всех классах привязка к этому статическому классу и полю.
Вариант 2. Классы которые хотят логировать действия в своих методах должны принимать на вход экземпляр ILog. Плохо то что везде нужно в конструкторах этот ILog требовать и в инстанцируемые объекты передавать, еще хуже когда требуется разные логи вести ( в разные файлы ). Например в классе "Автомобиль" есть объекты "Деталь", у которых должен быть свой лог, соотвественно где-то в автомобиле нужно создать новый экземпляр реализующий ILog для деталей.
Здравствуйте, Аноним, Вы писали:
А>Допустим есть некий ILog , который содержит необходимое для логирования.
А>Вариант 1. Создать глобальный объект статический класс и статическое поле , доступно везде, только проблема что будет во всех классах привязка к этому статическому классу и полю.
А>Вариант 2. Классы которые хотят логировать действия в своих методах должны принимать на вход экземпляр ILog. Плохо то что везде нужно в конструкторах этот ILog требовать и в инстанцируемые объекты передавать, еще хуже когда требуется разные логи вести ( в разные файлы ). Например в классе "Автомобиль" есть объекты "Деталь", у которых должен быть свой лог, соотвественно где-то в автомобиле нужно создать новый экземпляр реализующий ILog для деталей.
А>Какие еще есть варианты ?
А какая платформа? От этого зависит чуть менее чем все.
Re[2]: Как делать логирование ?
От:
Аноним
Дата:
03.11.13 14:53
Оценка:
А>>Какие еще есть варианты ?
G>А какая платформа? От этого зависит чуть менее чем все.
Здравствуйте, Аноним, Вы писали:
А>Вариант 1. Создать глобальный объект статический класс и статическое поле , доступно везде, только проблема что будет во всех классах привязка к этому статическому классу и полю.
А в чём конкретно проблема? То, что у вас во всех классах привязка к классу string, вас тоже волнует?
А>Вариант 2. Классы которые хотят логировать действия в своих методах должны принимать на вход экземпляр ILog. Плохо то что везде нужно в конструкторах этот ILog требовать и в инстанцируемые объекты передавать, еще хуже когда требуется разные логи вести ( в разные файлы ). Например в классе "Автомобиль" есть объекты "Деталь", у которых должен быть свой лог, соотвественно где-то в автомобиле нужно создать новый экземпляр реализующий ILog для деталей.
А>Какие еще есть варианты ?
В Java принято писать так:
private static final Logger logger = LogFactory.getLogger(CurrentClass.class);
в принципе тот же самый статический класс.
Проблем по-моему ни у кого не возникало.
Re[2]: Как делать логирование ?
От:
Аноним
Дата:
03.11.13 18:10
Оценка:
Здравствуйте, vsb, Вы писали:
vsb>Здравствуйте, Аноним, Вы писали:
А>>Вариант 1. Создать глобальный объект статический класс и статическое поле , доступно везде, только проблема что будет во всех классах привязка к этому статическому классу и полю.
vsb>А в чём конкретно проблема? То, что у вас во всех классах привязка к классу string, вас тоже волнует?
string это стандартный класс , код скомпилится.
А различные реализации ILog это уже специфика, не хотелось бы завязываться на них.
Хочется класс делать наиболее изолированным от любой инородной специфики
А>>Вариант 2. Классы которые хотят логировать действия в своих методах должны принимать на вход экземпляр ILog. Плохо то что везде нужно в конструкторах этот ILog требовать и в инстанцируемые объекты передавать, еще хуже когда требуется разные логи вести ( в разные файлы ). Например в классе "Автомобиль" есть объекты "Деталь", у которых должен быть свой лог, соотвественно где-то в автомобиле нужно создать новый экземпляр реализующий ILog для деталей.
А>>Какие еще есть варианты ?
vsb>В Java принято писать так:
vsb>private static final Logger logger = LogFactory.getLogger(CurrentClass.class);
vsb>в принципе тот же самый статический класс.
vsb>Проблем по-моему ни у кого не возникало.
Проблемы возникнут когда LogFactory.getLogger перестанет удовлетворять требованиям и придется его везде выпиливать.
Например потребуется ввести дополнительный параметр для инициализации, который будет определяться после создания объекта и нельзя будет в статик засунуть.
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, gandjustas, Вы писали:
G>>Тогда System.Diagnostics. G>>См классы Trace и TraceSource.
Q>SemanticLogging пробовал?
Смотрел, но смысла не понял.
Для ASP.NET — ELMAH.
Для у готовых платформ свои логгеры.
Для end-user приложений гораздо важнее как доставить лог разработчику, чем разбираться что и как логировать.
Здравствуйте, Аноним, Вы писали:
А>Вариант 2. Классы которые хотят логировать действия в своих методах должны принимать на вход экземпляр ILog. Плохо то что везде нужно в конструкторах этот ILog требовать и в инстанцируемые объекты передавать, еще хуже когда требуется разные логи вести ( в разные файлы ). Например в классе "Автомобиль" есть объекты "Деталь", у которых должен быть свой лог, соотвественно где-то в автомобиле нужно создать новый экземпляр реализующий ILog для деталей.
Зачем передавать как отдельный параметр? Можно просто так:
class Test
{
private readonly ILog logger = new Logger(typeof(Test));//считает глобальный настройки из файла
//конструкторpublic Test(){...}
}
Если же нужна дополнительная конфигурация,то в конструкторе, например класса "Деталь",
и конфигурируете логгер,без каких-либо дополнительных параметров.
Кодом людям нужно помогать!
Re[2]: Как делать логирование ?
От:
Аноним
Дата:
04.11.13 10:06
Оценка:
S>Зачем передавать как отдельный параметр? Можно просто так: S>
S>class Test
S>{
S> private readonly ILog logger = new Logger(typeof(Test));//считает глобальный настройки из файла
S> //конструктор
S> public Test(){...}
S>}
S>
В этом случае класс Test будет привязан к конкретному классу Logger, если класс Logger потом будет решено заменить на класс Logger2 , то придется менять код каждого класса.
S>>Зачем передавать как отдельный параметр? Можно просто так: S>>
S>>class Test
S>>{
S>> private readonly ILog logger = new Logger(typeof(Test));//считает глобальный настройки из файла
S>> //конструктор
S>> public Test(){...}
S>>}
S>>
А>В этом случае класс Test будет привязан к конкретному классу Logger, если класс Logger потом будет решено заменить на класс Logger2 , то придется менять код каждого класса.
О, ужас! Ctrl+Shift+H -> Logger -> Logger2 -> Match Whole Word -> Match Case -> Replace All.
Здравствуйте, Аноним, Вы писали:
А>В этом случае класс Test будет привязан к конкретному классу Logger, если класс Logger потом будет решено заменить на класс Logger2 , то придется менять код каждого класса.
Некоторый жизненный опыт подсказывает, что логгер в процессе жизни приложения меняется чуть реже, чем никогда. Если сразу выбрать нормальный логгер под свои задачи.
И в любом случае, конструкция запроса логгера такова, что ее будет несложно заменить обычным реплейсом.
На моё сообщение топикстартер не отреагировал, между тем продолжает спрашивать, как отвязаться от конкретной реализации логгера.
DI/IoC-контейнеры и ServiceLocator'ы как раз для этого и предназначены: указываем зависимости в одном месте, где-то в начале приложения. Протаскивать их по всему коду не нужно. Можно брать зависимости из конфига.
О проблемах, связанных с этим подходом говорить не будем. Где-то тут неподалёку идёт обширный холивар на эту тему.
AOP — Aspect Oriented Programming позволяет вообще вставлять логирование (или любой другой код) куда угодно. То есть наши классы и методы продолжают оставаться чистыми, незагрязнёнными операциями логирования. Код бизнес-логики остаётся простым и ясным.
Наверное, самый известный представитель для .NET — PostSharp.
Опять же, о возможных проблемах с отладкой, рефлексией и прочим говорить не будем.