如何将Java日志消息保存到像Rails日志消息这样的文件中?

时间:2015-12-03 20:06:42

标签: java ruby-on-rails jruby

我使用JRuby并且有一个调用Java函数的Rake任务。此Rake任务使用ActiveSupport :: Logger记录消息。

log = ActiveSupport::Logger.new('log/my_log.log')
log.info 'A message for the ruby logger'

后来我调用了Java函数。

obj = JavaThing.new
results = obj.callJavaFunction

callJavaFunction()方法然后进行一些自己的记录。

public class JavaThing {
    private static final Logger log = Logger.getLogger('com.stuff.thing');

    public void callJavaFunction() {
       // do stuff
       log.info('A message for the Java logger');
    }
}

'红宝石记录器的消息输出到my_log.log。

'信息:当我运行Rake任务时,将向控制台输出Java记录器'的消息。

我无法修改Java代码。如何将来自Java函数的消息保存到文件中?

我尝试了rake my:task > java_log.log,但这只捕获了Rails生成的控制台输出。

我正在使用JRuby 1.7.16和Rails 4.1.4。

1 个答案:

答案 0 :(得分:0)

我不确定是否会对我的代码产生任何影响,因为涉及到Ruby(没有经验),但您可以尝试以下方法。请注意,我最初将其作为JUnit测试的一部分用于记录(使用@Before),因此您需要进行一些调整以适用于您的案例。

基本上,它正在做的是从控制台将日志记录定向到txt文件(在本例中为Logging.txt)。它仍将打印到控制台。

private final static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
public void loggerSetup() {     
    try {       
        fileTxt = new FileHandler("Logging.txt");       
    } catch (SecurityException | IOException e) {       
        logger.warning("Filehandler not functional");       
    }       
    logger.addHandler(fileTxt);     
    SimpleFormatter formatterTxt = new SimpleFormatter();       
    fileTxt.setFormatter(formatterTxt);     
}

如果你想删除控制台打印,可能会有类似下面的内容。然后,所有日志记录都将保存在文件中,因为控制台打印会被覆盖并发送到文件中。

Logger rootLogger = Logger.getLogger("");       
Handler[] handlers = rootLogger.getHandlers();      
if (handlers[0] instanceof ConsoleHandler) {        
    rootLogger.removeHandler(handlers[0]);      
}