Log4j:如何配置最简单的文件日志记录?

2022-08-31 14:33:49

我的故事:

我想做一个像最简单的log4j记录器一样简单的东西,它将行记录到文件中。我已经找到了几个具有某些功能的示例,但不是真正有效的基本通用示例,也没有解释每行如何工作的示例。

问题:

任何人都可以提供吗?

先决条件:

  • 我已经知道将文件放在哪里,并且我已经配置了log4j并用于控制台日志记录。
  • 现在我想登录到一个文件,并在程序运行后从文件系统中找到该文件。
  • 需要添加到现有文件的行是所需的输出。log4j.properties

答案 1

我有一个通用的log4j.xml文件给你:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">

    <appender name="default.console" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <appender name="default.file" class="org.apache.log4j.FileAppender">
        <param name="file" value="/log/mylogfile.log" />
        <param name="append" value="false" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <appender name="another.file" class="org.apache.log4j.FileAppender">
        <param name="file" value="/log/anotherlogfile.log" />
        <param name="append" value="false" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
        </layout>
    </appender>

    <logger name="com.yourcompany.SomeClass" additivity="false">
        <level value="debug" />
        <appender-ref ref="another.file" />
    </logger>

    <root>
        <priority value="info" />
        <appender-ref ref="default.console" />
        <appender-ref ref="default.file" />
    </root>
</log4j:configuration>

使用一个控制台、两个文件追加器和一个记录器,指向第二个文件追加器而不是第一个文件追加器。

编辑

在其中一个较旧的项目中,我发现了一个简单的log4j.properties文件:

# For the general syntax of property based configuration files see
# the documentation of org.apache.log4j.PropertyConfigurator.

# The root category uses two appenders: default.out and default.file.
# The first one gathers all log output, the latter only starting with 
# the priority INFO.
# The root priority is DEBUG, so that all classes can be logged unless 
# defined otherwise in more specific properties.
log4j.rootLogger=DEBUG, default.out, default.file

# System.out.println appender for all classes
log4j.appender.default.out=org.apache.log4j.ConsoleAppender
log4j.appender.default.out.threshold=DEBUG
log4j.appender.default.out.layout=org.apache.log4j.PatternLayout
log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n

log4j.appender.default.file=org.apache.log4j.FileAppender
log4j.appender.default.file.append=true
log4j.appender.default.file.file=/log/mylogfile.log
log4j.appender.default.file.threshold=INFO
log4j.appender.default.file.layout=org.apache.log4j.PatternLayout
log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n

有关所有布局参数的说明,请参阅此处:log4j PatternLayout 参数


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

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

   <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
      <param name="Threshold" value="INFO" />
      <param name="File" value="sample.log"/>
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p  [%c{1}] %m %n" />
      </layout>
   </appender>

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="fileAppender" /> 
  </root> 

</log4j:configuration>

Log4j可能有点令人困惑。因此,让我们尝试了解此文件中发生了什么:在log4j中,您有两个基本构造附加器和记录器。

追加器定义了追加内容的方式和位置。它会记录到文件、控制台、数据库等吗?在本例中,您指定的是使用布局标记中指定的模式将定向到 fileAppender 的日志语句放入文件中。您可以轻松地为控制台或数据库创建追加器。其中,控制台追加器将指定屏幕上的布局等内容,而数据库追加器将具有连接详细信息和表名称。sample.log

记录器在记录事件冒泡时响应这些事件。如果某个事件引起了特定记录器的兴趣,它将调用其附加的附加器。在下面的示例中,您只有一个记录器,即根记录器 - 默认情况下,它响应所有日志记录事件。除了根记录器之外,您还可以指定更具体的记录器来响应来自特定包的事件。这些记录器可以使用标记指定自己的追加器,或者以其他方式从根记录器继承追加器。使用更具体的记录器可以微调特定包上的日志记录级别,或将某些包定向到其他追加器。appender-ref

所以这个文件说的是:

  1. 创建一个记录到文件示例的文件应用程序.log
  2. 将该追加器附加到根记录器。
  3. 根记录器将响应至少与“调试”级别一样详细的任何事件
  4. 追加器配置为仅记录至少与“info”一样详细的事件

结果是,如果你的代码中有一个,它将被忽略。A 将输出到采样.log。logger.debug("blah blah")logger.info("Blah blah");

下面的代码片段可以使用log4j标签添加到上面的文件中。此记录器将从中继承追加器,但会将包中的所有日志记录事件限制为在级别或更高级别记录的事件。<root>org.springframeworkinfo

  <!-- Example Package level Logger -->
    <logger name="org.springframework">
        <level value="info"/>
    </logger>   

推荐