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");
}
}
}
Создается файл журнала, и в него создаются журналы, но ведение журнала консоли не происходит.
Ответы
Ответ 1
Я предполагаю, что Log4net использует обычный метод Console.WriteLine(...) для отправки сообщений на консоль. Он не будет работать в приложении WinForms, потому что Console.WriteLine(...) по умолчанию ничего не делает в приложении WinForms.
Попробуйте вызвать функцию API Win32 AllocConsole в начале вашего приложения. Он должен создать консоль для вашего приложения WinForms и включить функцию Console.WriteLine(...).
Здесь вы можете найти пример кода, который показывает, как вызвать AllocConsole.
Как открыть окно консоли в Windows Apllication
Ответ 2
Вы хотите не 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>
Ответ 3
Попробуйте использовать OutputDebugStringAppender в сочетании с Sysinternals DebugView
это хорошая альтернатива открытию окна консоли в приложении WinForms.
Ответ 4
Я бы рекомендовал немного модифицировать ваш файл конфигурации. Во-первых, я не уверен, что вы должны использовать записи заголовка и нижнего колонтитула для ConsoleAppender. Во-вторых, я не думаю, что вам нужен param = текст. Я не говорю, что любой из них обязательно ошибочен, но посмотрим, можем ли мы сделать ConsoleAppender максимально простым. Попробуйте следующую строку в качестве единственной строки внутри тегов LayoutPattern:
<conversionPattern value="%date{ABSOLUTE} [%thread] %level %logger - %message%newline"/>
Я знаю, что эта линия работает, потому что я использовал ее сам в прошлом. Дайте мне знать, если работает только то, что работает.
Вот статья, которая более подробно объясняет каждый раздел и что он делает: http://www.codeproject.com/KB/dotnet/Log4net_Tutorial.aspx
Ответ 5
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
чувствителен к регистру.
log4net: файл конфигурации [..\Log4Net.config] не найден. конфигурация без изменений.