我想使用log4jdbc-log4j2来记录JDBC调用。文档提供程序有关如何将其与Log4j2标记一起使用的信息。
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_OTHER" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="Console"/>
</logger>
有没有办法重写上面的代码以使用Logback?
UPDATE :我已经尝试将TurboFilter直接放在记录器外部的配置元素中。但它并没有改变日志输出。
<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
<Name>LOG4JDBC_LOGBACK_FILTER</Name>
<Marker>LOG4JDBC_OTHER</Marker>
<OnMatch>DENY</OnMatch>
</turboFilter>
答案 0 :(得分:0)
我相信你所寻找的东西在Logback中被称为TurboFilters。见http://logback.qos.ch/manual/filters.html
更新:如果我正确理解您的问题,您有一个使用Log4j 2 API(或其中一个依赖项)的应用程序。您希望使用Logback作为记录器实现。现在,问题是,如何将来自Log4j 2 API的调用路由到Logback实现,理想情况下将Log4j 2标记转换为SLF4J标记?
也许您需要做的就是添加Log4j to SLF4J adapter(log4j-to-slf4j-2.x.jar)。
小心:
使用SLF4J适配器(log4j-to-slf4j-2.x.jar)和 不应该尝试SLF4J桥(log4j-slf4j-impl-2.x.jar) 它会导致事件无休止地在SLF4J和Log4j 2之间路由。
答案 1 :(得分:0)
这在logback.xml中适用于我。这根本不使用标记,而是按照我的需要进行操作,即只过滤sql语句(带定时)。
<logger name="jdbc.sqlonly" level="error" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.sqltiming" level="info" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.audit" level="error" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.resultset" level="error" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.resultsettable" level="info" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
<logger name="jdbc.connection" level="error" additivity="false" ><appender-ref ref="CONSOLE"/></logger>
log4jdbc-log4j2 documentation中描述了这6个记录器。
答案 2 :(得分:0)
log4j2中的标记以这种方式工作:
package org.so.log4j2.test;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
public class Log4j2Test {
public static void main(String[] args)
{
Logger logger = LogManager.getLogger("Test");
Marker LOG4JDBC_OTHER = MarkerManager.getMarker("LOG4JDBC_OTHER");
logger.info("Line to show.");
logger.info(LOG4JDBC_OTHER, "Line to hide");
}
}
使用以下log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<MarkerFilter marker="LOG4JDBC_OTHER" onMatch="DENY" onMismatch="NEUTRAL"/>
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
<Logger name="Test" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
</Loggers>
</Configuration>
输出:
12:37:22.416 [main] INFO Test - Line to show.
Logback中的标记以这种方式工作:
package org.so.logback.test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
public class LogbackTest {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger("Test");
Marker LOG4JDBC_OTHER = MarkerFactory.getMarker("LOG4JDBC_OTHER");
logger.info("Line to show");
logger.info(LOG4JDBC_OTHER, "Line to hide");
}
}
使用此logback.xml
<?xml version="1.0" ?>
<configuration>
<property name="log.folder" value="./log"/>
<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
<Marker>LOG4JDBC_OTHER</Marker>
<OnMatch>DENY</OnMatch>
<OnMismatch>NEUTRAL</OnMismatch>
</turboFilter>
<appender class="ch.qos.logback.core.ConsoleAppender" name="CONSOLE">
<encoder>
<pattern>[%p] [%thread] %logger - %msg%n</pattern>
</encoder>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="CONSOLE"/>
</root>
<logger name="Test" additivity="false">
<level value="INFO" />
<appender-ref ref="CONSOLE"/>
</logger>
</configuration>
输出:
[INFO] [main] Test - Line to show
希望它有所帮助。
P.S。可能再次 additivity 标志?..
答案 3 :(得分:0)
我试图将log4jdbc.dump.sql.select=false
放在log4jdbc.log4j2.properties中,并过滤掉了select语句。您可以替换&#39;选择&#39;使用其他关键词,例如&#39;创建&#39;,&#39;更新&#39; ...
如果您希望对日志记录有更多控制权,可以扩展Slf4jSpyLogDelegator
,将log4jdbc.spylogdelegator.name
指向新类并根据需要覆盖方法。