2013-09-24 1 views
2

NLog를 통해 로깅을 구현하려고하는데 실제로주의를 요구하는 코드 냄새가 있지만 현재 제한된 지식으로 인해이를 처리하는 방법을 잘 모릅니다. 여기 솔리드 주체를 위반하지 않고 올바르게 로깅을 구현하는 방법은 무엇입니까?

내가 DI와 함께 사용할 수있는 인터페이스 뒤에 NLog의 실제 구현을 숨긴 그 클래스는 싱글 톤의 내가

먼저 좋아하지 않는 것들이다.

현재 가능한 한 많은 정보를 기록하려고합니다. 즉, 비즈니스 개체의 거의 모든 메소드에서 로거를 호출하고 있으며 로깅 클래스에서 작성중인 종속성이 마음에 들지 않습니다. 메소드를 직접 호출하는 것이 아니라 모든 메소드에서 로깅을 수행하는 더 나은 방법입니까? 여기에서는 로깅 인터페이스 방법을 변경하면 Open Closed Principal을 위반하고 있다고 생각합니다. 모든 지옥은 헐렁 할 것이고 그 변화는 모든 방법에서 거의 파급 될 것입니다.

두 번째로 무서운 부분은 UserID, ProductCode 등 일부 경우에 내 로거에 추가 정보를 전달해야한다는 것입니다.이 정보를 로거 클래스에 매개 변수로 전달하면 생각조차하지 않습니다. 그 길을 ... 경험이 많은 사람들은 어떻게 이런 시나리오를 다루겠습니까?

의견을 보내주세요.

답변

2

당신은 정말 양면으로 로깅을 시도해야합니다. http://www.voelter.de/data/articles/aop/aop.html 또는 "aspect를 사용한 로깅"을 참조하십시오.

+0

감사합니다. 당신의 대답 리드가 올바른 방향으로 인도합니다. 제 경우에는 포스트 샤프 (Post Sharp)를 사용했고 지금 크로스 커팅 (Cross Cutting) 관심사로 작업한다는 내 관점이 완전히 달라졌습니다! 고마워! –

+0

예, 교차 절단은 완전히 새로운 사고 방식입니다. 재미있게 보내십시오. – SilentNot

1

로깅 이벤트를 수신하기 위해 로거를 첨부 할 수있는 일반적인 방법으로 비즈니스 객체의 기본 로깅을 설계 할 수 있습니다. 그런 식으로 나중에 비즈니스 오브젝트 코드를 변경하지 않고 로그가 기록되는 메소드를 변경할 수 있습니다. 같은

뭔가 : 어쨌든 이런

public interface BOLogger 
{ 
    void Log(string message); 
} 

public sealed class AbstractBOLogger : BOLogger 
{ 
    public List<BOLogger> Loggers { get; private set; } 

    public AbstractBOLogger 
    { 
     this.Loggers = new List<BOLogger>(); 
    } 

    public void Log(string message) 
    { 
     this.Loggers.ForEach(logger => logger.Log(message)); 
    } 
} 

public class BusinessObject 
{ 
    public BOLogger { get; private set; } 

    public BusinessObject 
    { 
     this.BOLogger = new AbstractBOLogger(); 
    } 
} 

뭔가.

+0

의견을 보내 주셔서 감사합니다. 이것은 바로 지금 내가하고있는 일이지만 이것이 내가하고 싶지 않은 일입니다. 여기서는 Business Object의 AbstractBlogger 클래스에 대한 종속성을 확인하십시오. 500 개의 비즈니스 오브젝트가 있고 모든 오브젝트에 로깅이 필요하다고 가정하면 모든 오브젝트를 로거에 사방에 추가하고 나중에 로거에서 어떤 것을 변경하면 비즈니스 오브젝트를 터치해야합니다. SOLID 코드가 아닙니다. 나는 Ray Trask가 제공 한 제안을 선택했다. PostSharp를 사용하여 갔고 이제는 구현에 만족합니다. 감사합니다. –

관련 문제