Wildfly + Hibernate+ Log4J2 -> Not logging hibernate stuff - java

So I have a project where I'm using Wildfly 10 and Hibernate 5.2.9 and I'm trying to log the hibernate stuff, such as Queries and so on, using Log4J2, but for some reason it's not working
Log4J2 works when I log application stuff like log.info("SOMETHING")...
I post here my log42j.xml file
<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config">
<Appenders>
<Appender type="FILE" name="FF" fileName="C:/logs/logfile.log">
<Layout type="type" pattern="%-5p | %d{yyyy-MM-dd HH:mm:ss} | %C{2}
(%F:%L) - %m%n"
</Appender>
</Appenders>
<Loggers>
<Logger name="my.java.package" level="DEBUG">
<AppenderRef ref="FILE"></AppenderRef>
</Logger>
<Logger name="org.hibernate.type" level="TRACE">
<AppenderRef ref="FILE"></AppenderRef>
</Logger>
<Logger name="org.hibernate.SQL" level="TRACE">
<AppenderRef ref="FILE"></AppenderRef>
</Logger>
<Logger name="org.hibernate" level="TRACE">
<AppenderRef ref="FILE"></AppenderRef>
</Logger>
<Root level="ALL">
<AppenderRef ref="FILE"/>
</Root>
</Loggers>
</Configuration>
Any thoughts of how can I solve this?
Thanks!

Since Hibernate is a module provided by the server it uses the servers logging configuration, not the configuration supplied in your deployment.
Really you wouldn't want Hibernate using your log configuration anyway. If you had multiple deployments, each having their own logging configuration there is no guarantee which configuration would win when configuring the logging.

Related

Disable PDFBox logging with Springboot org.apache.commons.logging

I can't find a way to stop warnings from PDFBox I am using in a psring boot application. For example:
2019-10-01 16:53:51.021 WARN 24564 --- [nio-8443-exec-2] o.a.pdfbox.pdmodel.font.PDType0Font : No Unicode mapping for CID+4 (4) in font Calibri-Bold
2019-10-01 16:53:51.022 WARN 24564 --- [nio-8443-exec-2] o.a.pdfbox.pdmodel.font.PDCIDFontType2 : Failed to find a character mapping for 4 in Calibri-Bold
2019-10-01 16:53:51.022 WARN 24564 --- [nio-8443-exec-2] o.a.pdfbox.pdmodel.font.PDCIDFontType2 : Failed to find a character mapping for 4 in Calibri-Bold
I have tried:
In Application file:
static {
System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("org.apache.pdfbox").setLevel(java.util.logging.Level.OFF);
String[] loggers = {
"org.apache.pdfbox.util.PDFStreamEngine",
"org.apache.pdfbox.pdmodel.font.PDSimpleFont",
"org.apache.pdfbox.pdmodel.font.PDFont",
"org.apache.pdfbox.pdmodel.font.FontManager",
"org.apache.pdfbox.pdfparser.PDFObjectStreamParser",
"o.a.pdfbox.pdmodel.font.PDCIDFontType2",
"org.apache.pdfbox.pdmodel.font.PDCIDFontType2",
"o.a.pdfbox.pdmodel.font.PDType0Font",
"org.apache.pdfbox.pdmodel.font.PDType0Font",
"org.apache.pdfbox.pdmodel.font.PDType1Font"
};
for (String logger: loggers) {
org.apache.log4j.Logger logpdfengine = org.apache.log4j.Logger
.getLogger(logger);
logpdfengine.setLevel(org.apache.log4j.Level.OFF);
}
}
As parameter when running jar:
-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
-Dorg.slf4j.simpleLogger.defaultLogLevel=off
Within the PDFBox code, the log is set up using:
(import org.apache.commons.logging.LogFactory;)
private static final Log LOG = LogFactory.getLog(PDCIDFontType0.class);
LOG.warn("Found PFB but expected embedded CFF font " + fd.getFontName());
I've spent a long time trying a lot of things and trolled through the answers for similar questions in SO but not got anywhere.
This is the configuration file I ended up using. I didn't include any logging releated dependencies or add any exclusions to pdfbox dependency, just added this file to the folder containing the application.properties file.
Filename is logback-spring.xml
The flooding logger was copied from how to change log levels of 3rd party library in java
<property name="LOGS" value="./logs" />
<appender name="Console"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<appender name="RollingFile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS}/spring-boot-logger.log</file>
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily and when the file reaches 10 MegaBytes -->
<fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- LOG everything at INFO level -->
<root level="info">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
<!-- LOG "com.baeldung*" at TRACE level -->
<logger name="org.apache" level="ERROR" additivity="false">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</logger>
<logger name="flooding logger" level="ERROR" additivity="false">
<appender-ref ref="Console"/>
Here's what I have been using in the "old" log4j log4j.properties file (you should migrate to log4j2):
log4j.logger.org.springframework=WARN
log4j.logger.org.apache.pdfbox.pdmodel.font.PDCIDFontType2=FATAL
In the "new" log4j2.xml I have this (the appenders are named STDOUT and A1):
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://logging.apache.org/log4j/2.x/manual/configuration.html
https://logging.apache.org/log4j/2.x/manual/appenders.html
-->
<Configuration>
<Appenders>
....
....
</Appenders>
<Loggers>
<Logger name="org.springframework" level="warn" additivity="false">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="A1"/>
</Logger>
<Logger name="org.apache.pdfbox.pdmodel.font.PDCIDFontType2" level="fatal" additivity="false">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="A1"/>
</Logger>
<Root level="info">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="A1"/>
</Root>
</Loggers>
</Configuration>
I think this also should work for log4j2. I use this simple way of disabling logs from specific libraries in SpringBoot applications. You need just add it into the log4j2.xml file.
<Loggers>
<Root>
****** here is some AppenderRef *******
</Root>
<Logger name="o.a.pdfbox" level="off"/>
or
<Logger name="org.apache.pdfbox" level="off"/>
</Loggers>

