将批处理文件的输出追加到日志文件中

51

我有一个批处理文件,它调用了一个Java程序。

输出被重定向到同一目录下的日志文件中。 然而,每次运行批处理文件时都会替换日志文件...

我希望将旧的输出保留在日志文件中,并始终将新的输出追加到日志文件中。


1
你如何将输出同时重定向到控制台和日志文件? - djangofan
4个回答

118

不要像这样使用">"进行重定向:

java Foo > log

使用 ">>" 将正常的 "stdout" 输出追加到一个新文件或现有文件中:

java Foo >> log

但是,如果你想要捕获 "stderr" 错误(例如 Java 程序无法启动的原因),你还应该使用 "2>&1" 标签,这会将 "stderr"(代表 "2")重定向到 "stdout"(代表 "1")。例如:

java Foo >> log 2>&1 

谢谢,">>" 工作了......还能告诉我应该在批处理文件中添加哪些行,以便每隔30分钟执行一次......并带有时间戳! - Monojeet Nayak
1
@Monojeet:你最好不要在批处理文件中这样做,而是使用任务计划程序。 - Jon Skeet
3
你所说的基本上是编写自己的脚本作为调度器... 这听起来对我来说不是一个好主意。我相信可以远程配置计划任务,这将是更好的选择。如果你真的想避免那样做,我建议你将调度放在一个“适当”的程序中(无论是Java、C#包装器或其他),而不是尝试在批处理文件中完成它。 - Jon Skeet
1
@Monojeet:当然,你可以使用“at”命令让你的批处理文件调用Windows任务计划程序。 - Jon Skeet
@John:好的,我会修改代码,只是想通过批处理文件学习它...非常感谢您的回复...我看到了您的个人资料...和您交流很荣幸...干杯! - Monojeet Nayak
显示剩余5条评论

4

这不是针对你最初的问题:“如何将批处理文件的输出附加到日志文件中?”的答案。

供参考,这是针对你后续问题的答案:“我应该在批处理文件中添加什么行来使它每30分钟执行一次?”

(但我会采纳Jon Skeet的建议:“你可能不应该在批处理文件内这样做 - 取而代之,使用任务计划程序。”)

Timeout:

示例(1秒钟):

TIMEOUT /T 1000 /NOBREAK

Sleep:

示例(1秒钟):

sleep -m 1000

替代方法:

这是你第二个后续问题的答案:“加上时间戳?”

在您的批处理文件中创建日期和时间戳

示例:

echo *** 日期:%DATE:/=-% 时间:%TIME::=-% *** >> output.log


0

你也可以使用java Foo | tee -a some.log。它会同时将输出打印到 stdout 和某个日志文件中,例如:

user at Computer in ~
$ echo "hi" | tee -a foo.txt
hi

user at Computer in ~
$ echo "hello" | tee -a foo.txt
hello

user at Computer in ~
$ cat foo.txt
hi
hello

0

在你的Java程序中使用log4j代替。这样你就可以输出到多个媒体,创建滚动日志等,并包括时间戳、类名和行号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接