Шаги по настройке log4net в приложении службы C #

Я очень запутался в том, как настроить log4net в проекте службы Windows. Добавьте к этому, что я новичок в конфигурациях Visual Studio. Итак, я создал это приложение-службу Windows и хочу добавить к нему log4net. Все инструкции разные, и в одном ответе говорится, что в информацию о сборке включена следующая строка. Другой ответ сказал, чтобы добавить его в AssemblyInfo.cs (в папке App_Code). Значит ли это, что мне нужно добавить класс AssemblyInfo.cs в папку с исходными кодами, а затем просто добавить эту строку в конструктор? Я не знаю, что это значит!

[assembly:log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Я добавил appSettings в свой файл app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <appSettings>
        <add key="log4net.Internal.Debug" value="true"/>
    </appSettings> 
</configuration>

Нужно ли мне также создать файл log4net.config?

Я пытался следовать инструкциям из этого вопроса, но информации просто недостаточно, чтобы иметь для меня смысл. Я часами искал разумные инструкции. Может ли кто-нибудь рассказать мне (на высоком уровне), как настроить log4net для приложения службы Windows? Какие файлы мне нужно создать; какие конфигурации мне нужно добавить; Я знаю, что мне нужно будет создать класс регистратора, но конфигурация меня полностью сбила с толку.

--------------------------------- РЕДАКТИРОВАТЬ ------------- ---------------------

Шаг 1) Мой app.config выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>

    <configSections>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
    </configSections>

    <log4net>
      <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
        <file value="log.log" />
        <appendToFile value="true" />
        <rollingStyle value="Size" />
        <maxSizeRollBackups value="5" />
        <maximumFileSize value="100KB" />
        <staticLogFileName value="true" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date %level %logger - %message %exception%newline" />
        </layout>
      </appender>
      <root>
        <level value="ALL" />
        <appender-ref ref="LogFileAppender" />
      </root>
    </log4net>

</configuration>

Шаг 2) Я добавил это в основной файл Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

namespace MyAppService
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            log4net.Config.XmlConfigurator.Configure();

Шаг 3) Я добавил ссылку на log4net

Шаг 4) В моих классах, где я веду журнал, я добавил следующее:

private static ILog logger = LogManager.GetLogger(typeof(Reader));

Шаг 4) Я добавил такие операторы ведения журнала:

logger.Info("Data Read Completed Successfully.");

person Patricia    schedule 03.03.2017    source источник
comment
Я думаю, это не имеет отношения к конкретной платформе, сервису или нет, они одинаковы. вы пытались доказать, что это работает в консольном приложении?   -  person Lei Yang    schedule 03.03.2017


Ответы (1)


Вы можете использовать app.config для своей конфигурации: для службы Windows наличие отдельного файла является предпочтением, а не необходимостью, поскольку служба может отслеживать изменения в файле конфигурации.

Что касается директивы сборки где угодно, вы можете добавить ее в любой файл, если он находится в стартовом проекте - вашей службе - хотя обычно их добавляют в существующий файл AssemblyInfo.cs.

Вы должны также вызвать Log4net в своей программе запуска, , как указано в документации жирным шрифтом:

Использование атрибутов может быть более ясным методом определения того, откуда будет загружена конфигурация приложения. Однако стоит отметить, что атрибуты чисто пассивны. Это только информация. Поэтому, если вы используете атрибуты конфигурации, вы должны вызвать log4net, чтобы он мог читать атрибуты. Простой вызов LogManager.GetLogger приведет к чтению и обработке атрибутов вызывающей сборки. Поэтому крайне важно выполнять вызов журнала как можно раньше во время запуска приложения и, конечно, до того, как какие-либо внешние сборки будут загружены и вызваны.

Для этого код запуска вашей службы должен содержать такую ​​строку:

LogManager.GetLogger("initialise logging system");

В качестве альтернативы вы можете отбросить атрибуты и вместо этого просто вызвать XmlConfigurator.ConfigureAndWatch() в программе запуска, которая по умолчанию загружает и просматривает файл app.config. Опять же, вопрос предпочтения, использовать ли эти атрибуты или атрибуты сборки для загрузки конфигурации.

person stuartd    schedule 03.03.2017
comment
Поместите что в мой app.config? Сборка: строка log4net? Раздел ‹name = log4net type = log4net.Config.Log4NetConfigurationSectionHandler, log4net /› строка? Если последнее, я где-то читал, что должно быть первым в файле конфигурации. Но первое, что есть в моем конфигурационном файле, - это запуск .NETFramework. Так что мне добавить до или после запуска .NETFramework? Разве нет ни одного примера, который имел бы смысл для новичка в .NET? - person Patricia; 03.03.2017
comment
Вы добавляете конфигурацию в файл app.config, директива сборки должна быть в файле кода. Раздел log4net не обязательно должен быть первым, но он должен иметь configSection, определенный в верхней части файла app.config. На этой странице показано, как это сделать. - person stuartd; 03.03.2017
comment
Не могли бы вы взглянуть на мою правку? Я что-то пропустил, потому что не получаю логи. Спасибо. - person Patricia; 03.03.2017
comment
Ой! Еще одна вещь ... Я запускаю это в модульном тесте. Должен ли я сделать для этого отдельную конфигурацию? - person Patricia; 03.03.2017
comment
Вам нужно будет реплицировать конфигурацию в проекте модульного теста, если вы хотите протестировать ведение журнала, но если вам не нужно тестировать ведение журнала, log4net не выдаст никаких ошибок, если нет конфигурации. - person stuartd; 04.03.2017
comment
Привет, Стюарт, я добавил новый вопрос, потому что у меня проблемы. Если вам интересно, мой вопрос здесь: stackoverflow.com/q/42634200/1735836 - person Patricia; 06.03.2017