使用log4j logger未在日志文件中获取INFO日志

时间:2011-10-23 14:15:10

标签: java log4j

我开始使用java和log4j。我的测试程序需要帮助。

$pwd

/家/测试/ log4j的

$ls

Log4jTest.class Log4jTest.java log_file logger.xml run.sh

$cat Log4jTest.java 
  import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;

public class Log4jTest
{
public static void main(String args[])
{
Logger _log;
String loggerConfig = System.getenv ("logger_config");
 if (loggerConfig != null && !loggerConfig.trim ().equals (""))
  {   
    DOMConfigurator.configureAndWatch (loggerConfig);
  }   
else
{

System.out.println("no logger_config found");
    System.exit (-1);
}
 System.out.println("Logger is " + Log4jTest.class.getName ());
   _log = Logger.getLogger (Log4jTest.class.getName ());

 _log.info("logging to logger. Good!");
}
}

$ cat logger.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/log4j.dtd">

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

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out" />
            <param name="threshold" value="OFF" />
            <layout class="org.apache.log4j.PatternLayout">
                    <param name="ConversionPattern"
                            value="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+0} [%t] %-5p %c{1} - %m%n" />
            </layout>
    </appender>

    <appender name="log4j_test" class="org.apache.log4j.RollingFileAppender">
            <param name="File" value="/home/test/log4j/log_file" />
            <param name="append" value="true" />
            <layout class="org.apache.log4j.PatternLayout">
                    <param name="ConversionPattern"
                            value="%d{yyyy-MM-dd HH:mm:ss,SSS}{GMT+0} [%t] %-5p %c{1} - %m%n" />
            </layout>
    </appender>

    <logger name="Log4jTest"
            additivity="false">
            <level value="INFO" />
            <appender-ref ref="log4j_test" />
    </logger>

    <root>
            <level value="INFO" />
            <appender-ref ref="log4j_test" />
    </root>

$export logger_config=/home/test/log4j/log_file

$ javac -cp log4j__log4j.jar的路径Log4jTest.java

$ log -cp log4j__log4j.jar的路径: Log4jTest

记录器是Log4jTest

$ cat log_file

问题:

(1)是否需要指定控制台appender? (2)根源是什么? (3)root和logger中的level_value有什么作用? (4)我期待看到: 记录到记录器。好!

在log_file

出了什么问题?

2 个答案:

答案 0 :(得分:2)

至少需要一个appender。否则Log4J不知道在哪里打印您的日志消息。有各种appender:控制台,文件,JMS,JDBC。每个人都知道将消息发送到不同的目的地。

您无法在控制台上看到日志消息,因为控制台appender已关闭:

<param name="threshold" value="OFF" />

将OFF更改为INFO,我希望您能看到您的日志。

Log4J具有记录器的分层架构。层次结构中的每个层都可以阻止您的消息在appenders层上进行附加过滤。您可以在此处阅读更多内容:http://logging.apache.org/log4j/1.2/manual.html

但要注意:log4j被其创建者弃用。看看logback和slf4j。

答案 1 :(得分:1)

不,如果您不使用它,则无需定义控制台记录器。

IMO不过没有控制台记录器几乎总是一个坏主意;大多数IDE都希望默认记录器能够进入控制台,许多应用程序服务器也是如此。当然,完全取决于您的需求。

通常,您需要拥有每类记录器,这只是Logger.getLogger(Log4jTest.class)。在配置文件中设置该记录器的阈值。

另请注意,您可以在类路径上拥有log4j.xml文件,并自动选择配置,避免手动配置步骤。

最后,现在使用特定日志记录实现的“本机”接口相对不常见,在实际实现中使用slf4j,logback或commons-logger更为常见。不是说你不能,只是因为我不确定你应该