Skip to content

Commit

Permalink
Merge pull request #1548 from NLog/EventLog-1542
Browse files Browse the repository at this point in the history
Bugfix: Can't update EventLog's Source property
  • Loading branch information
304NotModified committed Jul 23, 2016
2 parents ee98bf2 + 8b5590d commit ba06724
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/NLog/Targets/EventLogTarget.cs
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,15 @@ internal string GetFixedSource()
/// <returns></returns>
private EventLog GetEventLog(LogEventInfo logEvent)
{
return eventLogInstance ?? (eventLogInstance = new EventLog(this.Log, this.MachineName, this.Source.Render(logEvent)));
var renderedSource = this.Source?.Render(logEvent);
var isCacheUpToDate = eventLogInstance != null && renderedSource == eventLogInstance.Source &&
eventLogInstance.Log == this.Log && eventLogInstance.MachineName == this.MachineName;

if (!isCacheUpToDate)
{
eventLogInstance = new EventLog(this.Log, this.MachineName, renderedSource);
}
return eventLogInstance;
}

/// <summary>
Expand Down
48 changes: 48 additions & 0 deletions tests/NLog.UnitTests/Targets/EventLogTargetTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,44 @@ public void WriteEventLogEntryLargerThanMaxMessageLengthWithOverflowDiscard_TheM
Assert.False(wasWritten);
}


[Fact]
public void WriteEventLogEntryWithDynamicSource()
{
const int maxMessageLength = 10;
string expectedMessage = string.Join("", Enumerable.Repeat("a", maxMessageLength));

var target = CreateEventLogTarget(null, "NLog.UnitTests" + Guid.NewGuid().ToString("N"), EventLogTargetOverflowAction.Split, maxMessageLength);
target.Layout = new SimpleLayout("${message}");
target.Source = new SimpleLayout("${event-properties:item=DynamicSource}");
SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Trace);

var logger = LogManager.GetLogger("WriteEventLogEntry");

var sourceName = "NLog.UnitTests" + Guid.NewGuid().ToString("N");
var logEvent = CreateLogEventWithDynamicSource(expectedMessage, LogLevel.Trace, "DynamicSource", sourceName);

logger.Log(logEvent);

var eventLog = new EventLog(target.Log);
var entries = GetEventRecords(eventLog.Log).ToList();

entries = entries.Where(a => a.ProviderName == sourceName).ToList();
Assert.Equal(1, entries.Count);
AssertWrittenMessage(entries, expectedMessage);

sourceName = "NLog.UnitTests" + Guid.NewGuid().ToString("N");
expectedMessage = string.Join("", Enumerable.Repeat("b", maxMessageLength));

logEvent = CreateLogEventWithDynamicSource(expectedMessage, LogLevel.Trace, "DynamicSource", sourceName);
logger.Log(logEvent);

entries = GetEventRecords(eventLog.Log).ToList();
entries = entries.Where(a => a.ProviderName == sourceName).ToList();
Assert.Equal(1, entries.Count);
AssertWrittenMessage(entries, expectedMessage);
}

private static IEnumerable<EventRecord> Write(LogLevel logLevel, EventLogEntryType expectedEventLogEntryType, string logMessage, Layout entryType = null, EventLogTargetOverflowAction overflowAction = EventLogTargetOverflowAction.Truncate, int maxMessageLength = 16384)
{
var target = CreateEventLogTarget(entryType, "NLog.UnitTests" + Guid.NewGuid().ToString("N"), overflowAction, maxMessageLength);
Expand Down Expand Up @@ -433,6 +471,16 @@ private static EventLogTarget CreateEventLogTarget(Layout entryType, string sour
return target;
}

private LogEventInfo CreateLogEventWithDynamicSource(string message, LogLevel level, string propertyKey, string proertyValue)
{
var logEvent = new LogEventInfo();
logEvent.Message = message;
logEvent.Level = level;
logEvent.Properties[propertyKey] = proertyValue;

return logEvent;
}

private static IEnumerable<EventRecord> GetEventRecords(string logName)
{
var query = new EventLogQuery(logName, PathType.LogName) { ReverseDirection = true };
Expand Down

0 comments on commit ba06724

Please sign in to comment.