Регистрация без библиотеки журналов - PullRequest
5 голосов
/ 06 апреля 2011

Вот в чем "проблема".Каждая отдельная библиотека, которую я разрабатываю, что-то записывает, но я не хочу, чтобы пользователь библиотеки знал об этом и устанавливал log4net или аналогичную реализацию ведения журнала, которую я бы использовал.Как умные люди создают автономные сборки?

Вывод журнала не важен для пользователя библиотеки, если он или она действительно не хочет видеть вывод отладочной информации / информации.В этом случае он установит log4net и скажет библиотеке использовать его каким-либо образом через файл конфигурации.В противном случае я хотел бы отправить мою библиотеку без каких-либо несоответствующих зависимостей.Это возможно?Какие есть варианты?

В C ++ я бы просто создал пару dll / so (с регистрацией и без), статически связывая их с необходимым набором библиотек, и если кому-то нужна библиотека с включенной регистрацией, он будетпросто замените его другой версией.

Ответы [ 5 ]

4 голосов
/ 06 апреля 2011

Отличная идея;подобные вещи - это детали, которые облегчают жизнь как авторам, так и потребителям библиотеки!

DotNetOpenAuth делает это

Я знаю, что библиотека DotNetOpenAuth ведет себя так, как выописать.Он использует log4net, но только если он присутствует и настроен потребляющей сборкой.Из файла README.Bin.html:

log4net.dll Если он присутствует и v1.2.10, позволит записывать сообщения журнала, которые выдает эта библиотека.

Также есть информативная страница о том, как настроить ведение журнала DotNetOpenAuth в вашем собственном приложении.

[EDIT] Я проверил их исходный код, и они динамическипроверьте сборку log4net и загрузите + подключите ее, если она есть (в Log4NetLogger.cs & Logger.cs).Как упомянуто в вашем комментарии ниже, им нужен log4net во время компиляции, потому что на него ссылаются в нескольких местах.Умная часть состоит в том, что , поскольку весь код, относящийся к log4net, пропускается при неудачной проверке, не будет проблем runtime , если в сборке log4net отсутствует .

DotNetOpenAuth - проект с открытым исходным кодом, поэтому вы должны иметь возможность имитировать их подход, просматривая их код инициализации.

3 голосов
/ 06 апреля 2011

Вот хорошее введение в трассировку, которое я предпочитаю использовать, и потребители вашей сборки также могут его использовать.

http://www.devx.com/codemag/Article/22040

1 голос
/ 15 августа 2011

Я просто столкнулся с той же проблемой. Моя библиотека была всего 78 КБ, но требовала 238 КБ зависимости log4net. Поэтому я написал класс абстракции для динамической загрузки log4net только тогда, когда он существует следующим образом:

static Logger() {
        try {
            Assembly.Load("log4net");
            _loggingIsOff = false;
        } catch {}
    }

    public static ILog CreateLog() {
        var frame = new System.Diagnostics.StackFrame(1, false);
        var type = frame.GetMethod().DeclaringType;
        return _loggingIsOff ? (ILog)new NoLog() : new Log4NetLogger(type);
    }
    ...
}

Ссылка на полный код здесь

1 голос
/ 06 апреля 2011

Единственный вариант, который я вижу, - это полностью инкапсулировать что-либо в ваше приложение; два варианта:

  • Возьмите фреймворк с открытым исходным кодом и запишите его исходный код в ваше приложение (поэтому, когда кто-то устанавливает ваше приложение, он также непреднамеренно устанавливает регистратор). Здесь предполагается, что ваш процесс установки будет охватывать все необходимое, или вы запекаете его таким образом, что ничего (значительного) не подвергается им.
  • Возьмите каркас логирования и добавьте его в свой проект, но только как чистую зависимость, а не "запекайте" на уровне кода. Например, вы можете сделать это с помощью MS EntLibs и, предоставив конфигурацию по умолчанию (и включив DLL-библиотеки EntLib в процесс intstall), вы сможете успешно оградить пользователей от необходимости что-либо делать.

Суть в том (насколько я вижу), что журналирование (конфигурация) обычно является чем-то, с чем людям придется в какой-то момент связываться, так как это часто зависит от конкретной среды, поэтому я сомневаюсь, что вы можете оградить всех пользователей от необходимости знать что-нибудь об этом все время.

0 голосов
/ 14 сентября 2011

Возможно, вы захотите включить библиотеку журналов с достаточно широкой лицензией на распространение, которая позволит вам распространять ее вместе с вашим исходным кодом.Большинство лицензий на основе BSD позволяют вам делать это.

Я предвзят, но http://www.logog.org может распространяться в соответствии с некоторыми довольно широкими условиями лицензии и может соответствовать вашим требованиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...