如何让Log4j使用标准输出(stdout)?

8

我目前在某些代码中使用log4j进行调试。我一直在运行我的代码,使用java -jar test.jar | tee file.txt将日志记录到文件中,但现在我想要在仍在运行时切换日志记录的文件,这是tee无法做到的。目前我正在这样做

private static final Logger log = LoggerFactory.getLogger(Test.class);

public void main() {
File file = new File(/path/to/file);
System.setOut(new PrintStream(file));
System.out.println("hello world"); //This works.
log.info("hello world"); //this doesn't.

由于某些原因,日志记录器的输出没有进入我的文件,而是进入了控制台,但 println() 可以正常工作。有人知道为什么会出现这种情况以及如何解决吗?

谢谢。

编辑:这是我的 log4j.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <!--<param name="ConversionPattern" value="%d %-5p [%c] %m%n" />-->
            <param name="ConversionPattern" value="%d %-5p [%c:%L] %m%n" />
        </layout>
    </appender>
    <logger name="com.company">
        <level value="trace" />
    </logger>
    <logger name="org.springframework">
        <level value="debug" />
    </logger>
    <logger name="com.company.Selenium">
        <level value="debug" />
    </logger>    
    <logger name="org.springframework">
        <level value="warn" />
    </logger>
    <root>
        <priority value="warn" />
        <appender-ref ref="console" />
    </root>
</log4j:configuration>

当我运行我的项目时,我遇到了以下错误。
log4j:WARN No appenders could be found for logger (org.eclipse.jetty.util.log).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

ConsoleAppender 应该会有所帮助。 - Juned Ahsan
1
首先,您需要发布您的log4j属性。 - cowls
我的eclipse项目中没有log4j.properties文件,但我发布了我的log4j.xml。 - BombSite_A
你是否遇到了任何Log4J错误,表明它没有被正确初始化,例如:`log4j:WARN No appenders could be found for logger` - hfontanez
看看这个帖子,它应该能帮助你解决问题。 - hfontanez
我使用了其中一种解决方案。错误消失了,但仍然无法将日志记录到我的文件中。 - BombSite_A
3个回答

8

请将以下内容添加到你的log4j.properties文件中

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

4

这个例子来自于这个链接 在Java中使用Log4j进行调试。你可能会错过BasicConfigurator.configure();

public class Log4jTest {
  // Initialize logger for instance Log4jTest
  static Logger log  = Logger.getLogger(Log4jTest.class);

  public static void main (String[] args) {
     // Basic configurator to log debug messages to the console
     BasicConfigurator.configure();         
      
     // Add some log messages
     log.debug("This is a debug message");
     log.trace("This is a trace message");         
 }
}

谢谢。BasicConfigurator.configure() 对我有用。需要注意的是,您需要确保在调用System.setOut()之后才调用BasicConfiugrater.configure(),否则它将无法正常工作。 - BombSite_A
修复了上面的链接。 - MAD

1

文件log4j.propertieslog4j.xml必须位于默认包中。例如:

Default package

如果您使用Maven,则在“src/main/resources”中:

resources


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