2016-01-12 23 views
5

Tôi có một ứng dụng C# .NET 4.5 đa luồng đang chạy.NLog đang bỏ qua các thông điệp tường trình. .NET vấn đề? Vấn đề đa luồng?

Chạy trên máy tính xách tay Windows 7 cục bộ của tôi, NLog ghi lại tất cả thư của tôi. Tôi xuất bản ứng dụng bằng Visual Studio ... sao chép ứng dụng đã xuất bản lên Windows Server 2008 ... và chạy ứng dụng trên máy chủ: kết quả là các thông báo tường trình bị bỏ qua. Ai đó có thể giúp tôi hiểu TẠI SAO và làm thế nào tôi có thể sửa lỗi này hoặc đề xuất một thay thế cho NLog?

tập tin cấu hình của tôi là như sau:

Tôi đã cố gắng này mà không có sự "async = true"

<targets async="true"> 


    <target xsi:type="ColoredConsole" 
      name="ColoredConsole" 
      layout="${date} ${level} ${message} ${event-context:item=AlgID} " /> 

    <target name="xmlfile" xsi:type="File" 
      fileName="C:\QRT\Logs\LogEmiter.Nlog.xlog" keepFileOpen="true" 
      layout="${log4jxmlevent}" /> 

    <target xsi:type="File" 
      name ="LogFile" fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
      layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} "/> 

    <target xsi:type="File" 
      name ="TapeLogFile" fileName="C:\QRT\Logs\QRTMarketLog.txt" 
      layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${message}"/> 

    </targets> 
    <rules> 
     <!-- add your logging rules here --> 

     <logger name ="TapeLogFile" minlevel="Trace" writeTo="TapeLogFile" /> 
     <logger name ="TapeLogFile" minlevel="Trace" writeTo="ColoredConsole" final="true"/> 
     <logger name="*" minlevel="Trace" writeTo="ColoredConsole" /> 
     <logger name="*" minlevel="Trace" writeTo="xmlfile" /> 
     <logger name="*" minlevel="Trace" writeTo="LogFile" /> 


     <!-- 
     Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" 
     <logger name="*" minlevel="Debug" writeTo="f" /> 
     --> 
     </rules> 
    </nlog> 

tôi đăng nhập thông điệp theo cách này:

Trong lớp điển hình của tôi, tôi sẽ khởi tạo lớp trợ giúp NLog của tôi như sau:

private void InitliazlieLogger() 
    { 
     LogManager.ThrowExceptions = true; 
     m_logger = new NLogHelper(LogManager.GetCurrentClassLogger()); 
     m_logger.Set("FromID", "Email"); // Class setting. 
    } 

private void DoSomething(int _x) 
{ 
    m_logger.Debug ("Print this statement: {0}", _x); 
} 

Tôi có lớp trợ giúp NLog ...

public NLogHelper(Logger Logger) 
{ 
    m_logger = Logger; 
    m_properties = new Dictionary<string, object>(); 
} 

public void Debug(string Message, params object[] Args) 
     { 
      m_logger.Debug() 
       .Message(Message, Args) 
       .Properties(m_properties) 
       .Write(); 
      notify(Severity.Debug, Message); 
     } 

Vấn đề là một số thông điệp tường trình chỉ bị bỏ qua. Tôi đã thêm lớp ghi nhật ký của riêng mình đã ghi vào một tệp theo cách thủ công và chèn một cuộc gọi vào NLogHelper.Debug và tôi thấy rằng tệp tôi đã viết thủ công có bộ thông điệp tường trình đầy đủ nhưng đầu ra NLog thiếu một số.

Một lần nữa, điều này hoạt động trên máy tính xách tay của tôi, nhưng không thành công trên Windows Server 2008. Máy chủ của tôi đã cài đặt .NET 4.6.1. Tôi dường như chỉ có 4.5.2 trên máy tính Windows 7 của mình. Đó có thể là nó?

Lưu ý: Nếu tôi tải tất cả các tệp nguồn lên máy chủ và sử dụng Visual Studio trên máy chủ để biên dịch cùng một mã, NLog có vẻ hoạt động?!?

-Được sử dụng.

Cảm ơn -ed

+0

'm_logger.Debug()' sẽ đăng nhập khi nguồn ở chế độ DEBUG. phải không? điều đó có nghĩa là khi bạn xuất bản nguồn của mình trên máy chủ, các tệp nhị phân đó sẽ chạy trong chế độ RELEASE. Điều đó có nghĩa là nó sẽ bỏ qua tuyên bố đăng nhập. Bạn không nghĩ sao? – Savaratkar

+0

Và bạn đã đề cập rằng, trên máy chủ của bạn, bạn chạy nguồn của bạn từ VS, do đó bạn chạy nó trong chế độ DEBUG một lần nữa. đúng? – Savaratkar

