我编写了一个程序并使用日志工具(例如,Java的log4j
或Python的logging
)处理我的日志,因此我自己生成的所有日志都可以转到由日志记录工具管理的日志文件。
我还会在程序中调用命令或第三方程序,默认情况下会将所有输出写入控制台。如何将这些输出重定向到由日志记录工具管理的日志文件(如果可能,使它们符合日志记录格式)?
答案 0 :(得分:0)
在java中,您可以使用log4j中的IoBuilder来构建PrintStream。 IoBuilder包含在Apache的Log4j Streaming Interface中,是Log4J的补充。
拥有PrintStream后,您可以设置系统的默认PrintStream ...
IoBuilder builder = IoBuilder.forLogger(MyClass.class);
PrintStream myPrintStream = builder.buildPrintStream();
System.out = myPrintStream;
这样,如果其他库转到System.out.print()
或println()
,它将使用您的记录器格式通过记录器进行记录。
答案 1 :(得分:0)
要将外部进程的所有标准输出重定向到Python中的文件:
#!/usr/bin/env python
from subprocess import check_call, STDOUT
with open('log', 'ab', 0) as file:
check_call(['program', 'arg 1', 'arg 2'], stdout=file, stderr=STDOUT)
输出按原样重定向。为了使其符合日志记录格式,您可能需要它明确地通过您的程序:
#!/usr/bin/env python3
import logging
from subprocess import Popen, PIPE, STDOUT
logging.basicConfig(filename='log',level=logging.DEBUG)
with Popen(['program', 'arg 1', 'arg 2'], stdout=PIPE, stderr=STDOUT, bufsize=1,
universal_newlines=True) as process:
for line in process.stdout:
logging.debug('program output %s', line.rstrip('\n'))
代码使用locale.getpreferredencoding(False)
解码程序的标准输出,并使用logging
模块将行添加到日志文件中(您可以使用标准logging
工具配置您喜欢的任何日志记录格式)。