Log4j 未将 System.out 写入文件

发布于 2024-12-28 23:14:28 字数 1840 浏览 4 评论 0 原文

我在 Windows 2008 上使用 tomcat6 设置了 log4j。这些语句被记录到日志文件中,但 System.out 调用没有被记录。

当我从命令提示符运行 tomcat6.exe 时,System.out 调用会显示在提示符上,但不会记录在日志文件中。

我定义了 ConsoleAppenderFilelogger 如下:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

  <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true" threshold="debug">
      <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.SimpleLayout">
    </layout>
      </appender>

      <appender name="CATALINA" class="org.apache.log4j.appender.TimeAndSizeRollingAppender">
      <param name="File" value="${catalina.home}/logs/catalina.log"/>
              <param name="Threshold" value="DEBUG"/>
      <param name="Append" value="true"/>
      <param name="ImmediateFlush" value="true"/>   
      <param name="DatePattern" value=".yyyy-MM-dd"/>
      <param name="MaxFileSize" value="100MB"/> 
      <param name="MaxRollFileCount" value="100"/>
      <param name="ScavengeInterval" value="30000"/>
      <param name="BufferedIO" value="false"/>
      <param name="CompressionAlgorithm" value="ZIP"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{MMM dd, yyyy HH:mm:ss a} %c%n \r%p: %m%n"/>
    </layout>
    </appender>

<logger name="org.apache" additivity="false">
    <level value="INFO"/>
    <appender-ref ref="CATALINA" />
</logger>

    <root>
            <priority value="INFO"/>
    <appender-ref ref="CONSOLE"/>
    </root>

I have setup log4j with tomcat6 on Windows 2008. The statements are being logged to the log file, but System.out calls are not being logged.

When I run tomcat6.exe from command prompt, the System.out calls are displayed on the prompt, but the same is not logged in the log file.

I have defined a ConsoleAppender and Filelogger as follows:

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

  <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true" threshold="debug">
      <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.SimpleLayout">
    </layout>
      </appender>

      <appender name="CATALINA" class="org.apache.log4j.appender.TimeAndSizeRollingAppender">
      <param name="File" value="${catalina.home}/logs/catalina.log"/>
              <param name="Threshold" value="DEBUG"/>
      <param name="Append" value="true"/>
      <param name="ImmediateFlush" value="true"/>   
      <param name="DatePattern" value=".yyyy-MM-dd"/>
      <param name="MaxFileSize" value="100MB"/> 
      <param name="MaxRollFileCount" value="100"/>
      <param name="ScavengeInterval" value="30000"/>
      <param name="BufferedIO" value="false"/>
      <param name="CompressionAlgorithm" value="ZIP"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{MMM dd, yyyy HH:mm:ss a} %c%n \r%p: %m%n"/>
    </layout>
    </appender>

<logger name="org.apache" additivity="false">
    <level value="INFO"/>
    <appender-ref ref="CATALINA" />
</logger>

    <root>
            <priority value="INFO"/>
    <appender-ref ref="CONSOLE"/>
    </root>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

百变从容 2025-01-04 23:14:28

在上面的 log4j 配置中,您正在创建一个 ConsoleAppender 将所有消息记录到标准输出。这与 System.out.println() 调用的位置相同。现在,当您创建第二个 Appender (FileAppender )您不再写入标准输出,而是写入文件。

我建议更改您的 system.out.println() 调用以使用 Log4j 调用 [error()、info()、debug() 等..]

public class MyClass{
 private static Logger logger = Logger.getLogger(MyClass.class);

 public MyClass(){
    logger.debug("Hello World");
 }
}

通过这样做,您将不会将 log4j 与标准输出调用混合和匹配,然后可以根据需要在控制台之间配置您的应用程序和文件写入。通过 System.out 调用使用 Logger 的一个好处是它们可以在运行时进行配置,并且可以记录各个级别的消息。

根据注释进行编辑 默认情况下

,Tomcat 将标准输出消息记录到 %tomcat_home%/logs/catalina.out(根据 Tomcat 规范,名称可能略有不同) Tomcat 使用名为JULI 执行基本的日志记录操作。如果您只想将日志写入 tomcat 文件夹之外的其他位置,您可以通过编辑该文件来实现
%tomcat_home/conf/logging.properties

