Как делать логирование ?
От: Аноним  
Дата: 03.11.13 13:35
Оценка:
Допустим есть некий ILog , который содержит необходимое для логирования.

Вариант 1. Создать глобальный объект статический класс и статическое поле , доступно везде, только проблема что будет во всех классах привязка к этому статическому классу и полю.

Вариант 2. Классы которые хотят логировать действия в своих методах должны принимать на вход экземпляр ILog. Плохо то что везде нужно в конструкторах этот ILog требовать и в инстанцируемые объекты передавать, еще хуже когда требуется разные логи вести ( в разные файлы ). Например в классе "Автомобиль" есть объекты "Деталь", у которых должен быть свой лог, соотвественно где-то в автомобиле нужно создать новый экземпляр реализующий ILog для деталей.


Какие еще есть варианты ?
Re: Как делать логирование ?
От: koodeer  
Дата: 03.11.13 14:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Какие еще есть варианты ?


DI/IoC, ServiceLocator, AOP.
Re: Как делать логирование ?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.11.13 14:46
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>Вариант 1. Создать глобальный объект статический класс и статическое поле , доступно везде, только проблема что будет во всех классах привязка к этому статическому классу и полю.


А>Вариант 2. Классы которые хотят логировать действия в своих методах должны принимать на вход экземпляр ILog. Плохо то что везде нужно в конструкторах этот ILog требовать и в инстанцируемые объекты передавать, еще хуже когда требуется разные логи вести ( в разные файлы ). Например в классе "Автомобиль" есть объекты "Деталь", у которых должен быть свой лог, соотвественно где-то в автомобиле нужно создать новый экземпляр реализующий ILog для деталей.



А>Какие еще есть варианты ?


А какая платформа? От этого зависит чуть менее чем все.
Re[2]: Как делать логирование ?
От: Аноним  
Дата: 03.11.13 14:53
Оценка:
А>>Какие еще есть варианты ?

G>А какая платформа? От этого зависит чуть менее чем все.


.NET
Re[3]: Как делать логирование ?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.11.13 15:02
Оценка:
Здравствуйте, Аноним, Вы писали:




А>>>Какие еще есть варианты ?


G>>А какая платформа? От этого зависит чуть менее чем все.


А>.NET


Тогда System.Diagnostics.
См классы Trace и TraceSource.
Ботай примеры на MSDN до просветления.
Re[4]: SemanticLogging
От: Qbit86 Кипр
Дата: 03.11.13 16:50
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Тогда System.Diagnostics.

G>См классы Trace и TraceSource.

SemanticLogging пробовал?
Глаза у меня добрые, но рубашка — смирительная!
Re: Как делать логирование ?
От: vsb Казахстан  
Дата: 03.11.13 17:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вариант 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 перестанет удовлетворять требованиям и придется его везде выпиливать.
Например потребуется ввести дополнительный параметр для инициализации, который будет определяться после создания объекта и нельзя будет в статик засунуть.
Re[5]: SemanticLogging
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 03.11.13 19:11
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, gandjustas, Вы писали:


G>>Тогда System.Diagnostics.

G>>См классы Trace и TraceSource.

Q>SemanticLogging пробовал?


Смотрел, но смысла не понял.

Для ASP.NET — ELMAH.
Для у готовых платформ свои логгеры.
Для end-user приложений гораздо важнее как доставить лог разработчику, чем разбираться что и как логировать.
Re: Как делать логирование ?
От: Sharov Россия  
Дата: 04.11.13 08:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вариант 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 , то придется менять код каждого класса.
Re[3]: Как делать логирование ?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.11.13 17:59
Оценка: +4
Здравствуйте, Аноним, Вы писали:


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.
Re[3]: Как делать логирование ?
От: Legion13  
Дата: 10.11.13 15:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В этом случае класс Test будет привязан к конкретному классу Logger, если класс Logger потом будет решено заменить на класс Logger2 , то придется менять код каждого класса.


Некоторый жизненный опыт подсказывает, что логгер в процессе жизни приложения меняется чуть реже, чем никогда. Если сразу выбрать нормальный логгер под свои задачи.
И в любом случае, конструкция запроса логгера такова, что ее будет несложно заменить обычным реплейсом.
Re[2]: Как делать логирование ?
От: koodeer  
Дата: 10.11.13 18:26
Оценка:
Я писал:

K>DI/IoC, ServiceLocator, AOP.


На моё сообщение топикстартер не отреагировал, между тем продолжает спрашивать, как отвязаться от конкретной реализации логгера.
DI/IoC-контейнеры и ServiceLocator'ы как раз для этого и предназначены: указываем зависимости в одном месте, где-то в начале приложения. Протаскивать их по всему коду не нужно. Можно брать зависимости из конфига.
О проблемах, связанных с этим подходом говорить не будем. Где-то тут неподалёку идёт обширный холивар на эту тему.

AOP — Aspect Oriented Programming позволяет вообще вставлять логирование (или любой другой код) куда угодно. То есть наши классы и методы продолжают оставаться чистыми, незагрязнёнными операциями логирования. Код бизнес-логики остаётся простым и ясным.
Наверное, самый известный представитель для .NET — PostSharp.
Опять же, о возможных проблемах с отладкой, рефлексией и прочим говорить не будем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.