سؤال

لدي خدمة ويندوز واستخدام nlog للتسجيل.كل شيء يعمل بشكل جيد عند تشغيل من visual studio ide.ملف السجل التحديثات مع أي قضايا.عند تثبيت خدمة يعمل بشكل جيد ولكن ملف السجل لم التحديثات.أنا على التوالي تحت الخدمة المحلية إذا كان ذلك يساعد.نعم, لقد خلق سجلات الدليل تحت مجلد التطبيق.

 <?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>
هل كانت مفيدة؟

المحلول

وليس لديها حساب الخدمة المحلية لديك الوصول إلى الكتابة إلى موقع الملف المحدد. قمت بتعيين إلى استخدام حساب النظام في "تسجيل الدخول" علامة التبويب الحوار خصائص خدمة، أو يمكنك إعداد حساب المستخدم كجزء من عملية الإعداد.

نصائح أخرى

ولقد كان هذا الموضوع أيضا. كما ذكر جينكي ربما كنت تسجيل في الدليل \ Windows \ SYSTEM32. ربما تحقق لملف السجل كنت تتوقع هناك أولا. عند كتابة الخدمات كنت كثيرا ما يضع مثل هذا الخط في البداية للحصول على الدليل الحالي تتصرف مثل تطبيق عادي

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

إذا كنت تستخدم الإصدار x64 من نظام التشغيل Windows من يتم حفظ ملف السجل في C:\Windows\SysWOW64 المجلد

هذا هو الافتراضي حالة إذا كنت بناء المشروع الخاص بك باستخدام AnyCPU التكوين ونشر 64 بت نظام التشغيل.

ويمكنك استخدام عملية مراقبة ل إلقاء نظرة على ملف العمليات التي يتم تنفيذها، والسبب في فشلهم.

وأود أن يشك (جنبا إلى جنب مع غيرها من answerers) أن هذه مشكلة إذن، مع حساب الخدمة في عدم وجود وصول كاف إلى الملف.

لقد وجدت هذه الوظيفة مفيدة جدا عندما كان لدي نفس المشكلة:

http://nlog-forum.1685105.n2.nabble.com/Nlog-not-working-with-Windows-service-tp6711077p6825698.html

في الأساس, سوف تحتاج إلى تضمين ${basedir} كجزء من الملف الخاص بك في الموقع الخاص بك التكوين.وهذا سيجعل NLog تبدأ من حيث هو قابل للتنفيذ تشغيل من.

هل حاولت تثبيت / تشغيل الخدمة الخاص بك كمستخدم اسمه مختلفة.

إذا كان هذا يعمل، ثم يمكنك أن تكون متأكد من أنك قمت مشكلة أذونات حيث لا يملك حساب النظام المحلي إذن الكتابة إلى الدليل / ملف

و.

وفقط من حب الاستطلاع، هل فحص ما إذا كان أي شيء يتم كتابتها في الدليل system32 من تثبيت ويندوز الخاص بك؟ IIRC، وهذا هو وقت التشغيل دليل قاعدة التطبيق الافتراضي للخدمات ...

ولقد كان مجرد نفس المشكلة مع تسجيل إطار المؤسسة.

لإبرام هذا السؤال الذي الإجابات اقول معا القصة الصحيحة.

في المثال الخاص بك عند استخدام IDE البصرية ستوديو يتم كتابة ملف السجل باستخدام أذونات المستخدم للتطبيق ويتم كتابة ملف السجل.

وخدمة ويندوز لايوجد هذه الأذونات نفسها حتى ملف السجل لن يحصل مكتوب. خدمة ويندوز لديها إذن (لقد جربت هذا) الكتابة إلى

AppDomain.CurrentDomain.BaseDirectory

وباستخدام System.IO مساحة الاسم.

وهكذا توجيه ملف السجل إلى هذا الدليل قاعدة، وسوف تكون آمنة.

وانها ربما الخدمة الخاص بك يعمل تحت سياق مستخدم آخر، وكذلك بسبب القيود المفروضة على ويندوز. كان لي نفس المشكلة وحلها تسجيل في المجلد التالي:

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

وربما هذا سوف تساعدك.

وبعد إنشاء المشروع التثبيت لخدمة بلدي، وتثبيته عدة مرات، وأخيرا أدركت أنني لم يدرج ملف NLog.config باعتبارها واحدة من الملفات لتثبيت. والآن بعد أن يتم تضمينه إلى جانب تنفيذ، انها تعمل تماما.

لما يستحق، وملف NLog.config يمكن إضافتها يدويا بعد وقوعها، ولكن قد تحتاج إلى توقف وإعادة تشغيل الخدمة.

كان وثيق الصلة المشكلة.بلدي NLOG يشبه هذا:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
  autoReload="true"
  throwExceptions="false"
  internalLogLevel="Off"
  internalLogFile="c:\temp\nlog-internal.log">

<targets>
<!-- Write events to a file with the date in the filename -->
<target xsi:type="File"
  name="File"
  fileName="${basedir}/logs/${shortdate}.log"
  layout="${longdate} ${uppercase:${level}} ${message}" />
</targets>

<rules>
<!-- Exception levels: Fatal, Error, Warn, Info, Debug, Trace -->
<logger name="*"
  minlevel="Debug"
  writeTo="File" />
</rules>

كان كل شيء إذن ذات الصلة.أولا: أين يمكنني تركيب الخدمة لدي للتأكد من أن حساب الخدمة المحلية قد إذن القراءة/الكتابة إلى سجلات المجلد.

ثانيا ، internalLogFile وإن لم يكن مكتوبا ، Nlog يظهر محاولة الوصول بغض النظر - وهذا هو السبب لقد حل المسألة مرة أخرى ضمان الخدمة المحلية له إذن القراءة/الكتابة في **c: emp**

ومرحبا هذا هو ما فعلته وانها تعمل بشكل جيد عليك أن إنشاء مكتبة فئة وفي هذه الفئة إضافة ميثود التالية ^^

  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
        {

        }
    }

ووفي خدمتكم عليك أن تجعل في طريقة OnStart:

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

ونأمل أن يكون هذا سيكون مفيدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top