How to separate logging by severity to different files using springboot and logback

Im trying to send different logs to different files using logback.
I have 2 appenders configured (Console, RollingFile) and i want all
INFO messages -> Console appender
TRACE messages -> RollingFile appender:
logback-spring.xml
<root level="error">
<appender-ref ref="RollingFile" />
<appender-ref ref="Console" />
</root>
<logger name="com.mypkg" level="trace" additivity="true">
<appender-ref ref="RollingFile" />
</logger>
<logger name="com.mypkg" level="info" additivity="true">
<appender-ref ref="Console" />
</logger>
The result of the above configuration has 2 problems :
all messages are duplicated (both appenders)
com.mypkg shows only INFO (not TRACE) ob both appenders
any idea what im doing wrong ? is there any default spring logback file the is somehow merged with this config in runtime (changing the additivity to false fix the duplication issue, but still no TRACE messages) ?
Thanks .
You can try logback filters. There is a filter called LevelFilter. The option to accept and ignore log level types is also available here.
Example :
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
More information is in the below logback documentation.
https://logback.qos.ch/manual/filters.html#levelFilter

Log4J different log level for each package in log4j2.xml

I have a java web app with log4j2.xml
I need to have a different level for each package
for example:
com.myexample.firstmodule.* this should be with INFO level
com.myexample.secondmodule.* this should be with TRACE level
I found some answers telling how to do that in .propreties file, but I couldn't understand how to do it with .xml
Anyone can help with that, please?
Thanks in advance
The log4j website contains detailed information about how to do this, but here's the basic example of an xml configuration they give:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.foo.Bar" level="trace">
<AppenderRef ref="Console"/>
</Logger>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
As you can see, the Loggers section can contain a Logger tag, in which you can define the level for any package you want.
Try this
<logger name="com.myexample.firstmodule" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE-AUDIT" />
</logger>
<logger name="com.myexample.secondmodule" level="TRACE" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE-AUDIT" />
</logger>
in my config STDOUT stands for console logger and FILE-AUDIT for file logger.

Log4j2 : RollingFile appender does not write logs into file

My log4j2.xml is as follows :
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Async name="ASYNC">
<AppenderRef ref="R"/>
</Async>
<RollingFile name="R" fileName="${sys:catalina.home}/logs/myServer.log" filePattern="${sys:catalina.home}/logs/myServer.log.%d{yyyy-MM-dd}">
<PatternLayout pattern="%d %-5p [%t] %C{2} - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.ps" level="WARN" additivity="false">
<AppenderRef ref="ASYNC"/>
</Logger>
<Root level="WARN">
<AppenderRef ref="ASYNC"/>
</Root>
</Loggers>
</Configuration>
This configuration only creates myServer.log file and does not roll file also does not write logs into it.
Log file is created with permissions :
ls -ltr my*
-rw-------. 1 root root 0 Feb 14 18:15 myServer.log
What I am doing wrong?
You should add reference to your Rolling file Appender to get logs written in your File.
<Root level="WARN">
<AppenderRef ref="ASYNC"/>
<AppenderRef ref="R"/>
</Root>
More information on configuring log4j2 can be found here
Add <AppenderRef ref="R"/> as well under <Root level="WARN"> tag and try again.

My log4j2 log file always have double output of each line

I have seen a lot of posts about duplicate entries on log using log4j2. The solution seems to be add the additivity attribute and set it to false, but it seems is not working for me.
Here's my log4j2.xml
<Configuration status="DEBUG">
<Appenders>
<Console name="Console" target="SYSTEM_OUT" additivity="false">
<PatternLayout pattern="%d{dd-MM-yyyy HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<File name="File" fileName="C:\Laguna\Logs\Laguna.log">
<PatternLayout pattern="%d{dd-MM-yyy HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="off">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
<Logger name="br.com.flutuante.laguna" level="trace" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Logger>
</Loggers>
</Configuration>
I'm having duplicate logs in both console and file logs.
I have tried add additivity="false" everywhere and even removed ROOT entry but can't get it right.
Can anyone help me?
Maybe i'm coding the class wrong?
I'm doing this to get the logger object...
static final org.apache.logging.log4j.Logger logger = LogManager.getLogger(Laguna.class.getName());
and using it like this...
logger.info("Arquivo de configuraĆ§Ć£o carregado");
It might be because you are missing a Root logger, try adding one with level="OFF" if you don't want any other logs.
Edit: Not sure if this is what you want, it should turn off all logging except the specified loggers:
<Logger name="br.com.flutuante.laguna" level="trace"/>
<Root level="off">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
or just change the level in Root to set a default logging level while setting the specified logger to trace

Categories