2010-06-29 14 views
7

Tengo una aplicación de consola que estoy convirtiendo en un servicio de Windows. Como aplicación de consola, mi log4net logging funciona bien. Pero al convertirlo en un servicio de Windows, mi log4net logge ha dejado de funcionar.log4net no funciona en un servicio de Windows

he añadido esto a mis AssemblyInfo.cs en el proyecto de servicio:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 

Ésta es mi clase de servicio con OnStart y OnStop:

private static log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
     private Builder _builder; 

     public YCSWebServerService() 
     { 
      InitializeComponent(); 
      _builder = new Builder(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      _log.Info("YCSWebServerService started"); 
      _builder.Start(); 
     } 

     protected override void OnStop() 
     { 
      _log.Info("YCSWebServerService stopped"); 
      _builder.Stop(); 
     } 

tengo una "específica" log4net config archivo agregado a mi proyecto de servicio:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

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

    <log4net> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="EventLogAppender" /> 
    </root> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <threshold value="DEBUG" /> 
     <applicationName value="Lantic YCS WebServer" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="(%-5level %date{hh}:%date{mm}:%date{ss} [%thread] %logger [%property{NDC}]) %message %n" /> 
     </layout> 
    </appender> 
    </log4net> 

</configuration> 

¿Alguna idea o idea?

+0

Resolví este problema anulando el appender. Compruebe este problema: http://stackoverflow.com/questions/1922430/how-do-you-make-log4net-output-to-current-working-directory/1922805#1922805 – RClemens

Respuesta

1

Algunas cosas para probar:

¿El usuario que ejecuta el servicio tienen permisos de escritura?

¿Alguna excepción se registra en los registros de Windows?

¿Ha intentado ejecutar el servicio en modo de depuración para ver si Log4net es arrojando alguna excepción?

+0

EventLogAppender no lo hará lanzar excepciones, porque log4net tiene un manejador de errores propio. De forma predeterminada, este controlador de errores escribe la excepción en Console.Error.WriteLine y Trace.WriteLine en la primera aparición. Todas las demás ocurrencias son ignoradas. Puede usar un controlador de errores propio como en el al final de este artículo: http://blogs.myfirstsharepoint.de/archive/2009/06/02/aus-der-praxis-%E2%80%93-securityexception-beim-loggen-mit-eventlogappender-von-log4net. como px (el artículo está en alemán, pero eso no daña el código, ¿verdad?) – Hinek

1

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=293617

http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/5bef59bc-a28f-4e6d-8ddb-730e12764162

En Windows Vista, Windows XP SP 2, Windows Server 2003, 2008 y Windows 7 un usuario necesita derechos de administrador para acceder al registro de seguridad. Ahora, cuando log4net intenta crear un Registro de eventos Fuente, todos los registros se verifican si ya existen. Por lo tanto, con un servicio de Windows, el usuario de Windows Server necesitaría derechos de administrador (lo cual no es bueno).

Solución: configurar una fuente explícita en la configuración de log4net (como lo hizo: <applicationName value="Lantic YCS WebServer" />, Lantic JEC WebServer es su fuente) y crear esta fuente en que el programa de instalación (porque el programa de instalación para el usuario debe tener derechos de administrador).

+0

Mi cuenta de usuario tiene derechos de administrador y aún no hay ningún resultado. No he podido averiguar lo que quiere decir definiendo una fuente explícita en mi configuración. ¿podrías publicar un enlace o un ejemplo? – lmkk

+0

Y no recibí nada de los enlaces que publicó – lmkk

+0

Lo siento, a veces escribo un poco complicado. Ya ha configurado una fuente explícita: ... Edité mi pregunta ... – Hinek

6

¿Acabas de agregar una sección de log4net a tu archivo app.config? En su pregunta, mencionó que tiene un "archivo de configuración de log4net específico", pero la muestra que proporcionó se parece a todo el contenido de app.config. Si app.config es el caso, entonces usted podría tener cadena simple en AssemblyInfo.cs:

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

Y como complemento requirePermission = "false" a la sección en mi app.config me ayudó cuando me fijo problema similar con log4net no registro en el archivo de servicio de Windows (ver atributo adicional - requirePermission = "false"):

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

Funcionó para mí. Siempre me olvido de la parte de montaje. –

0

Bueno se hizo esta pregunta desde hace mucho tiempo atrás, tengo una sugerencia que puede ser de alguna ayuda para aquellos que buscan una solución a este problema. Si está convirtiendo la aplicación de la consola al servicio de Windows ... debe haber creado un instalador para instalar la aplicación. Cuando instala la aplicación, crea una carpeta de instalación para el servicio generalmente en ProgramFile ..... (Verifique cuando está instalando su servicio ... le da la ruta al directorio de instalación). Si en su archivo web.config ha proporcionado la ruta al archivo de registro como "Log \ Log".txt ", luego habrá una carpeta (Log) en la carpeta de instalación con su archivo de registro (Log.txt). Usted está perdiendo el tiempo si está buscando un archivo de registro en la carpeta de su aplicación.

Cuestiones relacionadas