2

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

当我使用命令行运行应用程序时,我查看了可用的包,并且能够成功地使用 node-windows 将日志写入 Windows 事件查看器。但是,当我使用 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 任务计划程序)时,它不再注销。

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

先感谢您!

4

1 回答 1

1

pkg 将 js 源文件和其他资产打包成一个 EXE,并使用虚拟文件系统在节点进程中公开它们。这适用于大多数事情,但如果需要在您的流程之外使用任何这些资产,则会中断。

对于它的大部分功能,node-windows 模块分发了它自己的一些可执行文件或使用 Windows 内置。它exec()是代表你的那些 EXE。

  • 对于模块分发的助手,EXE 必须存在于真实文件系统中才能使用exec()。pkg 很可能会破坏这一点;您需要自己分发这些 EXE 并将它们放在磁盘上。
  • 事件记录使用 builtin eventcreate,它应该可以工作,但也许 pkg 正在对虚拟文件系统做一些奇怪的事情,这会破坏child_process工作方式。

无论如何,我强烈建议不要使用 node-windows 进行日志记录,因为它exec()是每个日志调用的新子进程。这在 Windows 上是非常低效的:它必须生成一个 shell (cmd.exe),然后运行帮助程序 (eventcreate.exe),并且在 Windows 上创建进程很慢。痛苦的慢。

程序启动图

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

相反,请使用直接调用ReportEventAPI 的本机模块。 windows-eventlog符合这个要求。

您还需要考虑pkg 关于本机模块的注释

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

于 2019-04-09T00:53:33.697 回答