2012-04-03 21 views
7

Tôi đang sử dụng khung khai thác NLog và đang cố gắng để có được ngoại lệ và thông tin stacktrace hiển thị trong bất kỳ ứng dụng trình ghi nhật ký UDP nào, chẳng hạn như SentinelLog2Console, nhưng chỉ có thể nhận được phần thông điệp nhật ký hiển thị. Xuất ra một tập tin hoạt động tốt như hầu hết các ví dụ làm điều đó, do đó, vấn đề xoay quanh việc sử dụng các mục tiêu mạng với NLog.Cách đăng nhập ngoại lệ với các mục tiêu mạng trong NLog

Thưởng nếu định dạng tùy chỉnh có thể được áp dụng cho ngoại lệ và ngăn xếp bên trong, nhưng điều này không bắt buộc. Exception.ToString() sẽ đi một chặng đường dài.

Lưu ý trên mã ví dụ: Với Log2Console Tôi đã tìm thấy article về cách gửi ngoại lệ dưới dạng mục nhật ký riêng biệt. Mặc dù điều này làm việc, tôi đã không hài lòng với giải pháp.

Ví dụ đang ngoại lệ logging:

Logger Log = LogManager.GetCurrentClassLogger(); 

try 
{ 
    throw new InvalidOperationException("My ex", new FileNotFoundException("My inner ex1", new AccessViolationException("Innermost ex"))); 
} 
catch (Exception e) 
{ 
    Log.ErrorException("TEST", e); 
} 

Ví dụ NLog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<targets async="true"> 

    <!-- Send by UDP to Sentinel with NLogViewer protocol --> 
    <target name="network" xsi:type="NLogViewer" address="udp://192.168.1.3:9999" layout="${message}${onexception:inner=${newline}${exception:format=tostring}}" /> 

    <!-- Send message by UDP to Log2Console with Chainsaw protocol --> 
    <target name="network2" xsi:type="Chainsaw" address="udp://192.168.1.3:9998" appinfo="Grocelist"/> 

    <!-- Send exception/stacktrace by UDP to Log2Console with generic network protocol --> 
    <target name="network2ex" xsi:type="Network" address="udp4://192.168.1.3:9998" layout="${exception:format=ToString}" /> 

    <target name="logfile" xsi:type="File" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=tostring}" 
       createDirs="true" 
       fileName="${basedir}/logs/${shortdate}.log" 
       /> 
</targets> 

    <rules> 
    <logger name="*" minlevel="Debug" writeTo="logfile" /> 
    <logger name="*" minlevel="Debug" writeTo="network" /> 
    <logger name="*" minlevel="Debug" writeTo="network2" /> 
    <logger name="*" minlevel="Warn" writeTo="network2ex" /> 
    </rules> 
</nlog> 

Một số liên kết:

Chỉnh sửa: Sau khi tìm kiếm thêm, điều này có vẻ là hạn chế đối với kết thúc của NLog. Một miếng vá gần đây là rõ ràng ngoài kia: log4jxmlevent does not render Exception

Edit2: tôi xây dựng lại NLog với bản vá, nhưng nó không có vẻ để giúp đỡ trong việc Sentinel hoặc Log2Console ứng dụng. Tôi có thể phải thử log4net để đảm bảo rằng những ứng dụng đó thực sự hỗ trợ những gì tôi đang cố gắng đạt được.

Edit3: Tôi hiện đang sử dụng string.Format() để tự mình tham gia và định dạng văn bản và thông báo ngoại lệ. Điều này hoạt động tốt, nhưng không phải là những gì tôi đang tìm kiếm ở đây.

+0

Mã nguồn cho NLogViewerTarget trên Github cho thấy rằng Layout set {} là no-op nên bạn không thể ghi đè lên mặc định không có ngoại lệ. –

Trả lời

1

Bạn đã thử chụp nhanh nhà phát triển mới nhất của Cưa máy? Nó sẽ hiển thị đống dấu vết và hỗ trợ log4net/appenders UDP, và theo NLog bạn có thể sử dụng nó cũng như: http://nlog-project.org/wiki/Chainsaw_target

Thử chụp nhà phát triển mới nhất, có nhiều tính năng: http://people.apache.org/~sdeboy

+0

Tôi cảm thấy xấu, nhưng tôi không thể tìm ra cách chạy ảnh chụp mới nhất trên Windows? Các tập tin zip chỉ chứa một .bat, và bằng cách đọc nó tôi không thể tìm ra chính xác những gì tôi cần làm để làm cho nó hoạt động. – angularsen

+0

