Как Вы настраиваете и включаете log4net для автономного блока библиотеки классов?

Я использовал этот код ( https://github.com/yoeriboven/TopAlignedCollectionViewLayout ) после того, как решение DongXu не совсем сработало. Единственная модификация заключалась в том, что он изначально предназначен для использования с сеткой, поэтому мне нужно было создать макет с произвольно большим количеством столбцов ...

let collectionViewFlowLayout = YBTopAlignedCollectionViewFlowLayout(numColumns: 1000)

32
задан Zach Burlingame 22 June 2009 в 18:39
поделиться

4 ответа

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

На данный момент , Это' несомненно, самый широко используемый формат векторной графики в сети. Возьмем, к примеру, изображения в Википедии - почти для всех диаграмм либо используется SVG, либо есть уведомление о том, что его следует использовать. Многие другие проекты с открытым исходным кодом поддерживают его аналогичным образом.

Теперь язык разметки XAML (часть WPF / Silverligtht) некоторыми рассматривается как конкурент SVG, но на самом деле они только частично совпадают. в определенной степени функциональности. (XAML поддерживает множество других вещей, таких как привязка данных, события, триггеры и т. Д.) Действительно, общее использование XML сильно ограничено тем, что браузеры не поддерживают его изначально (и не могут должным образом из-за того, что он тесно связан с технологиями MS). Я бы даже не поверил, что это строго прямой конкурент SVG, ни то, что Microsoft намеревалась сделать это.

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

LogManager в ваш собственный класс LogManager, например Jacob , Jeroen и McWafflestix , предложили (см. Код ниже).

К сожалению, класс log4net.LogManager является статическим, а C # не поддерживает статическое наследование, поэтому вы не можете просто наследовать от него и переопределить метод GetLogger. Однако в классе log4net.LogManager не так много методов, так что это определенно возможно.

Другой недостаток этого решения заключается в том, что если у вас есть существующая база кода (что я делаю в в моем случае) вам придется заменить все существующие вызовы log4net.LogManager своим классом-оболочкой. Однако это не имеет большого значения для сегодняшних инструментов рефакторинга.

В моем проекте эти недостатки перевешивали преимущества использования конфигурации ведения журнала, предоставляемой вызывающим приложением, поэтому я выбрал Решение 2.

Код

Во-первых, вы нужен класс-оболочка LogManager:

using System;
using System.IO;
using log4net;
using log4net.Config;

namespace MyApplication.Logging
{
    //// TODO: Implement the additional GetLogger method signatures and log4net.LogManager methods that are not seen below.
    public static class LogManagerWrapper
    {
        private static readonly string LOG_CONFIG_FILE= @"path\to\log4net.config";

        public static ILog GetLogger(Type type)
        {
            // If no loggers have been created, load our own.
            if(LogManager.GetCurrentLoggers().Length == 0)
            {
                LoadConfig();
            }
            return LogManager.GetLogger(type);
        }

        private void LoadConfig()
        {
           //// TODO: Do exception handling for File access issues and supply sane defaults if it's unavailable.   
           XmlConfigurator.ConfigureAndWatch(new FileInfo(LOG_CONFIG_FILE));
        }              
}

Затем в ваших классах вместо:

private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));

Используйте:

private static readonly ILog log = LogManagerWrapper.GetLogger(typeof(MyApp));

Решение 2

Для моих целей я решил остановиться на решении, которое удовлетворяет второму набору ограничений. Смотрите приведенный ниже код моего решения.

Из документа Apache log4net : Это полностью отделяет ведение журнала сборки от остальной части приложения. Это может быть очень полезно для разработчиков компонентов, которые хотят использовать log4net для своих компонентов, но не хотят требовать, чтобы все приложения, использующие их компонент, знали о log4net. Это также означает, что их конфигурация отладки отделена от конфигурации приложений. Сборка должна указывать RepositoryAttribute для установки своего репозитория журналов. "

Код

Я поместил следующие строки в файл AssemblyInfo.cs моей библиотеки классов:

 // Местоположение файла конфигурации Log4Net Это полностью отделяет ведение журнала сборки от остальной части приложения. Это может быть очень полезно для разработчиков компонентов, которые хотят использовать log4net для своих компонентов, но не хотят требовать, чтобы все приложения, использующие их компонент, знали о log4net. Это также означает, что их конфигурация отладки отделена от конфигурации приложений. Сборка должна указывать RepositoryAttribute для установки своего репозитория журналов. "

Код

Я поместил следующие строки в файл AssemblyInfo.cs моей библиотеки классов:

 // Местоположение файла конфигурации Log4Net Это также означает, что их конфигурация отладки отделена от конфигурации приложений. Сборка должна указывать RepositoryAttribute для установки своего репозитория журналов. "

Код

Я поместил следующие строки в файл AssemblyInfo.cs моей библиотеки классов:

 // Местоположение файла конфигурации Log4Net Это также означает, что их конфигурация отладки отделена от конфигурации приложений. Сборка должна указывать RepositoryAttribute для установки своего репозитория журналов. "

Код

Я поместил следующие строки в файл AssemblyInfo.cs моей библиотеки классов:

 // Местоположение файла конфигурации Log4Net
[сборка: log4net.Config.Repository ("CompanyName.IntegrationLibName")]
[сборка: log4net.Config.XmlConfigurator (ConfigFile = "CompanyName.IntegrationLibName.config", Watch = true)]

Ссылки

12
ответ дан 27 November 2019 в 21:10
поделиться

В вашем коде вы можете проверить, есть ли какие-либо регистраторы через

log4net.LogManager.GetCurrentLoggers().Count()

. Затем вы можете, например, использовать XmlConfigurator для загрузки конфигурации по умолчанию из файла:

log4net.Config.XmlConfigurator.Configure(configFile)

Вы можете выполнить инициализацию в статическом или обычном конструкторе.

class Sample
{
    private static readonly log4net.ILog LOG;

    static Sample()
    {
        if (log4net.LogManager.GetCurrentLoggers().Count() == 0)
        {
            loadConfig();
        }
        LOG = log4net.LogManager.GetLogger(typeof(Sample));

    }

    private static void loadConfig()
    {
        /* Load your config file here */
    }

    public void YourMethod()
    {
       LOG.Info("Your messages");
    }
}
7
ответ дан 27 November 2019 в 21:10
поделиться

Вы, вероятно, можете написать что-то около класса XmlConfigurator :

public static class MyLogManager
{
    // for illustration, you should configure this somewhere else...
    private static string configFile = @"path\to\log4net.config";

    public static ILog GetLogger(Type type)
    {
        if(log4net.LogManager.GetCurrentLoggers().Length == 0)
        {
            // load logger config with XmlConfigurator
            log4net.Config.XmlConfigurator.Configure(configFile);
        }
        return LogManager.GetLogger(type);
    }
}

Затем в ваших классах вместо:

private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));

Используйте:

private static readonly ILog log = MyLogManager.GetLogger(typeof(MyApp));

Конечно, это будет предпочтительнее сделать этот класс службой и динамически настроить его с помощью контейнера IoC по вашему выбору, но вы поняли идею?

РЕДАКТИРОВАТЬ: Проблема с фиксированным счетчиком () указана в комментариях.

12
ответ дан 27 November 2019 в 21:10
поделиться

В вашей автономной библиотеке классов имейте синглтон, который загружает файл конфигурации log4net используя log4net.Config.XmlConfigurator .

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

1
ответ дан 27 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: