我开始使用java和log4j。我的测试程序需要帮助。
$pwd
/home/测试/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路径
$java -cp log4j_ log4j.jar路径:。Log4jTest
日志为Log4jTest
$ cat log_file
问题:
(1)是否需要指定控制台附加程序?什么会扎根?(3) level_value在根和记录器做什么?我原以为会看到:记录到记录器。好!
在log_file怎么了?
至少需要一个追加器。否则,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
不,如果您不使用控制台日志记录器,则不需要定义它。
在我看来,没有控制台记录器几乎总是一个坏主意;大多数ide期望默认的日志记录器到控制台,许多应用服务器也是如此。当然,这完全取决于你的需要。
一般来说,你会想要有一个每个类的记录器,它只是Logger.getLogger(Log4jTest.class)
。在配置文件中设置该记录器的阈值。
还要注意的是,你可以只在类路径上有一个log4j.xml
文件,配置将自动拾取,避免手动配置步骤。
最后,现在使用特定日志记录实现的"本机"接口相对不常见,更常见的是在实际实现中使用slf4j、logback或common_logger。不是说你不能,只是我不确定你应该。