如何将调用的命令/程序的输出重定向到log4j?

时间:2015-09-01 07:38:19

标签: java python linux logging

我编写了一个程序并使用日志工具(例如,Java的log4j或Python的logging)处理我的日志,因此我自己生成的所有日志都可以转到由日志记录工具管理的日志文件。

我还会在程序中调用命令或第三方程序,默认情况下会将所有输出写入控制台。如何将这些输出重定向到由日志记录工具管理的日志文件(如果可能,使它们符合日志记录格式)?

2 个答案:

答案 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工具配置您喜欢的任何日志记录格式)。