Bạn cần cài đặt thời gian chạy Java. Sau khi thực hiện, bạn có thể lưu mã zip vào hệ thống tệp của bạn và giải nén nó, điều hướng đến thư mục apache-chainsaw-2.1.0-SNAPSHOT \ bin và chạy lệnh chainsaw.bat. Nên làm vậy. – Scott

1

Chỉ cần tải và xây dựng mới nhất (NLog-Build-2.0.0).2007-0-g72f6495) nguồn từ GitHub: https://github.com/jkowalski/NLog/tree/ Vấn đề này được cố định ở đó bởi nhà phát triển NLog.

+0

Bạn cũng có thể tải xuống các tệp nhị phân đã biên dịch từ đây http://nlog.codeplex.com/releases/view/81084 – gschuager

3

Bạn cũng có thể mở rộng NLog để bao gồm ngoại lệ cho ghi nhật ký mạng.

Tạo một bố trí mở rộng:

[Layout("Log4JXmlEventLayoutEx")]  
public class Log4JXmlEventLayoutEx : Log4JXmlEventLayout 
{ 
    protected override string GetFormattedMessage(LogEventInfo logEvent) 
    { 
     string msg = logEvent.Message + " ${exception:format=Message,Type,ToString,StackTrace}"; 
     msg = SimpleLayout.Evaluate(msg, logEvent);  
     LogEventInfo updatedInfo; 
     if (msg == logEvent.Message) { 
      updatedInfo = logEvent; 
     } else { 
      updatedInfo = new LogEventInfo(
       logEvent.Level, logEvent.LoggerName, 
       logEvent.FormatProvider, msg, 
       logEvent.Parameters, logEvent.Exception); 
     }  
     return base.GetFormattedMessage(updatedInfo); 
    } 
} 

Tạo một mục tiêu sử dụng mà bố trí

[Target("NLogViewerEx")] 
public class NLogViewerTargetEx : NLogViewerTarget 
{ 
    private readonly Log4JXmlEventLayoutEx layout = new Log4JXmlEventLayoutEx();  
    public override Layout Layout { get { return layout; } set {} } 
} 

Cập nhật NLog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <extensions> 
    <add assembly="Assembly.Name.That.Contains.Extended.Target"/> 
    </extensions> 
    <targets> 
    <target name="logViewer" 
      xsi:type="NLogViewerEx" 
      address="udp://localhost:7071"> 
    </targets> 
... 
</nlog> 
+0

Cảm ơn bạn đã giải pháp tốt đẹp này! –

+0

Xin chào Alex, có thể có hai Bố cục tùy chỉnh cho hai mục tiêu không? 'Sentinel' và' File? Tôi đang mắc kẹt và nó không hoạt động (https://stackoverflow.com/q/47753773/6229375) - (liên kết được cập nhật). –

1

Trong NLog.config của bạn thay đổi mục tiêu như sau.

<target name="file" xsi:type="File" fileName="log.txt" layout="${longdate}:${message} ${exception:format=message,stacktrace:separator=*}" /> 

Phần mà bạn đang tìm kiếm là

${exception:format=message,stacktrace:separator=*} 

Để biết thêm thông tin về tìm kiếm này here.

+0

Đây chỉ dành cho mục tiêu tệp, đúng không? Câu hỏi đặt ra là lấy thông tin ngoại lệ cho các mục tiêu mạng. – angularsen

+0

Ahh, tôi phải bỏ lỡ điều đó. Có điều này là để xuất ra một tập tin. GL nhận được giải pháp mạng. – JabberwockyDecompiler

2

Tôi có vấn đề này, và chỉ cần cập nhật gói NuGet NLog tôi để 2.0.1.2

Bây giờ tôi có trường hợp ngoại lệ sắp qua để Log2Console tốt.

+0

Cảm ơn những người đứng đầu lên, tôi sẽ phải xem lại điều này đôi khi và thử nó bản thân mình! Bạn cũng có thể đăng cấu hình của mình không? – angularsen

2

Một vài năm sau đó và điều này là khá tầm thường, hãy thử thêm

includeSourceInfo = "true"

đến tập tin mục tiêu của bạn, vì vậy nó trông giống như;

<target name="viewer" 
      xsi:type="NLogViewer" 
      includeSourceInfo="true" 
      address="udp://127.0.0.1:9999" /> 

Cung cấp cho bạn thông tin về tệp, dòng, lớp và phương thức nguồn.

+0

Cảm ơn, tôi sẽ thử lần sau khi tôi gặp lại NLog và UDP. – angularsen

+0

Đáng buồn thay vẫn không có cách dễ dàng để có được một stacktrace mặc dù! Và chạy trong chế độ phát hành dải rất nhiều thông tin nguồn .. Tôi muốn tránh phương pháp này lâu hơn một chút :-) – keithl8041

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