2010-04-08 4 views
0

로그 파일을 사용하여 작업하고 있으며 로그에 일반 항목을 만드는 방법이 있습니다. 일반 로그 항목은 다음과 같습니다.메서드 내에서 문자열 중간에 내용 추가

public StringBuilder GetLogMessage(LogEventType logType, object message) 
{ 
     StringBuilder logEntry = new StringBuilder(); 
     logEntry.AppendFormat("DATE={0} ", DateTime.Now.ToString("dd-MMM-yyyy", new CultureInfo(CommonConfig.EnglishCultureCode))); 
     logEntry.AppendFormat("TIME={0} ", DateTime.Now.ToString("HH:mm:ss", new CultureInfo(CommonConfig.EnglishCultureCode))); 
     logEntry.AppendFormat("ERRORNO={0} ", base.RemoteIPAddress.ToString().Replace(".", string.Empty)); 
     logEntry.AppendFormat("IP={0}", base.RemoteIPAddress.ToString()); 
     logEntry.AppendFormat("LANG={0} ", base.Culture.TwoLetterISOLanguageName); 
     logEntry.AppendFormat("PNR={0} ", this.RecordLocator); 
     logEntry.AppendFormat("AGENT={0} ", base.UserAgent); 
     logEntry.AppendFormat("REF={0} ", base.Referrer); 
     logEntry.AppendFormat("SID={0} ", base.CurrentContext.Session.SessionID); 
     logEntry.AppendFormat("LOGTYPE={0} ", logType.ToString()); 
     logEntry.AppendFormat("MESSAGE={0} ", message); 
     return logEntry; 
} 

"MESSAGE ="전에 추가 매개 변수를 추가하는 가장 좋은 방법은 무엇입니까? 예를 들어 GetLogMessage가 실행될 때 파생 클래스에서 "MODULE ="을 추가하려고합니다. 위임자가 내가 찾고자하는 것이거나 가상으로 메서드를 표시하고이를 오버라이드 할 수 있습니까? 아니면 완전히 다른 것을 필요로합니까?

도움을 주시면 감사하겠습니다.

답변

1

:

public StringBuilder GetLogMessage(LogEventType logType, object message) 
{ 
    return GetLogMessage(logType, message, null); 
} 

public StringBuilder GetLogMessage(LogEventType logType, object message, Dictionary<string,string> extraParameters) 
{ 
     StringBuilder logEntry = new StringBuilder(); 
     logEntry.AppendFormat("DATE={0} ", DateTime.Now.ToString("dd-MMM-yyyy", new CultureInfo(CommonConfig.EnglishCultureCode))); 
     logEntry.AppendFormat("TIME={0} ", DateTime.Now.ToString("HH:mm:ss", new CultureInfo(CommonConfig.EnglishCultureCode))); 
     logEntry.AppendFormat("ERRORNO={0} ", base.RemoteIPAddress.ToString().Replace(".", string.Empty)); 
     logEntry.AppendFormat("IP={0}", base.RemoteIPAddress.ToString()); 
     logEntry.AppendFormat("LANG={0} ", base.Culture.TwoLetterISOLanguageName); 
     logEntry.AppendFormat("PNR={0} ", this.RecordLocator); 
     logEntry.AppendFormat("AGENT={0} ", base.UserAgent); 
     logEntry.AppendFormat("REF={0} ", base.Referrer); 
     logEntry.AppendFormat("SID={0} ", base.CurrentContext.Session.SessionID); 
     logEntry.AppendFormat("LOGTYPE={0} ", logType.ToString()); 
     if(extraParameters != null) 
     { 
      foreach(var s in extraParameters.Keys) 
      { 
        logEntry.AppendFormat("{0}={1} ", s, extraParameters[s]); 
      } 
     } 
     logEntry.AppendFormat("MESSAGE={0} ", message); 
     return logEntry; 
} 
+0

+1 내가 작성한 것과 같은 방법을 사용하지 않고도 여러 개의 사용자 정의 메시지를 추가 할 수 있기 때문에 답변이 마음에 든다. (OP에 표준 로그 메시지 형식이 없다고 가정) – Sunny

+0

나는이 접근법을 정말 좋아한다. 메시지 형식을보다 잘 관리 할 수 ​​있습니다. 고맙습니다! –

0

그냥 가장 적합한 솔루션입니다 가상 메소드를 오버라이드 (그리고 처음에 기본 구현을 호출) 서브 클래스에 관한 몇 가지 정보를 추가하려는 경우)

+0

감사 토마스, 어떻게 다음 "MESSAGE = {0}"이후 "LogType의 = {0}"전에 모두 StringBuilder의 항목을 입력 할 수 있을까요? 문자열로 변환하고 하위 문자열을 찾아야합니까? –

0
public StringBuilder GetLogMessage(LogEventType logType, object message) 
{ 
     StringBuilder logEntry = new StringBuilder(); 
     logEntry.AppendFormat("DATE={0} ", DateTime.Now.ToString("dd-MMM-yyyy", new CultureInfo(CommonConfig.EnglishCultureCode))); 
     logEntry.AppendFormat("TIME={0} ", DateTime.Now.ToString("HH:mm:ss", new CultureInfo(CommonConfig.EnglishCultureCode))); 
     logEntry.AppendFormat("ERRORNO={0} ", base.RemoteIPAddress.ToString().Replace(".", string.Empty)); 
     logEntry.AppendFormat("IP={0}", base.RemoteIPAddress.ToString()); 
     logEntry.AppendFormat("LANG={0} ", base.Culture.TwoLetterISOLanguageName); 
     logEntry.AppendFormat("PNR={0} ", this.RecordLocator); 
     logEntry.AppendFormat("AGENT={0} ", base.UserAgent); 
     logEntry.AppendFormat("REF={0} ", base.Referrer); 
     logEntry.AppendFormat("SID={0} ", base.CurrentContext.Session.SessionID); 
     logEntry.AppendFormat("LOGTYPE={0} ", logType.ToString()); 

     var module_log = GetModuleLog();   
     logEntry.AppendFormat("MODULE={0}", (!String.IsNullOrEmpty(module_log)) 
        ?module_log 
        :String.Empty); 

     logEntry.AppendFormat("MESSAGE={0} ", message); 
     return logEntry; 
} 

protected virtual string GetModuleLog(){ 
// code in the derived class to return the log related to the module... 
} 

HTH를. 서브 클래스가 구조를 변경해야하는 경우

public StringBuilder GetLogMessage(LogEventType logType, object message) 
{ 
    StringBuilder logEntry = new StringBuilder(); 
    logEntry.AppendFormat("DATE={0} ", DateTime.Now.ToString("dd-MMM-yyyy", new CultureInfo(CommonConfig.EnglishCultureCode))); 
    //... 

    this.AddMessageDetail(logEntry); 
    logEntry.AppendFormat("MESSAGE={0} ", message); 
    return logEntry; 
} 

protected virtual void AddMessageDetail(StringBuilder logMessage) 
{ 
} 

그러나이 고장 : 로그 메시지를 가정

0

항상 서브 클래스가 메시지에 자신의 세부 정보를 추가 할 구현할 수있는 가상 메서드를 추가 할 수 있습니다 같은 형식을가집니다 개의 어떤이 방법에 대한

+0

이것은 정말 흥미로운 방법입니다. Lee, 귀하의 의견에 대단히 감사합니다. 내가 쓰는 부분의 다른 부분에 유용 할 것입니다! –