【问题标题】:Output Node.js logs to filesystem将 Node.js 日志输出到文件系统
【发布时间】:2017-11-06 21:22:36
【问题描述】:

我有一个 Splunk 转发器来管理我的生产服务器中的日志,所以我真的只需要将我的节点应用程序的输出放入一个 Splunk 正在监视的文件中。在生产中简单地执行以下操作有什么缺点:

node server.js &> output.log

与使用某种日志记录模块处理节点进程内的日志输出相反...

【问题讨论】:

    标签: node.js linux logging production splunk


    【解决方案1】:

    checkout supervisord 这是一个日志记录和保姆工具,它成为进程的父级,例如节点服务器,它可以处理将标准输出和标准错误重定向到您选择的文件......此外它会嗅探异常结束并抛出孩子需要时再处理

    这是一个典型的配置文件:/etc/supervisor/conf.d/supervisord.conf

    [supervisord]
    nodaemon=true
    logfile=GKE_MASTER_LOGDIR/supervisord_nodejs_GKE_FLAVOR_USER.log
    pidfile=GKE_MASTER_LOGDIR/supervisord_nodejs_GKE_FLAVOR_USER.pid
    stdout_logfile_maxbytes = 1MB
    stderr_logfile_maxbytes = 1MB
    logfile_backups = 50
    # loglevel = debug
    
    
    
    [program:nodejs]
    command=/tmp/boot_nodejs.sh %(ENV_MONGO_SERVICE_HOST)s   %(ENV_MONGO_SERVICE_PORT)s
    stdout_logfile = GKE_MASTER_LOGDIR/nodejs_GKE_FLAVOR_USER_stdout.log
    stderr_logfile = GKE_MASTER_LOGDIR/nodejs_GKE_FLAVOR_USER_stderr.log
    stdout_logfile_maxbytes = 1MB
    stderr_logfile_maxbytes = 1MB
    logfile_backups = 50
    autostart = True
    autorestart = True
    # user = GKE_NON_ROOT_USER
    

    在我的情况下,这一切都发生在 Docker 容器内,所以这里是我的 Dockerfile 的 sn-p,它启动 supervisord,然后启动 nodejs 并这样做将 stdout / err 重定向到基于空间和/或者时间...使用 Docker 与使用 supervisord 是正交的,所以 YMMV

    CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf" ]
    

    为了下面的完整性,我包含了上面引用的 boot_nodejs.sh

    #!/bin/bash
    
    given_mongo_service_host=$1
    given_mongo_service_port=$2
    
    current_dir=$(dirname "${BASH_SOURCE}")
    
    current_timestamp="timestamp "$(date '+%Y%m%d_%H%M%S_%Z')
    
    echo
    echo "______________  fresh nodejs server bounce  ______________  $current_timestamp"
    echo
    
    # ............... now output same to standard error so its log gets the hat tip
    
    (>&2 echo )
    (>&2 echo "______________  fresh nodejs server bounce  ______________  $current_timestamp" )
    (>&2 echo )
    
    
    # ................
    
    export MONGO_URL=mongodb://$given_mongo_service_host:$given_mongo_service_port
    
    type node
    
    node main.js
    

    【讨论】:

    • 我很欣赏它的完整性,并对你的回答投了赞成票,Scott。但是,我已经在处理 node.js 进程恢复部分并且对此没有真正的担忧。所以严格来说,从日志记录的角度来看,你认为像我上面描述的那样简单地重定向输出有什么缺点吗?
    • 您显示的内容也很好...确保您执行类似于重定向 stderr 的操作... command >> log_file 2>> err_file
    • 这样做只会忽略标准错误的捕获...您显示的内容仅记录标准输出...这两种输出方式中的每一种都有自己的文件句柄 1 和 2 ...请参阅此处的详细信息: stackoverflow.com/questions/7526971/…
    • 我理解,我可以将所有内容重定向到一个文件。我的印象是&>(强调&)会同时捕获标准输出和标准错误。在我的本地测试中,情况似乎如此。我错过了什么吗?我对系统管理员的了解有点有限,如果可以的话,请详细说明。
    • cmd >> file.log 2>&1 这将附加到来自 stdout 和 stderr 的文件输出的末尾...享受
    【解决方案2】:

    将输出重定向到日志文件没有问题。在很多方面,这是更可取的。

    当您的应用程序复杂且需要大量日志配置(可能写入多个日志文件)时,让您的应用程序直接写入日志会更有用。我所做的是使用 Winston 进行日志记录。通常启用的唯一日志传输是控制台,如果需要,我可以将其重定向到文件。但是,我的应用程序配置中也有一种方法来指定其他传输和配置。我用它直接写入 Logstash 等。

    【讨论】:

    • 感谢您的意见,非常感谢。撇开指定自定义传输和日志级别的能力不谈,您认为使用 Winston 优于本地控制台方法(即日志、错误、警告等)的实际优势是什么?
    • @m-a-r-c-e-l-i-n-o 独立的传输是 Winston 的主要优点。一般来说,它是一个很好的日志记录框架。它还包括格式化程序,默认情况下非常好。 (时间戳等默认情况下,但您也可以根据需要格式化日志记录。)
    • 明白了!再次感谢您的输入。具有体面的格式(例如时间戳)听起来确实很有吸引力,但仅使用 Winston 似乎有点过头了。如果 Splunk 缺乏事件和格式的协调,可能会扩展本机控制台方法以输出附加信息。
    • @m-a-r-c-e-l-i-n-o 是的,当然,不要添加任何你不需要的额外内容。另外,我不知道 Splunk 的日志摄取,但我通常将结构化数据记录为 JSON。这使以后的索引和搜索变得更加容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2013-04-15
    • 2011-11-29
    • 2014-04-10
    • 2015-01-03
    • 2017-02-11
    • 2014-04-22
    相关资源
    最近更新 更多