2014-07-05 12 views
3

이 코드를 감안할 때 :Serilog : {..} 사이의 차이 {@ ..}

var d1 = new { x = 5, y = 88 }; 
Log.Logger.Information("{d1}", d1); 
Log.Logger.Information("{@d1}", d1); 

(D1)에서 개체가 두 Log.Logger.Information 다르게 기록 될 것인가 (...) 윤곽? 즉, {} 사이에 @를 추가하면 어떤 영향이 있습니까?

"개체 구조 보존"이라는 제목 아래에서 https://github.com/serilog/serilog/wiki/Structured-Data을 읽었지만 그건 나에게 의미가 없습니다.

+0

실제로는 {{}} (기본값), {$ ..} (문자열 화) 및 {{..}} (destructure)가 있습니다. [this] (https://github.com/serilog/serilog/blob/60e8120a12abee4db942d2ff03b123341fab1fff/src/Serilog/Parsing/Destructuring.cs) * 도움이 더 필요할까요? –

+0

이것은 나를 위해 그것을 정리하지 않았다. "default"와 "destructure"는 객체를 문자열이 아닌 구조화 된 객체로 저장하는 것처럼 보입니다. 나는 거기에 차이가 있지만, 그것을 볼 수 없습니다 감사드립니다. – user1147862

+0

편리하게도, 누군가 Placalight에 대해 다음과 같이 설명하는 멋진 Pluralsight 코스를 작성했습니다. http://pluralsight.com/training/Courses/TableOfContents/modern-structured-logging-serilog-seq –

답변

5

{d1}은 익명의 유형 (예 : ToString())을 로깅 용으로 string 초로 변환합니다.

{ 
    "d1": 
    { 
    "x": 5, 
    "y": 88 
    } 
} 

적절한 :

{ 
    "d1": "{ x = 5, y = 88 }" 
} 

매개 변수의 원인이됩니다 {@d1} 사용이 구조화 된 데이터로 직렬화하는 : 그래서 첫 번째 예에서 로그 이벤트는 (여기 JSON에서) 같은 속성을 사용하여 종료됩니다 , 두 번째 예제는 조작/분석에 훨씬 더 유용합니다.

"옵트 인"요구 사항의 이유는 .NET 프로그램의 대부분의 유형이 문자열로 올바르게 변환되지만 은 확실하게/의미있는 직렬화가 가능하지 않다는 것입니다 (). @을 사용하여 직렬화를 선택하면 다음과 같이 말합니다. "내가하는 일을 알고이 객체를 직렬화하십시오!" :)

+0

오브젝트의 공개 속성이 목록 을 입력 하시겠습니까? 나는 Serilog가 객체의 구조를 없애고 double과 integer이지만 List라는 유형의 특정 속성을 남기는 모든 속성을 나열한다는 것을 알 수 있습니다. – NotAgain

+0

@NotAgain은 목록이 속성이 아닌 공개 필드 일 수 있습니까? Serilog는 필드를 무시하므로 그 가능성이 있습니다. 그렇지 않은 경우 - 새로운 질문에 코드를 게시 할 수 있습니까? 건배! –

+0

Spot on. 그것은 필드이고 속성은 아닙니다. 내 실수. – NotAgain