событие не генерируется в событии Windows

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

Моя проблема в том, что журнал создается в файле, а не в событии Windows.

Мой код:

<log4net>

<logger name="FileLogger">
  <level value="ERROR" />
  <appender-ref ref="RollingLogFileAppender" />
</logger>
<logger name="EventLogger" additivity="False">
  <level value="ALL" />
  <appender-ref ref="EventLogAppender" />
</logger>


<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="Logs\logfile.xml"/>
  <appendToFile value="true"/>
  <rollingStyle value="Date"/>
  <datePattern value="yyyyMMdd"/>
  <maxSizeRollBackups value="10"/>
  <maximumFileSize value="5MB"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="&lt;Event&gt;&lt;Date&gt;%date&lt;/Date&gt;&lt;Message&gt;%message&lt;/Message&gt;&lt;Stack&gt;%exception&lt;/Stack&gt;&lt;/Event&gt;%newline" />
  </layout>
</appender>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
  <!--<param name="MvcApplication1" value="eventlog" />-->
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
  </layout>
</appender></log4net>

сторона кода:

public class LogManager
{
    private static readonly ILog eventLogger = log4net.LogManager.GetLogger("EventLogAppender");
    private static readonly ILog fileLogger = LogManager.GetLogger("FileLogger");

    public void Error(Exception ex)
    {
        eventLogger.Logger.Log(eventLogger.GetType(), Level.Error, ex.Source, ex);
    }
    public void Info(string message)
    {
        LoggingEventData e = new LoggingEventData()
         {
             Level = Level.Fatal,
             Message = message
         };
        eventLogger.Logger.Log(new LoggingEvent(e));
        fileLogger.Logger.Log(new LoggingEvent(e));
    }
}

Я использую application_Error для ошибки глобального уровня

 protected void Application_Error(object sender, EventArgs e)
    {
        var httpContext = ((MvcApplication)sender).Context;
        var currentRouteData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
        var currentController = " ";
        var currentAction = " ";

        if (currentRouteData != null)
        {
            if (currentRouteData.Values["controller"] != null && !String.IsNullOrEmpty(currentRouteData.Values["controller"].ToString()))
            {
                currentController = currentRouteData.Values["controller"].ToString();
            }
            if (currentRouteData.Values["action"] != null && !String.IsNullOrEmpty(currentRouteData.Values["action"].ToString()))
            {
                currentAction = currentRouteData.Values["action"].ToString();
            }
        }

        var ex = Server.GetLastError();
        var controller = new ErrorController();
        var routeData = new RouteData();
        var action = "Index";

        if (ex is HttpException)
        {
            var httpEx = ex as HttpException;

            switch (httpEx.GetHttpCode())
            {
                case 404:
                    action = "NotFound";
                    break;
                case 401:
                    action = " UnAuthorized";
                    break;
                // others if any
                default:
                    action = "Index";
                    break;
            }
        }
        new LogManager().Error(ex);
        httpContext.ClearError();
        httpContext.Response.Clear();
        httpContext.Response.StatusCode = ex is HttpException ? ((HttpException)ex).GetHttpCode() : 500;
        httpContext.Response.TrySkipIisCustomErrors = true;
        routeData.Values["controller"] = "Error";
        routeData.Values["action"] = action;
        controller.ViewData.Model = new HandleErrorInfo(ex, currentController, currentAction);
        ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));
    }

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


person Swati    schedule 02.01.2014    source источник
comment
stackoverflow.com/questions/2598681/ stackoverflow.com/questions/6523252/   -  person Sakthivel    schedule 02.01.2014


Ответы (1)


Я думаю, что вы неправильно указали EventLogger в коде:

ILog eventLogger = log4net.LogManager.GetLogger("EventLogAppender");

Следует изменить на:

ILog eventLogger = log4net.LogManager.GetLogger("EventLogger");
person YK1    schedule 02.01.2014
comment
это должно быть имя регистратора или имя приложения? - person Swati; 02.01.2014
comment
это должно имя регистратора. на приложение ссылаются из конфигурации регистратора. - person YK1; 02.01.2014
comment
требуется ли указать имя приложения в конфигурации в узле приложения? если да, то это должно быть пространство имен? - person Swati; 02.01.2014
comment
Я изменил код, как вы упомянули выше, но журнал не создается. Должны ли для этого требоваться права администратора? У меня нет прав администратора, но моя визуальная студия работает под правами администратора. - person Swati; 02.01.2014
comment
Вы можете указать имя приложения — оно может быть любым. Но если вы не укажете, то я думаю, что по умолчанию это AppDomain.FriendlyName. Но я предлагаю вам не полагаться на значение по умолчанию и указать какое-то имя приложения. Теперь это имя приложения соответствует источнику события в журнале событий. Права администратора требуются только для создания этого источника событий, что является одноразовым действием. Права администратора не требуются для записи записей журнала в этот источник. См. это: logging.apache.org/log4net/release/faq.html. #проблема-журналсобытий - person YK1; 02.01.2014