+0

Bạn đúng. Tôi đã thử một số cách để chạy trên máy chủ. Tôi đã tìm thấy rằng "phát hành" đòi hỏi "cài đặt" trên hệ thống đích làm cho nó khó khăn để tìm tập tin cấu hình vì vậy tôi bây giờ chỉ cần sao chép toàn bộ bin/thư mục Debug. Dù sao, nhật ký Logger.Debug đã hoạt động. Đó là Logger.Info bị thiếu. –

Trả lời

0

Tôi đang sử dụng đoạn mã sau và làm việc tốt.

public class ServerDataSource : IDataSource 
    { 
     private Logger _log; 
     public ServerDataSource() 
     { 
      _log = LogManager.GetLogger("ServerDataSource"); 
     } 
     public bool DoSomething() 
     { 
      try 
      { 
        _log.Info("Doing something"); 

      } 
      catch (Exception ex) 
      { 
       _log.Error("Error occurred" + ex.Message); 
      } 
     } 
} 

Cấu hình là như sau

<configSections> 
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/> 
    </configSections> 

+0

Sự khác nhau giữa LogManager.GetLogger và LogManager.GetCurrentClassLogger là gì? bạn có đa luồng không? Bạn có sử dụng async không? –

+0

LogManager.GetCurrentClassLogger() khởi tạo đối tượng Logger với tên lớp hiện tại, nhưng LogManager.GetLogger ("ServerDataSource") khởi tạo đối tượng Logger với tên bạn đã cung cấp trong tham số. Theo như tôi biết logger là thread-safe. Bạn có thể tạo logger một lần như một biến tĩnh. –

+0

Hummm ... ok. Nhưng ... bạn đã không tuyên bố nó là tĩnh :) Nó âm thanh như sự khác biệt chỉ là trong đặt tên. 'Tóm lại là tôi đang thực hiện nó hơi khác nhau bởi vì tôi cần một biến tùy chỉnh (để tôi có thể xuất ra instanceID cho nhiều cá thể của một lớp tương tự ... chẳng hạn như StudentID). 'Vẫn không hiểu tại sao việc triển khai của tôi không chính xác? –

1

EDIT: Đây không phải là một câu trả lời hoàn chỉnh. Câu trả lời dưới đây giải quyết được một nửa vấn đề. Những gì tôi đã không nhận thấy là các tin nhắn còn thiếu là INFO và không DEBUG. Việc chuyển đổi tất cả nhật ký INFO của tôi sang nhật ký DEBUG đã khắc phục được sự cố của tôi. Dường như mặc dù tôi có thể xuất nhật ký INFO trên máy cục bộ của mình, INFO sẽ hoạt động trên máy chủ của tôi. Vẫn không phải root-gây ra. Vâng, tôi nghĩ rằng sự khác biệt duy nhất giữa hệ thống làm việc (máy tính xách tay chạy Windows 7) và máy chủ (chạy Windows Server 2008) là phiên bản Windows và phiên bản .NET được cài đặt.

Vấn đề là không thể tin được, nhờ có Sibers để tìm kiếm điều này, thực tế là máy chủ có nhiều CPU phần cứng và đa luồng của nó gần hơn với đa luồng thực hơn là đang xảy ra trên máy tính xách tay của tôi. NLog đã phát hành thông báo lỗi nhưng tôi không nhìn thấy chúng. Nó đang cố gắng tự viết.

Vì vậy, tôi (Sibers) thay đổi:

<target xsi:type="File" 
     name ="LogFile" fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
     layout ="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} "/> 

để

<target name="asyncWrapper" xsi:Type="AsyncWrapper" queueLimit="20000"> 
     <target name="LogFile" 
      xsi:type="File" 
      fileName="C:\QRT\Logs\QRTLog-${shortdate}.log" 
      layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}|${level}|${threadid}|${threadname}|${event-properties:item=FromID}|${message}${exception:format=tostring} " 
      concurrentWrites="true" /> 
    </target> 

Vấn đề cố định. Man ... tôi mất một tháng! Tôi sắp bỏ cuộc và viết nhật ký của chính mình bằng tay.

-Ed

+0

Tôi nhận được một số lời nhận xét như của bạn: "Tôi sắp từ bỏ và viết nhật ký của riêng mình bằng tay". Phải, bởi vì sau đó bạn sẽ có * không có vấn đề * nữa! Nếu đây chỉ là một vấn đề đơn giản. Các lỗi trong logic giả định "Tôi không thể có được điều này hiện có để làm việc, do đó một câu trả lời tốt hơn là để thực hiện nó bản thân mình." chỉ là lớn. – Howiecamp

Các vấn đề liên quan