Конфигурация log4net для регистрации событий

Я пытаюсь включить ведение журнала для всего решения, добавив автономный проект, обертывающий log4net. Я нашел код на StackOverflow, но код использует какой-то файл конфигурации. Я немного не понимаю. Вот единственный статический класс:

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

namespace ExciteEngine2.LoggingManager {

    //// TODO: Implement the additional GetLogger method signatures and log4net.LogManager methods that are not seen below.
    public static  class ExciteLog {

        private static readonly string LOG_CONFIG_FILE = @"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 static void LoadConfig() {
            //// TODO: Do exception handling for File access issues and supply sane defaults if it's unavailable.   
            try {
                XmlConfigurator.ConfigureAndWatch(new FileInfo(LOG_CONFIG_FILE));
            }
            catch (Exception ex) {

            }                   
        }         

    }

}

Теперь нигде нет log4net.config. И в моем основном проекте приложения я использую ILog следующим образом:

using log4net;
using ExciteEngine2.LoggingManager;

namespace ExciteEngine2.MainApplication {

    internal static class Program {

        public static readonly ILog ApplicationLogger = ExciteLog.GetLogger(typeof(Program));

        private static void SetupLogging() {
            log4net.Config.XmlConfigurator.Configure();
        }

        [STAThread] static void Main(string[] args) {

            //Uninstall
            foreach (string arg in args) {
                if (arg.Split('=')[0] == "/u") {
                    Process.Start(new ProcessStartInfo(Environment.GetFolderPath(Environment.SpecialFolder.System) + "\\msiexec.exe", "/x " + arg.Split('=')[1]));
                    return;
                }
            }


                Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

                try {
                    ThemeResolutionService.ApplicationThemeName = ConfigurationManager.AppSettings["ThemeToUse"];
                }
                catch (Exception ex) {
                    ApplicationLogger.Error("Exception while setting Telerik Theme.", ex);
                    ThemeResolutionService.ApplicationThemeName = "ControlDefault";
                }

                DevExpress.UserSkins.OfficeSkins.Register();
                DevExpress.UserSkins.BonusSkins.Register();
                DevExpress.Skins.SkinManager.EnableFormSkins();
                DevExpress.Skins.SkinManager.EnableMdiFormSkins();

                //try {
                if (args.Contains("/dx")) {
                    Application.Run(new AppMDIRibbonDX());
                    ApplicationLogger.Info("Application (DX) started.");

                }
                else {
                    Application.Run(new AppMDIRibbon());
                    ApplicationLogger.Info("Application started.");

                }
                //} catch (Exception ex) {
                //  ApplicationLogger.Fatal("Exception while initiating. Nothing can be done here.", ex);
                //  XtraMessageBox.Show(String.Format("Exception while initiating. Nothing can be done here.{0}Message: {1}", Environment.NewLine, ex.Message), "Excite Engine 2", MessageBoxButtons.OK, MessageBoxIcon.Error);

                //}


        }

        private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) {
            ApplicationLogger.Fatal("Application Level Exception.", e.Exception);
            Thread t = (Thread)sender;
            Exception threadexception = e.Exception;
            string errormessage = String.Format("Thread ID: {0} [ {1} ]", t.ManagedThreadId, threadexception.Message);
            XtraMessageBox.Show(String.Format("Application Level Exception!{1}{0}{1}Details:{1}{2}", errormessage, Environment.NewLine, threadexception.StackTrace), "Excite Engine 2", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }

}

Как вы можете видеть из моего потока, я выполняю эту строку кода, думая, что log4net будет использовать app.config моего основного проекта приложения: log4net.Config.XmlConfigurator.Configure();

А вот строка, которую я добавил в AssemblyInfo.cs:

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

Наконец, app.config для моего основного приложения:

<?xml version="1.0"?>
<configuration>

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

    <appSettings>

    </appSettings>

    <connectionStrings>

    </connectionStrings>

    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
    </startup>

    <log4net>
        <root>
            <level value="DEBUG" />
            <appender-ref ref="LogFileAppender" />
        </root>
        <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
            <param name="File" value="Excite Engine 2 Log.log" />
            <param name="AppendToFile" value="true" />
            <rollingStyle value="Size" />
            <maxSizeRollBackups value="10" />
            <maximumFileSize value="10MB" />
            <staticLogFileName value="true" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%-5p%d{ddd, dd-MMM-yyyy hh:mm:ss} - %m%n" />
            </layout>
        </appender>
        <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
            <applicationName value="Excite Engine 2" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
            </layout>
        </appender>
    </log4net>

</configuration>

Когда я запускаю с <appender-ref ref="LogFileAppender" />, я получаю пустой файл с именем Excite Engine 2 Log.log прямо рядом с моим основным EXE. А когда ставлю <appender-ref ref="EventLogAppender" />, в Event Viewer ничего не происходит. Кроме того, есть атрибут: <level value="DEBUG" />, который меня очень беспокоит. Что мне нужно, так это полное ведение журнала EventViewer для моего приложения независимо от конфигурации сборки, в которой оно работает.

Ценю, если кто-то может направить меня на это. Спасибо!


person Hassan Gulzar    schedule 21.04.2011    source источник
comment
level value=DEBUG не имеет ничего общего с вашей конфигурацией сборки, это означает, что он будет логироваться на уровне DEBUG и выше (DEBUG, INFO, WARN, ERROR, FATAL).   -  person James Michael Hare    schedule 21.04.2011


Ответы (1)


Я нашел код на StackOverflow, но код использует какой-то файл конфигурации. Я немного не понимаю.

Причина, по которой он использует определенный файл конфигурации, можно объяснить следующим, взятым с сайта log4net:

API System.Configuration доступен только в том случае, если данные конфигурации находятся в файле конфигурации приложения; файл с именем MyApp.exe.config или Web.config. Поскольку System.Configuration API не поддерживает перезагрузку файла конфигурации, параметры конфигурации нельзя просмотреть с помощью методов log4net.Config.XmlConfigurator.ConfigureAndWatch. Основное преимущество использования API-интерфейсов System.Configuration для чтения данных конфигурации заключается в том, что для этого требуется меньше разрешений, чем для прямого доступа к файлу конфигурации. Единственный способ настроить приложение с помощью API-интерфейсов System.Configuration — вызвать метод log4net.Config.XmlConfigurator.Configure() или метод log4net.Config.XmlConfigurator.Configure(ILoggerRepository).

Изменить:

Чтобы войти в файл журнала, вам нужно вызвать описанный выше метод SetupLogging.

log4net.Config.XmlConfigurator.Configure();

Это утверждение никогда не вызывается. Похоже, вы вызываете LoadConfig() в своем ExciteEngine2.LoggingManager, но при этом используется файл конфигурации с именем log4net.config, который, как вы сказали, не существует. Если вы помещаете свою конфигурацию в файл app.config, вам нужно вызвать метод SetupLogging.

person Cole W    schedule 21.04.2011
comment
Хорошо. Имеет смысл. На самом деле я вызываю метод SetupLogging() в своем основном приложении ПЕРЕД вызовом Application.Run() - person Hassan Gulzar; 25.04.2011
comment
Да, но вы вызываете XmlConfigurator.ConfigureAndWatch(new FileInfo(LOG_CONFIG_FILE)); Что, скорее всего, перезаписывает ваши настройки. Вам нужно только один раз вызвать configure в своем приложении, и, поскольку у вас есть все настройки в app.config, вам нужно вызвать его, как в SetupLogging(). - person Cole W; 25.04.2011