您可能想要解决的另一个场景是完全重定向标准输出。这是不被允许的,但也是可以做到的。如果您查看文件 catalina.bat(或 unix 中的 .sh),您将看到 LOGGING_MANAGER 的启动选项,它将覆盖默认的 JULI 实现。我从未使用过此选项,因此您需要更深入地研究它。要了解 JULI 更多信息,请阅读 Apache 的 Wiki 文章

In your above log4j configuration you are creating a ConsoleAppender which logs all your messages to standard out. Which is the same location as the System.out.println() calls. Now when you created the 2nd Appender (FileAppender) you are no longer writing to standard out, but now writing to file.

I would suggest changing your system.out.println() calls to use Log4j calls [error(), info(), debug() etc..]

public class MyClass{
 private static Logger logger = Logger.getLogger(MyClass.class);

 public MyClass(){
    logger.debug("Hello World");
 }
}

By doing this you wont be mixing and matching your log4j with your standard out calls and then can configure your application as needed between console and file writing. A good benefit to using a Logger over the System.out calls is that they are configurable at runtime and can log messages at various levels.

Edit as per comments

Tomcat by default logs the stdout messages to %tomcat_home%/logs/catalina.out (name may differ slightly per tomcat specs) Tomcat uses a logging framework called JULI to performs its basic logging operations. If you simply want the log to be written somewhere else then the tomcat folder, you can do that by editing the file
%tomcat_home/conf/logging.properties

Another scenario you may want to tackle is redirecting the stdout completely. This is frowned upon but can be done. If you look at the file catalina.bat (or .sh in unix) you will see the startup option of LOGGING_MANAGER which will override the default JULI implementation. I have never used this option so you would need to research it in more depth. To understand JULI more read Apache's Wiki article

夜还是长夜 2025-01-04 23:14:28

此页面给出了如何执行此操作的提示,但有点神秘。简而言之:

  • 打开 Tomcat 配置的 context.xml 文件。对于我来说,在 Eclipse 中进行开发,这是在我的 Eclipse 工作区中

\Workspace\Project\Servers\Server-name-config\config.xml

下还有一个全局的tomcat版本,值得一试

\tomcat\conf\context.xml

  • 将 SwallowOutput="true" 添加到上下文中,如下所示

    
    
  • (我认为是可选的)设置您的应用程序日志记录。我在我的应用程序中使用了 LogBack,但我不确定它是否相关,因为这通过内部 Tomcat 日志记录而不是您的应用程序日志记录

  • 在我的 tomcat.logging 属性中,我有以下日志配置行。这些行定义了我的 System.out 语句转到的日志文件,尽管其他人说它转到他们的 catalina.out 文件

    2localhost.org.apache.juli.FileHandler.level = 良好
    2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
    2localhost.org.apache.juli.FileHandler.prefix = 本地主机。
    
  • 现在,当您执行 System.out.println 时,它应该出现在您的 localhost.log 文件中正如我所说,有些人说它会进入 catalina.log

This page gives a hint about how to do this, but it's a little cryptic. In short:

  • Open the context.xml file for your tomcat config. For me, developing inside Eclipse, this is inside my Eclipse Workspace under

\Workspace\Project\Servers\Server-name-config\config.xml

There's also a global tomcat version under, which is worth a shot

\tomcat\conf\context.xml

  • Add swallowOutput="true" to the context as below

    <context swallowOutput="true">
    
  • (Optional I think) Set up your application logging. I've used LogBack in my application, but I'm not sure it's relevant as this goes through the internal Tomcat logging not your application logging

  • In my tomcat.logging property I have the following log configuration lines. These lines define the log file that my System.out statements go to, though other people have said it goes to their catalina.out file

    2localhost.org.apache.juli.FileHandler.level = FINE
    2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
    2localhost.org.apache.juli.FileHandler.prefix = localhost.
    
  • Now when you do a System.out.println it should appear in your localhost.log file as it does for me, though as I said some people have said it goes into catalina.log

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文