如何通过命令行创建Windows事件日志源?

188

我正在创建一个ASP.NET应用程序,将一些内容记录到Windows事件日志中。为此,首先必须创建一个事件源。由于这需要管理员权限,因此我无法在ASP.NET应用程序中执行此操作。

是否有现成的命令行应用程序与Windows捆绑在一起,可以创建事件日志源,还是我必须自己编写?

9个回答

316

尝试使用"eventcreate.exe"

一个例子:

eventcreate /ID 1 /L APPLICATION /T INFORMATION  /SO MYEVENTSOURCE /D "My first log"

这将创建一个名为MYEVENTSOURCE的新事件,在APPLICATION事件日志下作为INFORMATION事件类型。我认为此实用程序仅从XP开始包含。

进一步阅读


13
你需要在"cmd"上右键单击,并从Vista中选择"以管理员身份运行"。 - Ian Ringrose
17
eventcreate会在现有源下记录一个事件,但不会像提问者要求的那样从头创建新的源。 - Paul Chavez
6
如果所命名的源不存在,它将被创建。 - Farinha
1
如果MYEVENTSOURCE已经存在并且是使用除eventcreate之外的其他方法创建的,则不会创建此事件。 - Chris S
2
虽然这个方法有效并创建了一个新的源,但是我的所有事件都显示为“无法找到源myApp的事件ID 0的描述。可能引发此事件的组件未安装在本地计算机上,或者安装已损坏”,所以最终我不得不编辑注册表。 - dibs487
显示剩余3条评论

191

尝试使用PowerShell 2.0的EventLog cmdlets。对于PowerShell 2.0及以上版本:

  New-EventLog -LogName Application -Source MyApp
然后使用Write-EventLog来写入日志:
  Write-EventLog 
      -LogName Application 
      -Source MyApp 
      -EntryType Error 
      -Message "Immunity to iocaine powder not detected, dying now" 
      -EventId 1

9
这个很好用,只要记得使用管理员权限运行PowerShell就可以了。 - Rod
4
我必须打开并关闭事件查看器才能看到我创建的新日志。 - amackay11
如果您正在积极开发并进行“New-EventLog”和“Remove-EventLog”之间的切换,可能会遇到一个问题,即“Source”已注册但未写入指定的“Log”。重新启动计算机可以解决这个问题。另一个提示:您可以使用_regedit_查看事件日志的情况,位置在此处:[Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\] - Corio
@amackay11,关闭和重新打开事件查看器确实可行,但更快、更简单的方法是直接单击它的“操作”菜单,然后选择“刷新”。 - Rich Bayless

52

你也可以使用 Windows PowerShell 命令:

if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
    [System.Diagnostics.EventLog]::CreateEventSource($source, "Application")
}

在调用CreateEventSource之前,请确保检查源是否不存在,否则它会抛出异常。

更多信息:


12

eventcreate2可以帮助你创建自定义日志,而eventcreate则不行。


9

如果有人感兴趣,也可以通过添加一些注册表值来手动创建事件源。

将以下行保存为.reg文件,然后双击导入到注册表中:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application\YOUR_EVENT_SOURCE_NAME_GOES_HERE]
"EventMessageFile"="C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\EventLogMessages.dll"
"TypesSupported"=dword:00000007

这将创建一个名为YOUR_EVENT_SOURCE_NAME_GOES_HERE的事件源。

1

或者只需使用命令行命令:

Eventcreate


1
然而,当你想定义一个事件ID大于1000时,cmd/batch版本可能会出现问题。对于使用事件ID为1000+创建事件,我会使用如下的powershell命令:
$evt=new-object System.Diagnostics.Eventlog(“Define Logbook”)
$evt.Source=”Define Source”
$evtNumber=Define Eventnumber
$evtDescription=”Define description”
$infoevent=[System.Diagnostics.EventLogEntryType]::Define error level
$evt.WriteEntry($evtDescription,$infoevent,$evtNumber) 

示例:

$evt=new-object System.Diagnostics.Eventlog(“System”)
$evt.Source=”Tcpip”
$evtNumber=4227
$evtDescription=”This is a Test Event”
$infoevent=[System.Diagnostics.EventLogEntryType]::Warning
$evt.WriteEntry($evtDescription,$infoevent,$evtNumber)

0

PowerShell 7

这个答案在5.x版本中对我很有效,但在7.x版本中不起作用。经过一些调查,我找到了以下解决方法:

Import-Module Microsoft.PowerShell.Management -UseWindowsPowerShell
New-EventLog -LogName Application -Source MyApp

我偶然发现了通过这个SO答案导入模块的方法。显然,有一套可以导入的模块,仅适用于Windows cmdlet,具体取决于您的需求。我仍在努力弄清楚如何根据您的cmdlet确定要导入哪个模块


-3

您可以使用diagnostics.Event log类创建自己的自定义事件。 打开一个Windows应用程序,在按钮单击时执行以下代码。

System.Diagnostics.EventLog.CreateEventSource("ApplicationName", "MyNewLog");

"

"MyNewLog" 表示您想要在事件查看器中为日志命名的名称。

欲了解更多信息,请查看此链接 [http://msdn.microsoft.com/en-in/library/49dwckkz%28v=vs.90%29.aspx]。

"

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