如何将org.slf4j.Logger日志输出到文件而非控制台?

13

我正在使用org.slf4j.Logger来记录输出,输出结果在控制台上显示。如何将日志记录到日志文件中呢?

 private static final Logger LOG = LoggerFactory.getLogger(ClassName.class );
 LOG.info("Logging output to console");

我没有使用log4j.properties文件,但我认为我需要一个。

我添加了以下log4j.properties文件,并将其放置在我的eclipse项目的不同部分。

 # Define the file appender
 log4j.appender.FileAppender=org.apache.log4j.RollingFileAppender
 log4j.appender.FileAppender.File=logger.log
 log4j.appender.FileAppender.layout = org.apache.log4j.PatternLayout
 log4j.appender.FileAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

 # Direct all messages there
 log4j.rootLogger = INFO, FileAppender

我甚至使用了HTML标签。
 PropertyConfigurator.configure("log4j.properties");

但是没有任何日志文件出现。看起来log4j.properties没有生效。


我认为你可以使用类似于log4j.properties文件或log4j.xml文件的东西。 - jos
如果你认为你需要这样一个文件,为什么不试着定义一个呢?(然后你可以启发我们所有人...) - Yaneeve
我已经添加了一个log4j.xml作为答案,它每天创建一个文件。 - jos
我创建了一个log4j.properties和一个log4j.xml文件,并将它们放置在项目的不同部分,但仍然将日志记录到控制台而不是日志文件中。 - user840930
@user840930,你解决了吗? - Suresh
2个回答

6

我认为最简单的方法是在log4j.properties文件中定义一个FileAppender

# Define the file appender
log4j.appender.FileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.FileAppender.File=[log filename].log
log4j.appender.FileAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.FileAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

# Direct all messages there
log4j.rootLogger = INFO, FileAppender

只需将[log filename]替换为相关的文件名即可。我认为如果文件在项目目录中,则Log4j可以自动定位文件,当您从Eclipse运行项目时。但我并不100%确定。您可以在应用程序启动时使用PropertyConfigurator告诉Log4j在哪里找到属性文件,例如:
PropertyConfigurator.configure("log4j.properties");

我创建了一个名为log4j.properties的文件。但是我应该把它放在哪里呢?我将它放在我的Eclipse项目的不同位置。但好像没有生成.log文件。 - user840930
我添加了更多细节。希望有所帮助。 - Chris Mantle
1
感谢提供额外的信息,但似乎并没有帮助到我。 - user840930

2
您可以在资源文件夹中创建一个log4j.xml文件。
步骤如下:
  1. 导入log4j包。
  2. 在类中实例化一个logger对象,使用Logger.getLogger()静态方法。
  3. 实例化布局(现成的或用户定义的),以分配给appender。
  4. 实例化appender,并通过将布局对象作为参数传递给构造函数来为其分配所需的布局。
  5. 通过调用其addAppender()方法并将所需的appender作为参数,将实例化后的appender分配给Logger对象。
  6. 在Logger对象上调用适当的打印方法,以执行日志记录。
<?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="%p [%t] %c{1}.%M(%L) | %m%n" />
        </layout>
    </appender>
    <appender name="FILE" class="org.apache.log4j.rolling.RollingFileAppender">
        <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
            <param name="fileNamePattern" value="/yourfolder/debug_%d{dd-MM-yy}.log" />

        </rollingPolicy>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%p [%t] %c{1}.%M(%L) | %m%n" />
        </layout>

    </appender>
    <root>
        <level value="WARN" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>
</log4j:configuration>

我认为我没有资源文件夹。 - user840930
请问您能提供项目的结构吗?如果这是一个Maven项目,那么您将会有一个src/main/resource文件夹,我实际上是指这个。您可以将它放在src文件夹的任何位置。 - jos
使用log4j.xml,因为属性文件无法提供一些高级配置选项,例如Filter、某些ErrorHandlers和少数高级Appenders。 - jos
这并没有解决问题。我创建了log4j.xml文件并将其放置在Eclipse项目的不同部分。我甚至将其复制到src文件夹中,但也没有帮助。我还没有使用Maven。 - user840930

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