Добавить дополнительный контент в середину строки из метода - PullRequest
0 голосов
/ 08 апреля 2010

Я работаю с файлом журнала, и у меня есть метод, который создает общую запись в журнал. Общая запись в журнале выглядит следующим образом:

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 ="? Например, если я хотел добавить «MODULE =» из производного класса, когда выполняется GetLogMessage. Может ли делегат быть тем, что я ищу, или отмечать метод как виртуальный и переопределяющий его, или мне нужно что-то совершенно другое?

Любая помощь будет оценена.

Ответы [ 4 ]

1 голос
/ 08 апреля 2010

А как насчет этого подхода:

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 голосов
/ 08 апреля 2010
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...
}

НТН.

0 голосов
/ 08 апреля 2010

Предполагая, что сообщение журнала всегда имеет один и тот же формат, вы можете добавить виртуальный метод, который подклассы могут реализовать, чтобы добавить свои собственные детали к сообщению:

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 голосов
/ 08 апреля 2010

Если вы хотите просто добавить некоторую информацию, относящуюся к подклассу, переопределяющему виртуальный метод (и вызывающему базовую реализацию в начале), - это наилучшее подходящее решение;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...