使用nohup运行时,Java“java.util.logging.Logger”不起作用

时间:2014-08-20 06:46:08

标签: java linux ubuntu nohup java.util.logging

我创建了一个应该作为ubuntu服务运行的Java应用程序。我遵循了这篇文章:Running a Java program as a daemon in Ubuntu Linux 这是/etc/init.d/目录中的脚本:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Interactive:     true
# Short-Description: Start/stop myservice
### END INIT INFO

case $1 in
    status)
        if [ -f /opt/myservice/pid ]; then
            PID=$(cat /opt/myservice/pid);
            echo "myservice is running. PID="$PID
        else
            echo "myservice is not running."
        fi
    ;;
    start)
        if [ ! -f /opt/myservice/pid ]; then
            nohup java -jar /opt/myservice/billing_consumer.jar /opt/myservice 2>> /dev/null >> /dev/null &
            echo $! > /opt/myservice/pid
            echo "myservice started ..."
        else
            echo "myservice is already running ..."
        fi
    ;;
    stop)
        if [ -f /opt/myservice/pid ]; then
            PID=$(cat /opt/myservice/pid);
            kill $PID;
            echo "myservice stopped ..."
            rm /opt/myservice/pid
        else
            echo "myservice is not running ..."
        fi
    ;;
    restart)
        if [ -f /opt/myservice/pid ]; then
            PID=$(cat /opt/myservice/pid);
            echo "Stopping myservice ...";
            kill $PID;
            echo "myservice stopped ...";
            rm /opt/myservice/pid

            echo "Starting myservice ..."
            nohup java -jar /opt/myservice/billing_consumer.jar /opt/myservice 2>> /dev/null >> /dev/null &
            echo $! > /opt/myservice/pid
            echo "myservice started ..."
        else
            echo "myservice is not running ..."
        fi
    ;;
esac

此脚本似乎会关闭billing_consumer.jar标准输入并将输出重定向到/dev/null;其中,我在某处读到bitbucket用于将控制台的输出重定向到此处的输出。此外,除了使用这些输出的某些第三方组件外,我无法向stderrstdout发送任何内容。我自己使用java的构建日志API(java.util.logging.Logger)来记录信息。我使用java.util.logging.FileHandler作为记录输出的处理程序。但问题是,当我运行程序作为服务日志记录不起作用。但是当我手动运行程序时,我可以看到文件中写入的日志。这是我用于记录配置的logging.properties文件:

handlers = java.util.logging.FileHandler
config  = 

java.util.logging.FileHandler.level     = ALL
java.util.logging.FileHandler.filter    =
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.encoding  =
java.util.logging.FileHandler.limit     = 1048576
java.util.logging.FileHandler.count     = 20
java.util.logging.FileHandler.append    = true
java.util.logging.FileHandler.pattern   = logs/billing-log.%u.%g.log

...

我不认为这与/etc/init.d/myservice脚本有任何关系,因为我改变了它以将输出重定向到文件,我可以看到第三方组件'输出写在文件中。虽然,我不是写信给终端'输出。任何人都可以弄清楚这里有什么问题。我是否以错误的方式配置了日志记录?

1 个答案:

答案 0 :(得分:0)

在您的日志记录属性中,您使用的是relative path。当您将其作为服务运行时,当前/工作目录可能与手动运行时不同。 FileHandler将无法创建新的日志文件if the directory path doesn't exist。设置工作目录或将路径更改为绝对路径。

'config ='行看起来不对,因为没有值。

如果这不起作用,您应该修改脚本以将out / err流传输到文件以调试正在进行的操作。