2009-05-13 20 views
25

Tengo un servicio de Windows y uso nlog para iniciar sesión. Todo funciona bien cuando corro desde el ide visual studio. El archivo de registro se actualiza sin problemas. Cuando instalo el servicio, el servicio funciona bien pero el archivo de registro nunca se actualiza. Estoy corriendo bajo SERVICIO LOCAL si eso ayuda. Sí, he creado el directorio de registros en mi carpeta de aplicaciones.¿Por qué mi servicio de Windows no escribirá en mi archivo de registro?

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 

    <targets> 
    <target name="file" xsi:type="File" fileName="${basedir}/logs/${shortdate}_info.txt" 
      layout="${date} ${logger} ${message}" /> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Info" maxlevel="Info" writeTo="file" /> 
    </rules> 
</nlog> 
+0

se aplica realmente a cualquier idioma, no solo a C# y .net. Tuve este problema para mi servicio de Windows C++. –

+0

Siempre verifique el [registro interno] (https://github.com/NLog/NLog/wiki/Internal-Logging) para este tipo de problemas. – Julian

Respuesta

10

Su cuenta de servicio local no tiene acceso para escribir en la ubicación del archivo especificada. Lo configura para usar una cuenta de sistema en la pestaña "Iniciar sesión" del cuadro de diálogo de propiedades del servicio, o puede configurar la cuenta de usuario como parte del proceso de instalación.

+2

o simplemente dar permiso de servicio local para escribir en ese directorio en el instalador. –

+2

¿cómo doy permiso en el instalador? también el nlog.config está en el directorio bin del proyecto pero no se mueve al archivo de configuración. ¿Cómo puedo hacer que eso suceda? –

2

Ha intentado instalar/ejecutar su servicio como un usuario diferente.

Si eso funciona, entonces puede estar bastante seguro de que tiene un problema de permisos donde su cuenta de sistema local no tiene permiso para escribir en el directorio/archivo.

3

Puede usar Process Monitor para ver las operaciones de archivo que se están realizando y por qué están fallando.

Sospecho (junto con otros que responden) que se trata de un problema de permiso, con la cuenta del servicio que no tiene suficiente acceso al archivo.

+1

gracias por la sugerencia richard, esto me hizo darme cuenta de que el archivo nlog.config no estaba allí. lo cargué y todavía no funciona pero estoy seguro de que es parte del problema –

2

Por curiosidad, ¿ha comprobado si se está escribiendo algo en el directorio system32 de la instalación de Windows? Iirc, ese es el directorio base de tiempo de ejecución predeterminado de la aplicación para servicios ...

30

He tenido este problema también. Como menciona genki, probablemente esté ingresando al directorio \ Windows \ System32. Tal vez busque primero el archivo de registro que está esperando allí. Al escribir los servicios a menudo he puesto una línea como la siguiente en el principio para obtener el directorio actual a comportarse como una aplicación normal

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); 
+1

no se ve como si estuviera en system32 –

+0

no está en el sistema 32, está en SysWOW64 – julestruong

11

Si está utilizando la versión 64 bits de Windows que el archivo de registro se guarda en C: \ Windows \ SysWOW64 carpeta

Este es el caso predeterminado si construye su proyecto utilizando la configuración AnyCPU y se implementa en un sistema operativo de 64 bits.

2

Acabo de tener el mismo problema con Enterprise framework logging.

Para concluir esta pregunta, las respuestas juntas cuentan la historia correcta.

En su ejemplo al usar el IDE de Visual Studio, el archivo de registro se escribe utilizando los permisos de usuario de la aplicación y se está escribiendo el archivo de registro.

El servicio de Windows no tiene estos mismos permisos, por lo que el archivo de registro no se grabará. El servicio de Windows tiene permiso (lo he probado) para escribir en el

AppDomain.CurrentDomain.BaseDirectory 

usando el espacio de nombres System.IO.

Dirija el archivo de registro a este directorio base y estará seguro.

+0

Esto funcionó perfectamente con mi servicio de Windows. ¡Gracias! – Baxter

1

Es posible que su servicio se esté ejecutando en otro contexto de usuario y también debido a restricciones de Windows.Tuve el mismo problema y lo solucioné al iniciar sesión en la siguiente carpeta:

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) 

Quizás esto te ayude.

1

Después de crear un proyecto de instalación para mi servicio e instalarlo varias veces, finalmente me di cuenta de que no había incluido el archivo NLog.config como uno de los archivos para instalar. Ahora que está incluido junto con el ejecutable, está funcionando perfectamente.

Por lo que sea, el archivo NLog.config se puede agregar manualmente después del hecho, pero el servicio puede necesitar ser detenido y reiniciado.

-2

hola esto es lo que hice y que es un trabajo muy bien u tiene que crear la biblioteca de clases y en esta clase añadir el siguiente méthode ^^

public static void WriteErrorLog(Exception ex) 
    { 
     StreamWriter sw = null; 
     try 
     { 
      sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true); 
      sw.WriteLine(DateTime.Now.ToString() + ":" + ex.Source.ToString().Trim() + ":" + ex.Message.ToString().Trim()); 
      sw.Flush(); 
      sw.Close(); 
     } 
     catch 
     { 

     } 
    } 
    public static void WriteErrorLog(String Message) 
    { 
     StreamWriter sw = null; 
     try 
     { 
      sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\LogFile.txt", true); 
      sw.WriteLine(DateTime.Now.ToString() + ":"+Message); 
      sw.Flush(); 
      sw.Close(); 
     } 
     catch 
     { 

     } 
    } 

y en su servicio u tiene que hacer en el método OnStart:

Library.WriteErrorLog(" Service Started "); 
//and in your OnStop method 
    Library.WriteErrorLog(" Service Stoped "); 

Espero que esto sea útil.

+0

Si bien este es * un * método de registro, no es un buen reemplazo para un marco de registro adecuado como nlog, que el OP está utilizando y preguntando. – mutex

Cuestiones relacionadas