Здравствуйте, minorlogic, Вы писали:
M>Как большой любитель шаблона Singleton, хочу поговорить про использование этого шаблона для логирования. Логирование часто приводится как пример умесного применения сингелтона.
Расскажи пожалуйста, как в описанной системе будет\может быть реализована следующая возможность: отключение логирования в зависимости от модуля, в котором логирование было вызвано, например, я не хочу логировать отрисовку графики, но хочу логировать сетевую активность. Причём оба модуля, отвечающие за графику и за сеть, имеют одну и ту жу точку входа к механизму логирования, как это сделано в приведённом примере: Logger->GetInstance(); Мне видится только один способ: коментирование всех вызовов логирования
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Расскажи пожалуйста, как в описанной системе будет\может быть реализована следующая возможность: отключение логирования в зависимости от модуля, в котором логирование было вызвано, например, я не хочу логировать отрисовку графики, но хочу логировать сетевую активность. Причём оба модуля, отвечающие за графику и за сеть, имеют одну и ту жу точку входа к механизму логирования, как это сделано в приведённом примере: Logger->GetInstance(); Мне видится только один способ: коментирование всех вызовов логирования
Мне кажется это ни коим образом не относится к теме ветки. Если тебя интересует как реализовать фильтрацию логирования , я советую поискать прямо на форуме. Тут было достаточно много веток про логи и интерфейсы к ним.
Здравствуйте, minorlogic, Вы писали:
M>Мне кажется это ни коим образом не относится к теме ветки. Если тебя интересует как реализовать фильтрацию логирования , я советую поискать прямо на форуме. Тут было достаточно много веток про логи и интерфейсы к ним.
Это имеет прямое отношение к реализации посредством синглетона. Какие известные системы логирования, основанные на синглетонах, это позволяют? Ещё раз, как это можно реализовать в описанной в корневом сообщении системе?
Мне не видно, как можно _хорошо_ и _удобно_ реализовать фильтрацию одновременно по различным ортоганальным уровням, таким как вызывающий модуль, важность (ошибка|предупреждение|информация), природа (исключение|логика).
З.Ы. Да и вежливость ответов отнюдь не располагает к дискуссии Это только мне кажется, или для чего топик был создан?
Критику синглетонов можно так же при желании отыскать на этом же самом форуме, а в корневом сообщении я не нашёл ни одного опровержения уже приведённых ранее доводов Ты надеешься что в очередной раз IB и WolfHound поленятся мучить свои клавиатуры? Так вот судя по манере ответов, правильно сделают
Help will always be given at Hogwarts to those who ask for it.
Ты пытаешься увести тему в сторону , я вежливо обращаю на это внимание. Мне лично в этой теме не хочется обсуждать офтопики, возможно ктонить захочет вести с тобой диалог по заданному направлениею.
Здравствуйте, minorlogic, Вы писали:
M>Ты пытаешься увести тему в сторону , я вежливо обращаю на это внимание. Мне лично в этой теме не хочется обсуждать офтопики, возможно ктонить захочет вести с тобой диалог по заданному направлениею.
Тебе пытаются объяснить очень простую вещь: невозможно обсуждать преимущества и недостатки синглтона на примере его некорректного использования.
Я не IB и не Wolfhound, я, в отличие от них, считаю что синглтон вполне имеет право на жизнь. Но даже меня твой пример коробит.
Здравствуйте, _FRED_, Вы писали:
_FR>Это имеет прямое отношение к реализации посредством синглетона. Какие известные системы логирования, основанные на синглетонах, это позволяют? Ещё раз, как это можно реализовать в описанной в корневом сообщении системе?
_FR>Мне не видно, как можно _хорошо_ и _удобно_ реализовать фильтрацию одновременно по различным ортоганальным уровням, таким как вызывающий модуль, важность (ошибка|предупреждение|информация), природа (исключение|логика).
Синглтоновость тут как раз не помеха и ServiceProvider не помощник в фильтрации. Модуль надо маркировать явно. Почему я так думаю:
Модули вызывают друг друга и если мне с верхнего уровня доступна только бизнес-логика, то я лучшем случае могу создать UserLogger и OrderLogger, но не DatabaseLogger или NetworkLogger. Подобные детали скрыты и позволять создавать логегры на любом уровня я считаю большой ошибкой. В результате мы всё равно придём к использования синглтона, так как откуда-то надо брать настройки логгеров, только это будет хорошо замаскированный и сильно запутанный синглтон.
Модули которые вызывают логгер не всегда являются характеризующими. Например, сетевой трафик при скачивании курса валют с сайта ЦБ и сетевой трафик при отсылке данных об ошибке приложения оба HTTP трафики, но писать просто NetworkModule ИМХО не правильно.
Здравствуйте, minorlogic, Вы писали:
R>>Просто намекал, к примеру, на log4j, в котором singleton вроде бы достаточно умело обходит описанные вами выше проблемы. M>У тебя есть шанс показать как именно и дать мне информацию к размышлениею.
Достаточно просто. В начале нужного класса ставишь делаешь так:
public class SomeClass
{
private final static Log log=LogFactory.getLogger(SomeClass.class);
...
void someMethod()
{
log.error("An error!");
log.debug("Debug");
...
}
...
}
И настраиваешь:
# Set root logger level to WARN and its only appender to A1.
log4j.rootLogger=WARN, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# Print debug info for our classes
log4j.logger.com.ourapp=DEBUG
# Don't print too much debug info
log4j.logger.com.ourapp.SomeClass=WARN
То есть, выбор формата лога и уровня отладки выносится из основного кода.
Там еще есть более мощная XML-конфигурация, но мне ни разу не приходилось с ней сталкиваться.
Здравствуйте, adontz, Вы писали:
A>Тебе пытаются объяснить очень простую вещь: невозможно обсуждать преимущества и недостатки синглтона на примере его некорректного использования.
Может оттого что такого примера коректного использования нет ?
A>Я не IB и не Wolfhound, я, в отличие от них, считаю что синглтон вполне имеет право на жизнь. Но даже меня твой пример коробит.
Это больше похоже на вариант который продемонстирован в конце и у которого есть четкое разделение на глобальную точку входа "LogFactory.getLogger(SomeClass.class);" и остальное.
или переформулируя вопрос , неужели LogFactory гденить вызывает getInstance. ?
Здравствуйте, minorlogic, Вы писали:
A>>Тебе пытаются объяснить очень простую вещь: невозможно обсуждать преимущества и недостатки синглтона на примере его некорректного использования. M>Может оттого что такого примера корректного использования нет ?
Твой пример помимо использования синглтона содержит множество других моментов, которые вызывают сомнение в профессионализме автора. На это тебе уже неоднократно указали.
Что касается моего личного мнения, я его уже высказал: синглтоном должна быть конфигурация логгера. Это очень хорошо отражено в описании ULP — "ULP configuration would not be available at the 'user' level, it would be a system service.". Это не бред кучки фанатиков, это требование объективной реальности. Я, как человек, имеющий отношение не только к созданию, но и к последующему сопровождению систем, как человек активно общающийся с системными администраторами и сам обладающими достаточно большими навыками в этой области могу лично подтвердить на примерах из жизни, почему журналирование надо настраивать для уровне системы, а не отдельных приложений. Я уже дал ссылки на другие материалы по теме, в частности на RFC протокола SysLog, но читать ты их не хочешь, ты хочешь солировать. К сожалению ничего умного или хотя бы интересного от тебя не исходит, ты упрямо гнёшь своё. Мне общаться с человеком который приводит нелепые примеры для доказательства тезисов в сфере, в которой он ничего не понимает, не интересно.
Общайся ты в форме диалога, задавая вопросы и выдвигая предположения, было бы лучше. Ты же продемонстрировал абсолютно неадекватно спроектированную систему, обозначил какие-то проблемы второго плана, сделал из их наличия "выводы" и теперь высокомерно учишь окружающих как жить. Кавычки у слова "выводы" не случайны, так как твой ход мыслей и логика две вещи несовместимые.
Кончай этот балаган и ознакомься с существующими системами, стандартами, документами. А вот потом поговорим.
Здравствуйте, minorlogic, Вы писали:
M>Это больше похоже на вариант который продемонстирован в конце и у которого есть четкое разделение на глобальную точку входа "LogFactory.getLogger(SomeClass.class);" и остальное. M>или переформулируя вопрос , неужели LogFactory гденить вызывает getInstance. ?
Собственно, да. Точнее, не getInstance(), а просто использует статическую переменную.
Здравствуйте, adontz, Вы писали:
A>Твой пример помимо использования синглтона содержит множество других моментов, которые вызывают сомнение в профессионализме автора. На это тебе уже неоднократно указали.
Я ему передам.
A>Что касается моего личного мнения, я его уже высказал: синглтоном должна быть конфигурация логгера. Это очень хорошо отражено в описании ULP — "ULP configuration would not be available at the 'user' level, it would be a system service.". Это не бред кучки фанатиков, это требование объективной реальности. Я, как человек, имеющий отношение не только к созданию, но и к последующему сопровождению систем, как человек активно общающийся с системными администраторами и сам обладающими достаточно большими навыками в этой области могу лично подтвердить на примерах из жизни, почему журналирование надо настраивать для уровне системы, а не отдельных приложений. Я уже дал ссылки на другие материалы по теме, в частности на RFC протокола SysLog, но читать ты их не хочешь, ты хочешь солировать. К сожалению ничего умного или хотя бы интересного от тебя не исходит, ты упрямо гнёшь своё. Мне общаться с человеком который приводит нелепые примеры для доказательства тезисов в сфере, в которой он ничего не понимает, не интересно.
А мне неинтересно ТВОЕ мнение. Надеюсь на том и разойдемся.
A>Общайся ты в форме диалога, задавая вопросы и выдвигая предположения, было бы лучше. Ты же продемонстрировал абсолютно неадекватно спроектированную систему, обозначил какие-то проблемы второго плана, сделал из их наличия "выводы" и теперь высокомерно учишь окружающих как жить. Кавычки у слова "выводы" не случайны, так как твой ход мыслей и логика две вещи несовместимые.
Если ты не разобрался о чем был пост, то это ТВОИ проблемы. Напомню что у меня не было задачи описывать адекватно спроектированную систему логирования.
A>Кончай этот балаган и ознакомься с существующими системами, стандартами, документами. А вот потом поговорим.
Мне с ТОБОЙ говорить уже нет желания , а вот выводы о том что я этими системами не знаком прошу считать ошибочными.
Здравствуйте, minorlogic, Вы писали:
A>>Твой пример помимо использования синглтона содержит множество других моментов, которые вызывают сомнение в профессионализме автора. На это тебе уже неоднократно указали. M>Я ему передам.
Передай. Думаешь я против? Я эти слова могу сказать лично, в лицо. Я ни от кого не прячусь и пугать меня каким-то мифическим гуру не надо.
M>А мне неинтересно ТВОЕ мнение. Надеюсь на том и разойдемся.
Смешно ей богу. Я даю ссылки на официальные документы, а тебе не интересно видите ли моё мнение. А мнение мировой общественности?
M>Если ты не разобрался о чем был пост, то это ТВОИ проблемы. Напомню что у меня не было задачи описывать адекватно спроектированную систему логирования.
Пост был ни о чём, так как содержал слишком много ошибок проектирования. Показать что глобальная точка доступа и синглтон разные вещи тебе не удалось, потому что у тебя там нет адекватно применённого синглтона и нет, на самом деле, даже глобальной точки доступа.
A>>Кончай этот балаган и ознакомься с существующими системами, стандартами, документами. А вот потом поговорим. M>Мне с ТОБОЙ говорить уже нет желания , а вот выводы о том что я этими системами не знаком прошу считать ошибочными.
Я об этом сужу по коду, который ты предоставил. Метод SetInstance — это код студента. Вот пусть кто хочет, тот и обижается, но я бы за такие решения с должности архитектора снимал.