2016-06-25 3 views
2

Serilog의 @ 구문의 목적은 무엇입니까?Serilog 구조 조정이란 무엇입니까?

나는 다음과 같은 실행하는 경우 :

그런 다음
var dummy = new { Foo = "Bar", Date = DateTime.Now }; 

Log.Information("Dummy object: {Dummy}", dummy); 

나는과 같이 콘솔에 출력을 얻을 : 내가 변경하는 경우

Time: 16:20 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: "Foo = Bar, Date = 25/06/2016 16:20:30 }" 

{Dummy}{@Dummy}에 나는이 같은 출력을 얻을

Time: 16:22 [Level: Information] (ManagedThreadID: 8) Message: Dummy object: Foo: "Bar", Date: 06/25/2016 16:22:28 } 

그래서 @은 무엇입니까? 그래?

답변

5

자세히 살펴보면 동일한 출력이 아닌 것을 알 수 있습니다.

Dummy 앞의 @ 연산자는 ToString()을 사용하여 변환하지 않고 전달 된 개체를 Serilog에 알립니다. 이는 @ 연산자를 사용하지 않고 첫 번째 예제에서 발생합니다.

는 첫 번째 예에서 로그 이벤트가 (여기 JSON에서) 같은 속성을 사용하여 종료됩니다

:

{ 
    "Dummy": "{ Foo = Bar, Date = 25/06/2016 16:20:30 }" 
} 

가 {@Dummy}를 사용하여 매개 변수가 발생할 수는 구조화 된 데이터로 직렬화 :

{ 
    "Dummy": 
    { 
    "Foo": "Bar", 
    "Date": "25/06/2016 16:20:30" 
    } 
} 

Comment from Nicholas Blumhardt (Serilog의 제작자) :

@ 연산자를 사용하면 조작/분석에 훨씬 더 유용합니다.

"옵트 인"요구 사항이 적용되는 이유는 대부분 프로그램의 형식이 문자열로 올바르게 변환되지만 실제로는 직렬화 가능하지 않기 때문입니다. @로 직렬화를 선택하면 "내가 내가이 일을 알고 있고,이 객체를 직렬화합니다!"라고 말하고있는 것입니다. :)

+0

예! 'ToString()'에 익명 형식을 사용하면 직렬화 된 형식을 얻을 수 있습니다. – BanksySan

+0

@BanksySan 종류 ... 익명 형식의 ToString()'은 여전히 ​​하나의 문자열을 제공합니다. 단지 멋지게 보입니다. '@'는 싱크에 직렬화 된 객체를 제공하고 싱크는 직렬화 된 데이터를 저장하는 것을 포함하여 원하는대로 할 수 있습니다. Seil (https://getseq.net)과 함께 Serilog를 사용하여 '@'연산자가 얼마나 강력한지를보십시오. –

관련 문제