log4net - приложение не работает в IIS7.5 - PullRequest
15 голосов
/ 26 июня 2010

Я могу записать в файл журнала, используя log4net и сервер разработки Cassini / IIS, но когда я использую IIS7.5, я не могу записать в файл.

Изначально я получил исключение безопасности, поэтому добавил requirePermission="false", и исключение исчезло, но файл не был создан.

Уровень доверия заполнен в соответствии с IISM.

Я не могу заставить это работать на моей собственной машине, мне интересно, что произойдет, когда я перейду на ISP (discountASP).

Вот настройка log4net:

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

<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="log-file.txt" />
        <appendToFile value="true" />
        <encoding value="utf-8" />
        <layout type="log4net.Layout.SimpleLayout" />
    </appender>
    <root>
        <level value="DEBUG" />
        <appender-ref ref="FileAppender" />
    </root>
</log4net>

C #

log4net.Config.XmlConfigurator.Configure();
ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Log.Info("This is a test");

Есть какие-нибудь подсказки?

ASP.NET 3.5, VS2008, Windows 7, IIS7.5, log4net 1.2.10

EDIT:

Я использовал тестовое веб-приложение, которое запускалось в Cassini, и запускало его в IIS7.5, и оно работало, поэтому в моем веб-приложении есть что-то особенное, что мешает запуску log4net. Там в много чего происходит, ELMAH, кэширование вывода, AJAX Control Toolkit, аутентификация форм, ssl, перезапись URL-адресов и т. д. Кроме добавления каждого из них в тестовое приложение, есть лучший способ выяснить, что вызывает log4net работать?

UPDATE:

Я использовал AdoNetAppender, чтобы избежать проблем с правами доступа к файлам, и все еще получаю тот же результат. AdoNetAppender работает для тестового приложения, работающего на Cassini и IIS, но не работает на моем веб-приложении. Получаем следующее исключение:

System.Security.SecurityException: не удалось выполнить запрос разрешения типа «System.Configuration.ConfigurationPermission, System.Configuration ...».

ОБНОВЛЕНИЕ 2: Я ошибся, что тестовый файл webappAppender работал в IIS7.5. Вот что происходит: тестовый файл webappAppender и AdoDotNetAppender работают в Cassini / IIS dev, но не в IIS7.5. Так что я думаю, что проблема в IIS, а не в моем веб-приложении.

Примечание. Я использую VS2008 в качестве администратора, но вошел в Windows 7 как не администратор. Кроме того, я использую Windows 7 Home Premium, а не Professional.

Я предоставил NETWORK SERVICE полное разрешение на корневой веб-каталог, но файл еще не создан. Также дал ВСЕМ полное разрешение, нет файла.

Поскольку adoDotNetAppender тоже не работал (но работал в dev IIS), я думаю, что может быть и другая проблема, помимо прав доступа к файлу.

ОБНОВЛЕНИЕ 3:

Я получил его для работы с FileAppender на IIS7. Если я добавлю это:

<identity impersonate="true"
    userName="zzz"
    password="yyy" />

и если пользователь является администратором, он работает. Если это я, а не администратор, это не так. Так что это проблема с разрешениями. Но я предоставил ВСЕМ права на каталог, в который файл был записан ранее, и он не работал, поэтому в других местах есть настройка разрешений. Кроме того, хотя FileAppender теперь работает с олицетворением, AdoNetAppender по-прежнему не поддерживается в IIS7. Я попытался добавить:

<securityContext type="log4net.Util.WindowsSecurityContext">
    <userName value="zzz" />
    <password value="yyy" />
    <domain value="aaa" />
</securityContext>

в раздел AdoNetAppender, но молчать не удается.

Я добавил вознаграждение для всех, кто может помочь мне настроить AdoNetAppender для работы с IIS7.5.

ОБНОВЛЕНИЕ 4:

Наконец-то я получил трассировку стека. Вот оно:

log4net:ERROR [AdoNetAppender] Failed in DoAppend
System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
       at log4net.Util.LogicalThreadContextProperties.GetProperties(Boolean create)
       at log4net.Core.LoggingEvent.CreateCompositeProperties()
       at log4net.Core.LoggingEvent.CacheProperties()
       at log4net.Core.LoggingEvent.FixVolatileData(FixFlags flags)
       at log4net.Core.LoggingEvent.set_Fix(FixFlags value)
       at log4net.Appender.BufferingAppenderSkeleton.Append(LoggingEvent loggingEvent)
       at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
The action that failed was:
LinkDemand
The type of the first permission that failed was:
System.Security.Permissions.SecurityPermission
The Zone of the assembly that failed was:
MyComputer

У меня был включен SQL Profiler, и ничего не удалось сделать с SQL Server. Кроме того, учетная запись SQL Server имеет соответствующие права для выполнения вставки. Кроме того, я удалил раздел SecurityContext, так как log4net не распознал его часть.

Ответы [ 6 ]

41 голосов
/ 27 июня 2010

Вы можете включить внутреннюю отладку log4net, добавив ключ log4net.Internal.Debug в файл конфигурации вашего приложения.

<appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
</appSettings>

Это позволит записывать сообщения отладки на консоль и в систему System.Diagnostics.Trace .Затем вы можете записать эти сообщения в текстовый файл, добавив прослушиватель трассировки в ваш файл конфигурации.Убедитесь, что у приложения есть разрешение на запись в файл.

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

Кроме того, сообщения трассировки также записываются в системный отладчик, поэтому вы можете использовать утилиту, например DebugView , для захватаСообщения.Подробнее см. log4Net .

5 голосов
/ 29 июня 2010

Я наконец-то заработал, я добавил

<trust level="Full" />

в system.web.

При средних значениях AdoNetAppender перестает работать, но FileAppender все еще работает для средних и высоких значений.

2 голосов
/ 12 марта 2012

У меня была такая же проблема. Я решил это, изменив конфигурацию IIS 7. Довольно просто ...

Перейдите в расширенные настройки пула приложений и установите для «Загрузить профиль пользователя» значение true! Затем убедитесь, что IUSR (пользователь IIS) имеет разрешение на запись в путь журналов.

Кроме того, обычно я добавляю поддержку 32-битных приложений, это полезно, когда вы загружаете и используете сборки от сторонних разработчиков, когда вы не знаете, были ли они выполнены для 32, 64 или независимых.

Я нашел это, прочитав эту статью: http://learn.iis.net/page.aspx/624/application-pool-identities/

С наилучшими пожеланиями, Tiago.

2 голосов
/ 27 июня 2010

Заходили ли вы в проводник Windows и проверяли ли правильные пользователи (СЕТЕВОЙ СЕРВИС?) Разрешения на запись?

2 голосов
/ 26 июня 2010

Используйте такой инструмент, как Process Monitor, и следите за процессом IIS.Я подозреваю, что он пытается создать файл журнала в каталоге, к которому учетная запись IIS не имеет доступа.

После этого теста укажите абсолютный путь к файлу журнала, к которому, как вы знаете, процесс IIS имеет доступ..

0 голосов
/ 24 августа 2013

Попробуйте дать пользователю IIS AppPool \ DefaultAppPool полное разрешение на каталог журнала.Это помогло мне хотя бы один раз.

...