NodeJS-登录到Windows事件日志?

时间:2019-04-08 21:31:53

标签: javascript node.js node-windows

我正在尝试编写一个Node应用程序,该应用程序一旦部署,将记录到Windows事件日志中。

当我使用命令行运行应用程序时,我浏览了可用的软件包,并能够成功使用节点窗口将日志写入Windows Event Viewer。但是,当我使用pkg将应用程序转换为.exe文件并尝试运行.exe文件时,它不再登录到Windows事件日志中。

作为示例,我尝试编写如下基本应用程序:

const EventLogger = require('node-windows').EventLogger;

const log = new EventLogger('TestApp');

log.info('Test test test!', 1000)

如果我使用命令行(例如,节点index.js)运行此应用,则会将其记录到Windows事件查看器中。但是,当我运行pkg将项目转换为可执行文件并尝试运行可执行文件(作为实例并使用Windows Task Scheduler)时,它不再注销。

我已经检查确保.exe以管理员身份运行,所以我认为这不是权限问题。有人对为什么.exe可能未注销有任何想法吗?是否有其他NPM软件包/库提供登录Windows事件日志的功能?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

pkg将js源文件和其他资产打包到EXE中,并使用虚拟文件系统在节点进程中公开它们。这对于大多数情况都可以正常工作,但是如果需要在流程之外使用这些资产中的任何一项,则会中断。

对于大多数功能,node-windows模块分发一些自己的可执行文件或使用Windows内置函数。它会exec()代表您执行这些EXE。

  • 对于由模块分发的帮助程序,EXE必须存在于 real 文件系统中,以便exec()进行安装。 pkg很有可能打破了这一点;您需要分发这些EXE并将它们自己放置在磁盘上。
  • 事件记录使用内置的eventcreate应该可以使用,但是pkg可能会对虚拟文件系统做一些奇怪的事情,从而破坏了child_process的工作方式。

无论如何,我强烈建议您不要使用节点窗口进行日志记录,因为它exec()为每个日志调用提供了一个新的子进程。在Windows上这是高度效率低下的问题:它必须生成一个shell(cmd.exe),然后运行帮助程序(eventcreate.exe),并且在Windows上的进程创建很慢。非常痛苦。

Program launch graph

如果您开始记录足够的内容,您将很快通过流程簿记使整个系统瘫痪。

请使用直接调用ReportEvent API的本机模块。 windows-eventlog符合此要求。

您还需要考虑使用pkg's notes regarding native modules

  

支持使用本地插件(.node个文件),但尚未解析将.node个文件打包到可执行文件中的情况。您必须将项目使用的本机加载项部署到与可执行文件相同的目录中。