EventLog WriteEntry无法写入指定日志,而是写入应用程序日志。

5
我有一个应用程序,需要将记录写入事件日志。这个日志记录器通过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),而是写入了应用程序日志。

你知道为什么会这样吗?


编辑

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

我很困惑!

谢谢


我遇到了完全相同的问题。在一个项目中,完全相同的组件可以写入指定的事件源,但在另一个项目中却不能将任何内容写入标准应用程序日志。 - Lorgarn
2
刚遇到这个问题 - 解决方法是重新启动。如果你最初在“Application”下创建源代码,然后将其更改为“CustomApp”,那么系统需要重启才能正常运行;在重启之前,你的事件将继续显示在“Application”下。 - Mike
@Mike 重启对我也起作用了。我甚至卸载了我创建的服务,检查了 Visual Studio 添加的事件记录器安装程序的属性,删除了注册表键。最后尝试重启。它奏效了。 - Bryan Hazelbaker
4个回答

2

看起来你正在创建源代码,但并没有创建实际的日志文件。例如,如果我想创建一个 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;
}

今日免费次数已满, 请开通会员/明日再来

抱歉,您在哪一行创建事件日志?据我所知,您只是创建了源,然后分配了源和日志,最后写入日志。顺便说一句,由于我看到它(它只是空的,所有条目都进入应用程序),日志是由我的代码创建的。 - bzamfir

2
您可以尝试以下方法:
evntSource = "MySource";

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

EventLog.WriteEntry(evntSource,evntEvent);

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
}

0

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

最后,你不应该使用WriteEntry,否则会出现安全异常和其他问题。

我认为你应该使用WriteEvent代替,请参见:https://security.stackexchange.com/q/15857/396


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接