应用程序(例如 Node)在 Linux 下记录日志的适当方式是什么?Windows 有应用程序可以写入的事件日志。
我们是否应该为每个应用程序创建日志文件var/log
?
答案1
类 Unix 系统上的传统 API 是系统日志(3)。
openlog("myapp", 0, LOG_DAEMON); ... syslog(LOG_INFO, "Thing '%s' happened", thing->name);
使用 syslog() API 将会向当前安装的系统记录器发送消息,然后允许系统管理员过滤消息、应用轮换策略、转发到远程服务器等等。
相应的 Node 模块似乎是节点系统日志,但你可以通过向Unix套接字发送消息来手动实现它
/dev/log
。许多 Linux 发行版也有systemd 日志和它有自己的 API,允许附加元数据(例如,有关单个请求的所有消息都可以用元数据字段“MYAPP_REQUEST_ID=[...]”进行标记,然后稍后轻松查找)。
sd_journal_send("MESSAGE=Thing '%s' happened", thing->name, "PRIORITY=%i", LOG_INFO, NULL);
有一个名为systemd 日志提供对此 API 的访问。
一个简单的选项是将所有日志消息写入 stderr。理想情况下,它应该使用简单的格式,每行只有一条消息 - 没有颜色、没有时间戳、没有花哨的前缀/标记;服务管理器将添加自己的。在此模式下,您唯一应该添加的是 syslog 样式的优先级编号(例如 3 对应于 LOG_ERR):
<3>Something bad happened.
对于通用消息,不建议创建自己的文件,尤其是发明自己的日志格式;这会让系统管理员的工作变得更加困难。另一方面,它是当您要记录大量消息时,这样做是个好主意,否则系统日志将不堪重负。(例如,Apache 等 Web 服务器默认将每个请求记录到 /var/log/apache/access.log 文件中。)