Reputation: 4886
I have an application where I want to write entries to event log The logger is instantiated through MEF. I created a derived class, to be able to perform the log initializations prior of using it.
My code is as below:
public class WinEventLog : EventLog, ILogger
{
private const string LOG_SourceName = "DataGen_Source";
private const string LOG_SysLogName = "Pool_Log";
private bool _isInitialized = false;
public WinEventLog()
: base()
{
Initialize();
}
public void LogMessage(MessageLevel level, string message)
{
WriteEntry(message, level.EventLogType());
}
public void LogMessage(string source, MessageLevel level, string message)
{
WriteEntry(source, message, level.EventLogType());
}
public void Initialize()
{
if (!_isInitialized)
{
this.BeginInit();
this.EndInit();
if (!System.Diagnostics.EventLog.SourceExists(LOG_SourceName))
{
System.Diagnostics.EventLog.CreateEventSource(
LOG_SourceName, LOG_SysLogName);
}
Source = LOG_SourceName;
Log = LOG_SysLogName;
_isInitialized = true;
}
}
}
However, the logger does not write into the log I specify, Pool_Log, but in Applications log.
Any idea why this happens?
EDIT
I referenced EXACT the same component from other project, and in this situation it wrote to the correct EventLog !!!
I'm puzzled!
Thanks
Upvotes: 4
Views: 14261
Reputation: 339
check if Event Log Source is not long and does not contain special meaningful characters such as .\ or ./
In my case this was the cause event was going to Application Log instead of designated custom log.
public static void EventLogWrite(string Source, string Message, short categoryID, int eventID, EventLogEntryType entryType)
{
#if !DEBUG
if (!EventLog.SourceExists(Source))
EventLog.CreateEventSource(Source.RefineText(), "My Log Name");
EventLog.WriteEntry(Source.RefineText(), Message.TrimText(3000), entryType, eventID, categoryID);
#endif
}
Upvotes: 0
Reputation: 61433
Your error may be related to permissions. Check the permissions on the registry keys of the event source.
Lastly, you shouldn't use WriteEntry, you will get a Security Exception, and other issues.
In my opinion you should use WriteEvent instead see: https://security.stackexchange.com/q/15857/396
Upvotes: 0
Reputation: 2775
you can try the following :
evntSource = "MySource";
evntLog = "MyLog"; //This replace Application!
evntEvent = "My Event";
if (!EventLog.SourceExists(evntSource))
EventLog.CreateEventSource(evntSource,evntLog);
EventLog.WriteEntry(evntSource,evntEvent);
Upvotes: 2
Reputation: 18843
it appears that you are creating the source but not creating the actual Log for example I would do something like the following if I wanted to create a SQLEventLog
public bool CreateLog(string strLogName)
{
bool Result = false;
try
{
System.Diagnostics.EventLog.CreateEventSource(strLogName, strLogName);
System.Diagnostics.EventLog SQLEventLog =
new System.Diagnostics.EventLog();
SQLEventLog.Source = strLogName;
SQLEventLog.Log = strLogName;
SQLEventLog.Source = strLogName;
SQLEventLog.WriteEntry("The " + strLogName + " was successfully
initialize component.", EventLogEntryType.Information);
Result = true;
}
catch
{
Result = false;
}
return Result;
}
let me know if this helps.. looks like you are missing the EventLog Creation
Upvotes: 2