将 varnish 日志传输到 rotatelogs 的语法

将 varnish 日志传输到 rotatelogs 的语法

Ubuntu 12.04 服务器 x64,Varnish 3.0.2

我正在尝试通过 Apache 的 rotatelogs 传输 varnishncsa 的日志,并从 shell 运行,一切正常:

sudo varnishncsa -a -P /var/run/varnishncsa/varnishncsa.pid |/usr/sbin/rotatelogs /var/log/varnish/varnish.log.%Y%m%d%H 3600

在 /var/log/varnish 中创建一个新的日志文件,每小时(3600 秒)轮换一次。但是,我很难在 /etc/init.d/varnishncsa 中以同样的方式运行:

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/$NAME
PIDFILE=/var/run/$NAME/$NAME.pid
LOGFILE=/var/log/varnish/varnishncsa.log
USER=varnishlog

DAEMON_OPTS="-a -P ${PIDFILE}"
DAEMON_PIPE="|/usr/sbin/rotatelogs /var/log/varnish/varnish.log.%Y%m%d%H 3600"

...

start_varnishncsa() {
    output=$(/bin/tempfile -s.varnish)
    log_daemon_msg "Starting $DESC" "$NAME"
    create_pid_directory
    if start-stop-daemon --start --verbose --pidfile ${PIDFILE} \
        --chuid $USER --exec ${DAEMON} -- ${DAEMON_OPTS} \
        > ${output} 2>&1; then
        log_end_msg 0
    else
        log_end_msg 1
        cat $output
        exit 1
    fi
    rm $output
}

我应该把 DAEMON_PIPE 放在上面的代码中的什么位置?我尝试在以下位置:

if start-stop-daemon --start --verbose --pidfile ${PIDFILE}

这通常是附加命令行参数所在的位置,但它不会创建日志文件。

答案1

您可以按照下列方式修改 /etc/init.d/varnishncsa:

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/$NAME
PIDFILE=/var/run/$NAME/$NAME.pid
LOGFILE=/var/log/varnish/varnishncsa.log
USER=varnishlog
DAEMON_OPTS="-a -P $PIDFILE"

...

start_varnishncsa() {
    output=$(/bin/tempfile -s.varnish)
    log_daemon_msg "Starting $DESC" "$NAME"
    create_pid_directory
    if start-stop-daemon --start --quiet --pidfile ${PIDFILE} \
        --chuid $USER -b --exec /bin/bash \
        -- -c "${DAEMON} ${DAEMON_OPTS} \
               | /usr/sbin/rotatelogs /var/log/varnish/varnish.log.%Y%m%d%H 3600" \
        > ${output} 2>&1; then
    log_end_msg 0
    else
    log_end_msg 1
    cat $output
    exit 1
    fi
    rm $output
}

发生这种情况:start-stop-daemon 生成一个 bash,它执行 varnishlog 并将日志记录到 stdout 并通过 rotatelogs 管道输出。该-b参数允许 start-stop-daemon 将启动的进程分离到后台。缺点是,如果命令执行成功,start-stop-daemon 无法再检测。

相关内容