将 Log4J INFO 发送到数据库,并将 DEBUG 发送到控制台



我有com.mycompany.library。*

我希望 DEBUG 转到控制台,INFO 转到数据库。 我怎样才能实现它?这是我的 log4j 的一部分.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false"
    xmlns:log4j="http://jakarta.apache.org/log4j/">
    <!-- APPENDERS LIST -->
    <!-- show log entries on console -->
    <appender name="ConsoleApp" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ISO8601} [%-5p][%-16.16t][%32.32c] - %m%n" />
        </layout>
    </appender>
    <appender name="DBAppender" class="org.apache.log4j.jdbc.JDBCAppender">
        <param name="URL" value="jdbc:postgresql://localhost:5432/myDB" />
        <param name="driver" value="org.postgresql.Driver" />
        <param name="user" value="postgres" />
        <param name="password" value="password" />
        <param name="sql"
            value="INSERT INTO logs(user_id, dated,logger,lev,message) VALUES('%t', '%d{yyyy-MM-dd HH:mm:ss}','%-50c{3}','%p','%m')" />
    </appender>
    <logger name="com.mycompany">
        <level value="INFO" />
        <appender-ref ref="DBAppender" />
    </logger>
    <logger name="com.mycompany.library">
        <level value="DEBUG" />
        <appender-ref ref="ConsoleApp" />
    </logger>
    <root>
        <priority value="ERROR" />
        <appender-ref ref="DBAppender" />
    </root>
</log4j:configuration>

使用此配置:信息和调试转到控制台。但是带有双重条目的 INFO 和 DUBUG 也会转到 DB。

我希望数据库去具有信息级别(及更高)的事件,而不是调试。怎么做?

您可以在追加器(而不是记录器)上设置主动保留。例如:

<appender name="std-out" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout">...</layout>
    <param name="Threshold" value="info"/>
</appender>

请参阅 http://wiki.apache.org/logging-log4j/LogByLevel

编辑:您也不必在com.mycompany记录器和根记录器上设置追加器。这就是为什么你有重复的条目,因为它们被视为加法的(所以在com.mycompany级别,你基本上有 2 个数据库追加器)。

只需在根目录上设置 DBAppender 并将其从com.mycompany记录器中删除即可。

最新更新