2010-06-25 23 views
15

Puedo escribir en un archivo de registro usando log4net y el servidor de desarrollo Cassini/IIS, pero cuando uso IIS7.5, no puedo escribir en un archivo.log4net - Los appenders no funcionan en IIS7.5

Inicialmente, recibí una excepción de seguridad, así que agregué requirePermission="false" y la excepción desapareció pero no se creó ningún archivo.

El nivel de confianza está lleno de acuerdo con IISM.

No puedo hacer que esto funcione en mi propia máquina, me pregunto qué pasará cuando me transfiera a un ISP (discountASP).

Aquí está la configuración de 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"); 

Alguna pista?

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

EDIT:

he utilizado la aplicación web en la prueba ejecutada Cassini y corrió en IIS7. 5 y funcionó, por lo que hay algo específico en mi aplicación web que impide la ejecución de log4net. Hay en ello, ELMAH, caché de salida, AJAX Control Toolkit, autenticación de formularios, ssl, reescritura de URL, etc. ... Además de agregar cada uno de ellos en la aplicación de prueba, ¿hay alguna manera mejor de averiguar qué es? haciendo que log4net funcione?

ACTUALIZACIÓN:

he utilizado la AdoNetAppender de mantenerse alejado de los problemas de permisos de archivo y todavía estoy consiguiendo el mismo resultado. AdoNetAppender funciona para la aplicación de prueba que se ejecuta en Cassini e IIS, pero no funciona en mi aplicación web. Obteniendo la siguiente excepción:

System.Security.SecurityException: Solicitud de permiso del tipo 'System.Configuration.ConfigurationPermission, System.Configuration ...' failed.

ACTUALIZACIÓN 2: estaba equivocada de que la aplicación de web prueba FileAppender trabajó en IIS7.5. Esto es lo que sucede: el archivo de la aplicación de prueba AppAppender y AdoDotNetAppender funcionan en el desarrollador de Cassini/IIS, pero no en IIS7.5. Así que creo que es IIS ese el problema, no mi aplicación web.

Nota. Estoy ejecutando VS2008 como administrador, pero estoy conectado a Windows 7 como no administrador. Además, estoy ejecutando Windows 7 Home Premium, no Professional.

Otorgué al servicio de red permiso completo para el directorio raíz web y todavía no se creó ningún archivo. También le dio a TODOS el permiso completo, ningún archivo.

Dado que el adoDotNetAppender tampoco funcionaba (pero lo hizo en dev IIS), creo que puede haber otro problema además de los permisos del archivo.

Actualización 3:

llegué a trabajar para la FileAppender en IIS7. Si agrego esto:

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

y si el usuario es administrador, funciona. Si soy yo, no un administrador, no es así. Entonces es un problema de permisos. Pero concedí TODOS los derechos al directorio en el que se escribió el archivo antes y no funcionó, por lo que hay una configuración de permisos en otro lugar. Además, aunque FileAppender ahora funciona con la suplantación, el AdoNetAppender aún no está en IIS7. Traté de agregar:

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

a la sección AdoNetAppender, pero sigo callando.

He añadido una recompensa para cualquiera que pueda ayudarme a obtener AdoNetAppender trabajando con IIS7.5.

ACTUALIZACIÓN 4:

que finalmente tiene una bodega de la traza de la pila. Aquí está:

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 

Tenía el Analizador de SQL activado y nada lo hizo en SQL Server. Además, la cuenta de SQL Server tiene los privilegios adecuados para hacer la inserción. Además, eliminé la sección SecurityContext ya que log4net no reconoció parte de ella.

+0

¿Ha intentado elevar el nivel de confianza de su aplicación? ¿Se puede publicar el seguimiento completo de la pila? –

Respuesta

5

finalmente tengo trabajo, he añadido

<trust level="Full" /> 

a system.web.

Con medio, AdoNetAppender deja de funcionar, pero FileAppender todavía funciona para medios y altos.

+0

¿Esto es seguro? Los documentos de MSDN dicen que esto "[otorga los permisos de la aplicación ASP.NET para acceder a cualquier recurso que esté sujeto a la seguridad del sistema operativo] (https://msdn.microsoft.com/en-us/library/tkscy493%28v=vs. 85% 29.aspx) " – alex

2

Utilice una herramienta como Process Monitor y espíe el proceso IIS. Sospecho que está intentando crear el archivo de registro en un directorio al que la cuenta IIS no tiene acceso.

A partir de esa prueba, especifique una ruta de acceso absoluta al archivo de registro que sabe que el proceso de IIS tiene acceso.

+0

He estado investigando eso. Un poco turbio sobre quién es exactamente el dueño del proceso. No es NETWORKSERVICE y aún estoy tratando de precisar a quién pertenece el proceso de AppPoolIdentity. Sin embargo, sí le di acceso a TODOS al directorio de registro, eso no funcionó. Descargando systernals y revisando los permisos de IIS. – Steve

+0

¿Ha instrumentado su código lo suficiente para ver dónde se cae? Utilice OutputDebugStringAppender y DebugView con (Capture -> Global Win32 marcado). Este debería ser el método de registro más libre de dolor para ayudar a resolver el problema principal. –

+0

Parece que no puedo encontrar una solicitud de escritura de archivo en Process Monitor para w3wp.exe. De acuerdo con el monitor de procesos, el usuario es IIS APPPOOL \ DefaultAppPool. Agregué más detalles en una nueva actualización. Mirando a DebugView ahora. – Steve

40

Puede habilitar la depuración interna de log4net agregando la clave log4net.Internal.Debug al archivo de configuración de la aplicación.

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

Esto escribirá mensajes de depuración en la consola y el sistema System.Diagnostics.Trace. Luego puede registrar estos mensajes en un archivo de texto agregando un detector de rastreo a su archivo de configuración. Asegúrese de que la aplicación tenga permiso para escribir en el archivo.

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

Alternativamente, los mensajes de seguimiento también se escriben en el depurador del sistema, lo que puede utilizar una utilidad como DebugView para capturar los mensajes. Vea el log4Net FAQ para más detalles.

+0

Hice lo anterior y solo funciona en Cassini/IIS Dev. Cuando se ejecuta desde IIS7, el archivo de registro ni siquiera se crea. Elaboré en mi actualización. – Steve

+0

¿Has visto esta publicación? Http://stackoverflow.com/questions/2205757/need-help-with-security-exception-in-asp-net-mvc-web-application – Garett

+0

Es un problema de permiso, creo - ver mi actualización . – Steve

2

¿Ingresó al explorador de Windows y verificó que los usuarios correctos (¿SERVICIO DE RED?) Tienen permisos de escritura?

+1

Sí, di todo a NETWORK SERVICE y TODOS y aún no se creó ningún archivo. – Steve

2

Tuve este mismo problema. Lo resolví cambiando la configuración de IIS 7.Bastante fácil ...

Vaya a la configuración avanzada del conjunto de aplicaciones y configure "Cargar perfil de usuario" en verdadero! Luego, asegúrese de que IUSR (usuario de IIS) tenga permiso para escribir en la ruta de los registros.

Además, generalmente, agrego soporte para aplicaciones de 32 bits, esto es útil cuando descarga y usa ensamblajes de terceros, donde no sabe si se cumplieron para 32, 64 o independientes.

me encontré con esto leyendo este artículo: http://learn.iis.net/page.aspx/624/application-pool-identities/

Saludos, Tiago.

0

Intente dar permiso completo al usuario de IIS AppPool \ DefaultAppPool en el directorio de registro. Eso me ha ayudado al menos una vez.

Cuestiones relacionadas