2012-04-16 179 views
1

我正在使用nohup将java输出和错误追加到同一个日志文件。问题在于它会写入一个输出,然后它会覆盖日志文件中的错误并将输出擦除。Nohup追加输出和错误而不是覆盖

nohup命令是

nohup java Daemon 1000 >logs/wrapper.log 2>logs/wrapper.log & 

这是我想登录wrapper.log从Daemon.java

System.out.println("This is output that should go to the file"); 

System.err.println("This is error that should go to the file"); 

但只有最后一条消息被写入文件中的消息。最合理的答案是要知道如何追加wrapper.log的输出和错误,而不是覆盖

任何想法

感谢

回答

4

最轻便(和我的优选的方法)是:

cmd >>logs/wrapper.log 2>&1 & 

>>FD重定向与O_APPEND标志打开。大提琴的答案是一个bashism(和大多数kshs和zsh)一次重定向stdout和stderr,但不能解决在append模式下打开的问题。

参见:http://mywiki.wooledge.org/BashPitfalls#somecmd_2.3E.261_.3Elogfile和相关链接。

编辑:我看到这实际上并没有解决追加问题。我将编辑该页面。链接仍然相关。

+0

嗨,感谢您的回复。它似乎可行,但现在日志还包含nohup:忽略每次追加答案时都会污染日志的输出。还有一种方法,我可以把所有的控制台输出/错误/异常在Windows中运行一个Java程序时的日志文件。我知道我们可以在java中使用printstream来做到这一点,但有没有一个Windows控制台功能,它会记录下你刚刚显示的命令 – shujaat 2012-04-16 07:30:09

+1

通常,如果nohup的输出是终端,它会创建一个nohup.out文件来保存输出,但这不是这里的情况。如果Java程序输出的唯一目的是记录日志,那么让Java以必要的模式打开日志文件本身,然后用bash脚本来包装重定向可能会更好。不幸的是,我对Windows下I/O的工作原理知之甚少。 – ormaaj 2012-04-16 07:43:19

2

最有可能的,错误出覆盖标准输出,因为你们都写入同一个文件。 尝试类似: nohup java Daemon 1000 &> logs/wrapper.log &

&>作品上的一些贝壳(庆典在任何情况下,不能确定的tcsh/zsh的/ ...),所以尝试一下,或让我们知道哪些外壳所使用。

+0

感谢您的回答。我会在短时间内尝试。我还想知道,在运行java程序时,是否可以将Windows中的所有控制台输出/错误/异常都放到日志文件中。我知道我们可以在java中使用printstream来做到这点,但是有一个Windows控制台功能,它可以像nohup一样进行日志记录。 – shujaat 2012-04-16 07:21:45

+1

http://support.microsoft.com/kb/110930给出了几个关于如何在Windows上执行日志重定向的例子 – cello 2012-04-16 07:24:13