EventLog WriteEntry不会写入指定的日志,而是写入应用程序日志

时间:2012-02-20 16:05:32

标签: c# event-log

我有一个应用程序,我想将条目写入事件日志 记录器通过MEF实例化。 我创建了一个派生类,以便能够在使用它之前执行日志初始化。

我的代码如下:

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;
        }
    }
} 

但是,记录器不会写入我指定的日志Pool_Log,而是写入应用程序日志。

知道为什么会这样吗?


修改

我从其他项目中引用了EXACT相同的组件,在这种情况下它写入了正确的EventLog!

我很困惑!

由于

4 个答案:

答案 0 :(得分:2)

看来您正在创建源但不创建实际的Log,例如,如果我想创建一个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;
}

让我知道这是否有帮助..看起来你错过了EventLog Creation

答案 1 :(得分:2)

您可以尝试以下方法:

evntSource = "MySource";

evntLog = "MyLog"; //This replace Application!
evntEvent = "My Event";
if (!EventLog.SourceExists(evntSource))
    EventLog.CreateEventSource(evntSource,evntLog); 

EventLog.WriteEntry(evntSource,evntEvent);

答案 2 :(得分:0)

您的错误可能与权限有关。检查事件源的注册表项的权限。

最后,您不应该使用WriteEntry,您将获得安全异常和其他问题。

在我看来,您应该使用WriteEvent来查看:https://security.stackexchange.com/q/15857/396

答案 3 :(得分:0)

检查事件日志源是否不长并且不包含特殊有意义的字符,例如。\或./

在我的情况下,这是因为事件发生在应用程序日志而不是指定的自定义日志。

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
}