كيفية التقاط إخراج وحدة التحكم من خدمة C #؟

لدينا خدمة C# يتم نشرها إلى نظام عميل بعيد. يكتب التطبيق كمية كبيرة من المعلومات "التشخيص" إلى وحدة التحكم (بمعنى. Console.WriteLine ()). الخدمة لا "تفعل ما ينبغي". كيف يمكننا التقاط إخراج وحدة التحكم من الخدمة في تطبيق آخر؟

إصدار WinForm يمكن تحميل التطبيق في موقع العميل. إنه ، للأسف ، يعمل بشكل صحيح.

تحديث:

نحن قادرون على تغيير تغيير الخدمة ، لكننا نفضل عدم إجراء تغييرات كبيرة في هذا الوقت.

نحن أيضاً بتسجيل الدخول إلى MSMQ ولكن فقط من أجل الأحداث "الهامة". تتفاعل هذه الخدمة مع MSMQ لعملياتها العادية. أو ، على الأقل ، يجب. يبدو أن الخدمة لا يتم سحب العناصر من MSMQ عند إصدار WinForm. لذلك ، قد تكون كتابة الرسائل التي يتم الانتقال إلى وحدة التحكم مشكلة.

18

7 إجابة

هل تستطيع تغيير رمز الخدمة على الإطلاق ؟ إذا كان الأمر كذلك ، فإن استخدام Console.SetOut للكتابة إلى ملف سيكون المنفذ الأول الأكثر وضوحًا للاتصال. ثم التغيير إلى استخدام مكتبة تسجيل المناسبة للإصدار التالي :)

31
وأضاف
استخدام Console.SetOut كان تغيير الحد الأدنى كافية التي أسفرت عن معلومات كافية لتحديد المشكلة مع الخدمة.
وأضاف المؤلف Mike Chess, مصدر

بشكل عام ، يجب تجنب كتابة معلومات التشخيص مباشرة إلى وحدة التحكم أو سجل الأحداث أو MSMQ أو أي مكان آخر من رمز التطبيق الخاص بك. بدلاً من ذلك ، اتصل بواجهة برمجة التطبيقات لتسجيل الدخول واستخدم التكوين لإعادة توجيه الإخراج في أي مكان تريده.

على سبيل المثال ، يمكنك استبدال كافة Console.WriteLine بواسطة Trace.WriteLine (*). بعد ذلك يمكنك إعادة توجيه الإخراج إلى وحدة التحكم أو الملف أو أي مكان آخر من خلال تعديل ملف تكوين التطبيق: على سبيل المثال للإخراج إلى وحدة التحكم ، استخدم ConsoleTraceListener ، شيء من هذا القبيل:


  
    <trace autoflush="false" indentsize="4">
      
        
      
    
  
 

أثناء تصحيح الأخطاء ، ستحصل على مخرجاتك على وحدة التحكم - في موقع العميل الذي تقوم بتكوينه لإعادة توجيه إخراج التتبع إلى ملف ، إلى سجل الأحداث أو ما شابه.

أفضل من ذلك ، استخدم إطار تسجيل طرف ثالث (أوصي بـ Log4Net) والذي سيعطيك خيارات أكثر من System.Diagnostics.Trace.

(*) Trace.Write/Trace.WriteLine هي نفس Debug.Write/Debug.WriteLine ، فيما عدا أنه يتم فقط تجميع هذا الأخير إذا تم تعريف رمز DEBUG. لذا قم بتفضيل Trace to Debug إذا كنت تريد أن يكون الإخراج متاحًا في إصدارات الإصدار.

12
وأضاف

لديك مجموعة من الخيارات إعادة توجيه الإخراج وحدة التحكم إلى ملف واستخدام مكتبة تسجيل المناسبة كما هو مذكور اثنين جيدة. وهنا خيار الأوسط: الكتابة إلى سجل الأحداث.

EventLog log;
string logsource = "MyService";

// execute once per invocation
if (!System.Diagnostics.EventLog.SourceExists(logsource))
{
    System.Diagnostics.EventLog.CreateEventSource(
        logsource, "Application");
}
log = new EventLog();
log.Source = logsource;
log.Log = "Application";

// replace console logging with this
log.WriteEntry(message, EventLogEntryType.Information);

Then look for entries in the Application event log (Administrative Tools -> Event Viewer) where Source = "MyService".

5
وأضاف

استخدام debug.writeline واستخدام sysinternals debugview؟

3
وأضاف
أو log4net في المرة القادمة وتكوين الوجهة.
وأضاف المؤلف kenny, مصدر

لن أستخدم Console.WriteLine على الإطلاق من خدمة Window. ربما يجب عليك تسجيل هذه الأخطاء في ملف سجل.

طريقة أخرى للقيام بذلك بحيث يمكن أن تستهلك تطبيقات متعددة سجلات نشر رسائل السجل إلى قائمة انتظار MSMQ.

3
وأضاف

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

  1. تشغيل services.msc وتعديل خصائص الخدمة. في علامة التبويب "تسجيل الدخول" ، حدد "السماح للخدمة بالتفاعل مع سطح المكتب"

  2. استخدم محرر السجل لتعديل ImagePath لخدمتك: انتقل إلى HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ services \ [اسم الخدمة] وتحرير ImagePath. إلحاق cmd.exe/c إلى بداية سلسلة ImagePath. إذا كان ImagePath الأصلي هو c: \ myService \ myservice.exe ، يجب أن يكون ImagePath الجديد cmd.exe /cc:\myService\myservice.exe.

    </لى>
  3. ابدأ خدمتك. يجب أن تحصل على نافذة منبثقة بعنوان "اكتشاف الخدمات التفاعلية". حدد "عرض الرسالة". يجب على الشاشة تبديل السياقات وعرض نافذة وحدة التحكم. عند الانتهاء ، انقر فوق الزر "الرجوع الآن".

    </لى>
  4. عند الانتهاء من تصحيح الأخطاء ، قم بتعديل ImagePath إلى قيمته الأصلية. ثم ألغ تحديد مربع الاختيار "السماح للخدمة بالتفاعل مع سطح المكتب" في خصائص الخدمة وأعد تشغيل الخدمة.

تحذير: لقد فعلت هذا فقط مع خدمة واحدة وأنها عملت بالنسبة لي. لا أعرف ما إذا كان سيعمل لأي خدمة أو إذا كان سيسبب أي نتائج غير متوقعة لذا أقترح عليك فقط القيام بذلك في بيئة غير إنتاجية.

1
وأضاف