конфигурация log4net для регистрации событий - PullRequest
0 голосов
/ 21 апреля 2011

Я пытаюсь включить ведение журнала для всего решения, добавив отдельный проект, который оборачивает 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 для моего приложения независимо от конфигурации сборки, в которой оно выполняется.

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

1 Ответ

0 голосов
/ 21 апреля 2011

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

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

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

Редактировать:

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

log4net.Config.XmlConfigurator.Configure();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...