Log4net не заходит в консоль (приложение WinForms)

Я только начинаю использовать библиотеку Log4Net, и у меня возникают проблемы с ее настройкой. Мне не нужно ничего особенного. Я использую его для приложения Winforms и нуждаюсь в базовом журналировании файлов и консоли. Чтобы сделать это максимально простым, я использую App.config для настройки и использую значения по умолчанию, взятые с веб-сайта проекта Log4Net: App.config:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="ProjectFolder" value="D:\Documents\my documents\Themis\Projects"/>
  </appSettings>
  <configSections>
    <section name="log4net"
       type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="ThemisLog.txt" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header]\r\n" />
        <param name="Footer" value="[Footer]\r\n" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
      </layout>
    </appender>

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header]\r\n" />
        <param name="Footer" value="[Footer]\r\n" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
      </layout>
    </appender>

    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="ConsoleAppender" />
    </root>
  </log4net>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

Класс программы:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using log4net;
using log4net.Config;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Themis
{
    static class Program
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            log4net.Config.XmlConfigurator.Configure();

            log.Debug("Enter application");
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new OldFrmMain());
            log.Debug("Exit application");
        }
    }
}

Файл журнала создается, и в нем создаются журналы, но ведение журнала консоли не происходит.


person Yoav    schedule 23.04.2011    source источник


Ответы (6)


Я предполагаю, что Log4net использует обычный метод Console.WriteLine(…) для отправки сообщений на консоль. Это не будет работать в приложении WinForms, потому что Console.WriteLine(…) ничего не делает в приложении WinForms по умолчанию.

Попробуйте вызвать функцию Win32 API AllocConsole в начале вашего приложения. Он должен создать консоль для вашего приложения WinForms и включить функцию Console.WriteLine(…). Здесь вы можете найти пример кода, который показывает, как вызывать AllocConsole. Как открыть окно консоли в Приложение для Windows

person Dennis    schedule 23.04.2011
comment
Йоав, тебе помогло? Я ответил на ваш вопрос? - person Dennis; 25.04.2011
comment
Я могу подтвердить, что консольный регистратор работает в приложении WinForms. Однако он работает только при отладке из Visual Studio, поскольку это предоставляет окно консоли (я полагаю, оно называется «Вывод»). - person IAmTimCorey; 03.05.2011

Вам нужно не ConsoleAppender, а TraceAppender.

Название может сбивать с толку, но TraceAppender пишет в окне «Вывод» Visual Studio.

Образец:

<log4net>
  <appender name="TraceAppender" type="log4net.Appender.TraceAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d [%t] %-5p %c %m%n"/>
    </layout>
  </appender>

  <root>
    <level value="ALL"/>
    <appender-ref ref="TraceAppender"/>
  </root>
</log4net>
person Nicolas Raoul    schedule 11.03.2013
comment
+1 решил проблему, которая у меня была, хотя вопрос ОП достаточно неоднозначен, чтобы его можно было решить и с помощью выбранного ответа. - person RyanfaeScotland; 28.07.2014
comment
Это должен был быть выбранный ответ! - person Rob L; 11.04.2016
comment
Хороший звонок, изменен на log4net.Appender.TraceAppender и работает как шарм! Я использую Asp.net MVC 4. - person eaglei22; 19.09.2016

Попробуйте использовать OutputDebugStringAppender в сочетании с Sysinternals DebugView это хорошая альтернатива открытию окна консоли в приложении WinForms

person Asher    schedule 24.04.2011

Вы должны попробовать установить свой тип приложения на консольное приложение, а не на приложение Windows. Затем вы получаете оба мира:

1) консоль

2) приложение winforms

Проект -> свойства -> Приложение -> тип вывода = Приложение Windows

Переключить на:

Проект -> свойства -> Приложение -> тип вывода = Консольное приложение

В моем случае я получаю журналы приложения из log4net на консоль, используя настроенный (цветной) консольный приложение.

person Roland Roos    schedule 16.04.2018

Я бы порекомендовал немного изменить файл конфигурации. Во-первых, я не уверен, что вы должны использовать записи верхнего и нижнего колонтитула для ConsoleAppender. Во-вторых, я не думаю, что вам нужен текст param=. Я не говорю, что что-то из этого обязательно неправильно, но давайте посмотрим, сможем ли мы сделать ConsoleAppender настолько простым, насколько это возможно. Попробуйте использовать следующую строку как единственную строку внутри тегов LayoutPattern:

<conversionPattern value="%date{ABSOLUTE} [%thread] %level %logger - %message%newline"/>

Я знаю, что эта линия работает, потому что я сам использовал ее в прошлом. Дайте мне знать, если работает только это работает.

Вот статья, в которой более подробно объясняется каждый раздел и его назначение: http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx

person IAmTimCorey    schedule 03.05.2011
comment
Решение, которое сработало для меня, заключалось в использовании log4net.Appender.TraceAppender вместо log4net.Appender.ConsoleAppender. См. ответ Николя Рауля. - person eaglei22; 19.09.2016

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

чувствителен к регистру !!

log4net: файл конфигурации [..\Log4Net.config] не найден. Конфигурация без изменений.

person user3417986    schedule 13.03.2015