我正在为使用自定义事件日志源的网站创建安装程序.我希望我们的基于WiX的安装程序在安装期间创建该事件日志源.
有没有人知道使用WiX框架执行此操作的最佳方法.
我正在使用以下行创建一个新的事件日志
new-eventlog -LogName "Visual Studio Builds" -Source "Visual Studio"
Run Code Online (Sandbox Code Playgroud)
我想每次运行它,因为如果我从新计算机运行构建,我仍然希望看到事件日志.
问题是每次在创建日志后运行脚本时,都会抛出错误.
New-EventLog : The "Visual Studio" source is already registered on the "localhost" computer.
At E:\Projects\MyApp\bootstrap.ps1:14 char:13
+ new-eventlog <<<< -LogName "Visual Studio Builds" -Source "Visual Studio"
+ CategoryInfo : InvalidOperation: (:) [New-EventLog], InvalidOperationException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.NewEventLogCommand
Run Code Online (Sandbox Code Playgroud)
现在我知道我可以"搜索"事件日志
Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"}
Run Code Online (Sandbox Code Playgroud)
但现在我如何确定它是否存在?
我在安装.Net Windows服务期间无法可靠地创建/删除事件源.
这是我的ProjectInstaller类的代码:
// Create Process Installer
ServiceProcessInstaller spi = new ServiceProcessInstaller();
spi.Account = ServiceAccount.LocalSystem;
// Create Service
ServiceInstaller si = new ServiceInstaller();
si.ServiceName = Facade.GetServiceName();
si.Description = "Processes ...";
si.DisplayName = "Auto Checkout";
si.StartType = ServiceStartMode.Automatic;
// Remove Event Source if already there
if (EventLog.SourceExists("AutoCheckout"))
EventLog.DeleteEventSource("AutoCheckout");
// Create Event Source and Event Log
EventLogInstaller log = new EventLogInstaller();
log.Source = "AutoCheckout";
log.Log = "AutoCheckoutLog";
Installers.AddRange(new Installer[] { spi, si, log });
Run Code Online (Sandbox Code Playgroud)
引用的facade方法只返回日志,服务等名称的字符串.
此代码大部分时间都有效,但最近安装后我开始在应用程序日志中显示日志条目而不是自定义日志.并且日志中也存在以下错误:
无法找到源(AutoCheckout)中事件ID(0)的说明.本地计算机可能没有必要的注册表信息或消息DLL文件来显示来自远程计算机的消息.您可以使用/ AUXSOURCE =标志来检索此描述; 请参阅帮助和支持以获取详细信
由于某种原因,它在卸载期间没有正确删除源,或者在安装期间没有创建它.
任何有关最佳实践的帮助表示赞赏. …
这是一个故意半复制的如何使用WiX和WIX创建事件日志源:使用.NET消息文件创建EventSource.
我的第一个问题是,它真的必须如此复杂吗?有没有办法简单地指定WiX,"我的程序是一个.Net程序,它需要写入事件日志 - 请做必要的设置"?
好吧,假设这是不可能的,我想收到任何关于必要的WiX语句的建议,以使其工作,无论安装了哪个版本的.Net Framework,无论它是32位还是64位系统.毕竟,我的大多数.Net程序都可以在.Net 2.0或更高版本上运行,在32位或64位运行,所以它无关紧要.
最后一个问题:有没有办法让它面向未来?如果我今天生成的MSI文件仍然可以在五年内运行,那将是很好的,即使.Net CLR 2.0和4.0已经降级到Windows 11中的垃圾箱或者其他所谓的垃圾箱.
精简版:
应用程序事件日志中是否始终包含事件源"应用程序"和"应用程序错误"?它们是否适用于Windows XP,Vista和Windows 7的新安装?使用它们而不是创建我自己的源(对我来说是不可能的)真的很糟糕吗?
长版:
我有一个ClickOnce应用程序,用户在没有管理员权限的情况下使用它们.
当我尝试写入Appliction事件日志时,我收到安全异常.(Windows事件日志记录基础结构正在尝试创建一个新的事件源,并获得安全性违规.)
所以我想尝试重用现有的事件源.我在应用程序事件日志中找到了两个"通用声音"源.这些是否始终是Windows安装的一部分,并且会做出合理的选择?
我确信这是不赞成的,因为我应该使用自己的事件源来区分我的应用程序.但这是因为不常发生的致命错误,应该通过我的代码记录到其他地方.我只想要一个非常容易的地方在客户端机器上找到它们以防万一出错...
Windows中是否为应用程序开发人员保留了特定范围的事件ID?
我正在研究一个将错误写入Windows事件日志的.Net应用程序.此应用程序实际上以服务器为目标,并将由偏执的sys管理员作为计划任务运行,他们希望尽可能地将其锁定(包括使用减少的权限维护帐户运行它).该应用程序将不会正式安装 - 事实上,我甚至没有为此构建安装程序; 只是一个包含.exe和app.config文件的zip文件.
这是诀窍:在Windows中,您需要管理员权限才能在应用程序事件日志中创建源.由于我不能指望这一点,我不想让过度工作的系统管理员需要创建一个,我使用"应用程序错误"(由MS Office使用)作为后备.(选择一个更好的后备是在我的待办事项清单上,因为办公室不经常安装在服务器上).
问题是我仍然希望我的活动能够脱颖而出,而不仅仅是伪装成Office.这样,我的系统管理员可以轻松过滤到事件查看器中的那些事件或他们选择的日志聚合器.我现在知道的最佳解决方案是使用事件ID,但我担心与内部Windows事件冲突,特别是考虑到我的目标受众.
我看了,但我找不到任何关于此的文件.那么,我应该使用特定范围的事件ID,我可以使用任何东西吗,或者我应该在这里看一个完全不同的选项?
我有一个安装Windows服务的安装项目.
我们在自定义日志中注册了一个事件日志源,应该由winservice项目使用(如何以及为什么不重要).
我的问题是安装项目尝试默认创建事件日志源.通过这样做它得到一个错误消息("Error 1001" source XXX already exists on local computer)并回滚.
我到处寻找,我无法找到注册的位置或如何关闭它.
如何强制Windows服务或安装项目不创建事件日志源?
我有一个我在多个ClickOnce应用程序中使用的库.如果这个库出错,我想把错误写入windows EventLog.
我发现了一篇知识库文章,但似乎需要管理员权限来搜索源代码.特别是在尝试搜索Security事件日志时会发生窒息.
有没有办法解决这个问题并在ClickOnce应用程序中写入事件日志?我看到一个人试图写一个已知来源,但他们似乎无法找到一直可用的来源.
编辑:
根据这里的答案,我创建了一个程序,该程序包含在我的应用程序中,我可以在第一次运行时运行以设置可以获得管理员权限的事件源.但是一旦创建了源代码,我似乎仍然无法写入它.
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
if (!EventLog.SourceExists("ATE"))
{
EventLog.CreateEventSource("ATE", "Application");
}
}
Run Code Online (Sandbox Code Playgroud)
是否正确创建了一个源(相当于Yannick Blondeau提供的注册表编辑).当我在非提升的应用程序中写入源时,我收到一个新的错误,但它仍然无法正常工作.新错误是:
Cannot open log for source 'ATE'. You may not have write access.
编辑2:
我现在一直试图让它通过CustomSD键上的注册表编辑工作.我尝试添加(A ;; 0x7 ;;; AU)为经过身份验证的用户提供完全访问权限,但似乎没有任何效果.
是否有一个事件日志源始终可供ASP.NET webapp写入?
背景故事,如果有人有一个看似无关的解决方案:
我们的ASP.NET webapp使用自己的事件日志源,但它没有创建它的权限.因此,如果webapp尝试写入条目时事件日志源不存在(安装说明指示管理员手动注册事件日志源,但......),我们的webapp不会放入任何内容有问题时的事件日志.
我希望有另一个(应用程序不可知)源我可以用来通知观看事件日志的人.
我正在使用WIX为我的应用程序创建一个安装程序.到目前为止一切正常.但是,我正在尝试在安装期间创建一个新的事件源,但这不会按预期工作.
我已经在这里阅读并理解了这个问题,但我有一个不同的情况,其中给定的解决方案似乎不能正常工作.以下是不同的做法:
WixNetFxExtension来确定.NET 3.5是否作为启动条件安装.WixUtilExtension到,因为它描述了用于32位/ 64位构建配置的东西在这里我想做的是:在进行32位安装时使用32位框架的事件消息文件,否则使用64位框架的事件消息文件.
上面链接的SO问题中的一条评论建议使用以下内容让系统使用32位框架的事件消息文件:
<util:EventSource
Log="Application"
Name="*source name*"
EventMessageFile="[NETFRAMEWORK20INSTALLROOTDIR]EventLogMessages.dll"/>
Run Code Online (Sandbox Code Playgroud)
我修改了这个来解释这两种类型的设置:
<?if $(var.Platform) = x64 ?>
<util:EventSource Log="..." Name="..." EventMessageFile="[NETFRAMEWORK20INSTALLROOTDIR64]EventLogMessages.dll" />
<?else ?>
<util:EventSource Log="..." Name="..." EventMessageFile="[NETFRAMEWORK20INSTALLROOTDIR]EventLogMessages.dll" />
<?endif ?>
Run Code Online (Sandbox Code Playgroud)
在文件的开头,相同的<?if ...条件工作,相应地改变产品和foldernames.
代码上面的一些代码我正在使用以下代码来允许.NET Framework检测:
<PropertyRef Id="NETFRAMEWORK35"/>
<PropertyRef Id="NETFRAMEWORK20"/>
<Condition Message="...">
<![CDATA[Installed OR NETFRAMEWORK35]]>
</Condition>
Run Code Online (Sandbox Code Playgroud)
当我运行安装程序时,一切似乎都有效,也创建了事件源,我也可以从我的应用程序中使用它,但是,我仍然得到未找到事件消息文件的信息.检查注册表我发现消息文件的路径丢失了:
EventMessageFile REG_EXPAND_SZ EventLogMessages.dll
Run Code Online (Sandbox Code Playgroud)
我期望32位/ 64位框架的路径也存在,但它似乎并没有被假定.
我在这做错了什么?
我基于这个例子创建了我的事件源.我的事件源看起来像这样:
[EventSource(Name = "Samples-EventSourceDemos-EventLog")]
public sealed class MinimalEventSource : EventSource
{
public static MinimalEventSource Log = new MinimalEventSource();
[Event(1, Message = "{0} -> {1}", Channel = EventChannel.Admin)]
public void Load(long baseAddress, string imageName)
{
WriteEvent(1, baseAddress, imageName);
}
}
Run Code Online (Sandbox Code Playgroud)
该示例使用代码来模拟安装/卸载过程.从其他一些SO问题中,我看到了另一个使用事件消息文件安装事件源的示例.
但它缺少一些很好的例子,说明如何安装/注册由清单定义的EventSource.我正在调查使用CustomAction做类似的事情:
wevtutil.exe im <EtwManifestManFile> /rf:"EtwManifestDllFile" /mf:"EtwManifestDllFile"
但是想知道你有什么建议吗?
在测试 log4net EventLogAppender 期间,我已经与 Windows 事件日志进行了长时间的斗争,其行为不一致,我意识到 log4net 代码有效,但我的 Windows 事件日志是不合理的。
系统
创建错误案例
我已经制作了完整的分步指南来重现问题:
1:在新日志中创建新源并写入
执行代码:
EventLog.CreateEventSource(source: "TestSource1", logName: "TestLog1");
EventLog myLog = new EventLog();
myLog.Source = "TestSource1";
myLog.WriteEntry("This is a message");
Run Code Online (Sandbox Code Playgroud)
使用 powershell 命令列出日志:
Get-EventLog -LogName *
Run Code Online (Sandbox Code Playgroud)
这将正确列出所有日志,包括包含 1 个日志条目的 TestLog1。我还可以使用以下 powershell 命令获取日志条目:
GetEventLog -LogName "TestLog1"
Run Code Online (Sandbox Code Playgroud)
这显示了日志中的单个日志消息。
2:使用powershell删除事件日志
Powershell命令:
Remove-EventLog -LogName "TestLog1"
Run Code Online (Sandbox Code Playgroud)
现在列出所有日志显示该日志实际上已被删除。再次使用 Powershell 命令: …
命令行EventCreate.exe工具在注册表中注册用户定义的事件源以供 Windows 事件日志查看器使用,如下所示:
eventcreate /t INFORMATION /ID 100 /L "Application" /SO [SourceName] /D "Description"
Run Code Online (Sandbox Code Playgroud)
我编写了一个应用程序,它有自己的事件日志资源字符串,并根据 MSDN注册为事件源,但它不使用该CustomSource值并且工作正常。
我在 MSDN 或网上其他地方找不到任何关于其CustomSource确切用途的文档。我的机器上的注册源都没有使用它。
有谁知道它的CustomSource用途是什么以及它是如何工作的?它只是 的内部内容EventCreate.exe,还是 Windows 事件日志实际上将其用于某些用途?
eventlog-source ×13
event-log ×11
c# ×4
wix ×4
wix3.5 ×3
.net ×2
clickonce ×2
powershell ×2
windows ×2
asp.net ×1
contingency ×1
fallback ×1
winapi ×1