1
votes

I am attempting to find a way of padding out fields within the enterprise logger library Text Formatter.

The current format of my log file entries is as follows:

02/01/2015 15:36:43.946|Information|Test Information Message
02/01/2015 15:36:43.946|Error|Test Error Message

However for ease of readability in a text based viewer like notepad, I would like them to be formatted as follows:

02/01/2015 15:36:43.946|Information|Test Information Message
02/01/2015 15:36:43.946|Error      |Test Error Message

Is this something that can be achieved in the configuration of the tokens or would a custom formatter be needed and if so are there any good examples that would give me a start point for what I am trying to achieve.

Also is there anyway to display a single value from the extended properties collection within a log entry?

1

1 Answers

1
votes

There are a few ways to do what you want. One way is a custom formatter (as you mention). Another option is to create a custom LogEntry:

[System.Xml.Serialization.XmlRoot("paddedLogEntry")]
[Serializable]
public class PaddedLogEntry : LogEntry
{
    public string PaddedSeverity
    {
        get
        {
            return this.Severity.ToString().PadRight(11);
        }
    }
}

LogWriter logger = new LogWriterFactory().Create();
PaddedLogEntry logEntry1 = new PaddedLogEntry()
{
    Message = "Testing 123...",
    Severity = System.Diagnostics.TraceEventType.Information
};
logEntry1.Categories.Add("General");
logger.Write(logEntry1);

Using a template string: {timestamp}|{property(PaddedSeverity)}|{message}.

Instead of creating a custom LogEntry you could also piggyback on the ExtendedProperties:

LogEntry logEntry3 = new LogEntry()
{
    Message = "Oops!",
    Severity = System.Diagnostics.TraceEventType.Error
};
logEntry3.Categories.Add("General");
var extendedProperties = new Dictionary<string, object>();
extendedProperties.Add("PaddedSeverity", logEntry3.Severity.ToString().PadRight(11));
logEntry3.ExtendedProperties = extendedProperties;
logger.Write(logEntry3);

Using a template string: {timestamp}|{keyvalue(PaddedSeverity)}|{message}.

Also is there anyway to display a single value from the extended properties collection within a log entry?

The answer is yes. In the last template, I use that approach with the {keyvalue(PaddedSeverity)} token.