2010-04-08 66 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 2010-04-08 11:21:15

+0

我非常喜欢这种方法。允许更好地维护消息格式。谢谢! – 2010-04-08 11:25:36

0

如果你想只是追加相关的子类重写虚方法(和调用之初基本实现)的一些信息是最好的合适的解决方案;)

+0

感谢托马斯,我怎么会那么可以进入 “MESSAGE = {0}” 和之后的 “LOGTYPE = {0}” 之前的StringBuilder的一个条目?我是否必须将其转换为字符串并查找子字符串? – 2010-04-08 11:16:32

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。

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))); 
    //... 

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

protected virtual void AddMessageDetail(StringBuilder logMessage) 
{ 
} 

然而,这打破了,如果子类需要改变结构的消息。

+0

这是一个非常有趣的方法李,非常感谢您的反馈。这对于我正在写作的另一部分是有用的! – 2010-04-08 11:26:45