Not able to set different log level for my particular package - spring-boot

I expected to turn off logging for the package by setting level=OFF for my package.
However, I am not able to do it and logs are still added in the log file.
I have tried to
<!-- <logger name="org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider"
level="OFF"/> -->
<logger name="LOG-INFO" level="DEBUG">
<appender-ref ref="ASYNC-FILE" />
<appender-ref ref="ASYNC-DEBUG" />
<appender-ref ref="ASYNC-FILE" />
<appender-ref ref="ASYNC-FILE-ERROR" />
</logger>
<logger name="com.spicemoney.BulkMessaging.Controller"
level="OFF">
<appender-ref ref="ASYNC-FILE" />
<appender-ref ref="ASYNC-DEBUG" />
<appender-ref ref="ASYNC-FILE" />
<appender-ref ref="ASYNC-FILE-ERROR" />
</logger>
<root level="DEBUG">
</root>
Package is com.spicemoney.BulkMessaging.Controller.
But it is still in level INFO
Here is the screeshot of package structure

Related

Unable to log properly in log file

I am using Lombok annotations (#slf4j) to create logs.
I have been trying to log in different levels such as log.info("processing xyz")
Log.error, log.debug but I am unable to log these levels into the log file.
Below is the log4j.xml file, only the request coming from the "client(postman/swagger) is logged and not the other things.
None of the level is working nor the info, nor error nor debug.
What might be the possible issue?
<Configuration status="DEBUG">
<Appenders>
<Console name="LogToConsole" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] %-5level %c:%L - %msg%n"/>
</Console>
<RollingFile name="LogToFile"
fileName="/Users/subhamsharma/Desktop/atm_log.log"
filePattern="/Users/subhamsharma/Desktop/atm_log.%d{yyyy-MM-dd}.%i.log.gz">
<PatternLayout>
<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] %5level [%X{guid}] [%X{luid}] [%X{customId1}]
[%X{customId2}] [%c{3}:%L] - %m%n
</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<Async name="AsyncLogToFile" bufferSize="10000">
<AppenderRef ref="LogToFile"/>
<blocking>false</blocking>
</Async>
</Appenders>
<Loggers>
<Logger name="com.apnatuitionmaster" level="debug" additivity="false">
<AppenderRef ref="AsyncLogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Logger name="org.springframework" level="error" additivity="false">
<AppenderRef ref="AsyncLogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Logger name="org.apache" level="error" additivity="false">
<AppenderRef ref="AsyncLogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Logger name="org.hibernate" level="error" additivity="false">
<AppenderRef ref="AsyncLogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Logger name="springfox.documentation" level="error" additivity="false">
<AppenderRef ref="AsyncLogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Logger name="com.mchange" level="error" additivity="false">
<AppenderRef ref="AsyncLogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Logger name="org.elasticsearch" level="error" additivity="false">
<AppenderRef ref="AsyncLogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="error">
<AppenderRef ref="AsyncLogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
</Configuration>```

how to configure log4j with multiple profiles using one log4j.xml file

Logback has springProfile tag for configur with multiple spring profiles, but i cannot find how to do same thing in Log4j.
dev
<logger name="org" additivity="false">
<level value="INFO" />
<appender-ref ref="console" />
</logger>
real
<logger name="org" additivity="false">
<level value="INFO" />
<appender-ref ref="console" />
<appender-ref ref="async-appender"/>
</logger>

Spring boot logback can not logging to file on kubernetes multiple pods

similar when start application the multi pods on k8s (2 pods) It's can write logging file to that's pods, So when next day i'm try request to service for logging console can show normally but on logging file i'm found only one pod can write logging to file but another pods can not write logging to file.
Please help me to solve this point
This is my logback.xml file
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="FILE_LOG_PATTERN"
value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="LOG_LOCATION" value="logs" />
<property name="LOG_ARCHIVED_FOLDER" value="archived" />
<property name="LOG_FILE" value="my-log-app" />
<property name="maxFileSize" value="100MB" />
<property name="totalSizeCap" value="60GB" />
<property name="maxHistory" value="120" />
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<!-- To enable JMX Management -->
<jmxConfigurator/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE_ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_LOCATION}/${LOG_FILE}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_LOCATION}/${LOG_ARCHIVED_FOLDER}/${LOG_FILE}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- each archived file, size max 100MB -->
<maxFileSize>${maxFileSize}</maxFileSize>
<!-- total size of all archive files, if total size > 60GB, it will delete old archived file -->
<totalSizeCap>${totalSizeCap}</totalSizeCap>
<!-- 120 days to keep -->
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold> <!-- default 20, means drop lower event when has 20% capacity remaining -->
<appender-ref ref="CONSOLE" />
<queueSize>1</queueSize> <!-- default 256 -->
<includeCallerData>false</includeCallerData><!-- default false -->
<neverBlock>true</neverBlock><!-- default false, set to true to cause the Appender not block the application and just drop the messages -->
</appender>
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold> <!-- default 20, means drop lower event when has 20% capacity remaining -->
<appender-ref ref="FILE_ROLLING" />
<queueSize>1</queueSize> <!-- default 256 -->
<includeCallerData>false</includeCallerData><!-- default false -->
<neverBlock>false</neverBlock><!-- default false, set to true to cause the Appender not block the application and just drop the messages -->
</appender>
<springProfile name="dev">
<root level="INFO">
<appender-ref ref="ASYNC_CONSOLE" />
<appender-ref ref="ASYNC_FILE"/>
</root>
<root level="ERROR">
<appender-ref ref="ASYNC_CONSOLE" />
<appender-ref ref="ASYNC_FILE"/>
</root>
<logger name="com.example" level="TRACE" additivity="false">
<appender-ref ref="ASYNC_CONSOLE" />
<appender-ref ref="ASYNC_FILE"/>
</logger>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="ASYNC_CONSOLE" />
<appender-ref ref="ASYNC_FILE"/>
</root>
<root level="ERROR">
<appender-ref ref="ASYNC_CONSOLE" />
<appender-ref ref="ASYNC_FILE"/>
</root>
<logger name="com.example" level="TRACE" additivity="false">
<appender-ref ref="ASYNC_CONSOLE" />
<appender-ref ref="ASYNC_FILE"/>
</logger>
</springProfile>

logback spring turn off console logging based on spring profile

Here is my sample logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_FILE" value="some file path here"/>
<property name="LOG_FILE_MAX_SIZE" value="50MB" />
<property name="LOG_FILE_MAX_HISTORY" value="30" />
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<springProfile name="!test & !prod">
<logger name="com.myapp" level="DEBUG" />
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<springProfile name="test">
<logger name="com.myapp" level="DEBUG" />
<root level="WARN">
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="prod">
<logger name="com.myapp" level="INFO" />
<root level="WARN">
<appender-ref ref="FILE"/>
</root>
</springProfile>
My intent is to log contents only to FILE for test & prod profile, however for any other profile(i.e., localhost), I would want my logs to get only in CONSOLE.
With the above setting, if i start my spring boot app(version 2.1.1.RELEASE) with localhost profile, Its getting logged only in CONSOLE as expected, however if i use test or prod profile, it logs the content both in CONSOLE as well as FILE.
Do you see any problem in the logback xml ?
As far as I know Spring does not allow logical expressions in the profile selection. One can have just say !test but not a combination of such. So in your case the condition will trigger if test is not active or prod is not active which means for test active or prod active.
What you can do is to have an enumeration of other profiles for which you actually want to log to console. E. g. localhost.
Here is an example you can follow where you can choose for appender type for various environment like only to FILE for test & prod profile and only stdout or console for local environment.
<springProfile name="dev,test,local">
<property name="LOG_PATH" value="C:/<folder_name>/" />
</springProfile>
<!--if production environment is linux -->
<springProfile name="prod">
<property name="LOG_PATH" value="/opt/<folder_name>/" />
</springProfile>
<!-- make sure the pattern tag expression don't break in the middle-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- })
{magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan}
%clr(:){faint} %m%n%wEx</pattern>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}projectLog.%d{dd-MM-yyyy}.log
</fileNamePattern>
<!-- <maxHistory>30</maxHistory> -->
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
</appender>
<springProfile name="local">
<logger name="org.springframework" level="info" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</springProfile>
<springProfile name="test,dev,prod">
<logger name="org.springframework" level="error" additivity="false">
<appender-ref ref="file" />
</logger>
<root level="info">
<appender-ref ref="file" />
</root>
</springProfile>
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
<springProfile name="dev | staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active ,for SpringBoot 1.5.4 replace with [name="dev, staging"]-->
</springProfile>
<springProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
https://docs.spring.io/spring-boot/docs/2.1.8.RELEASE/reference/html/boot-features-logging.html

log4j configuration in Hibernate

I want to show sql queries executed by ihbernate in my logs.
This is my current log4j configuration:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="CA" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss,SSS} [%t] %-5p %c %x - %m%n" />
</layout>
</appender>
<root>
<level value="info" />
<appender-ref ref="CA" />
</root>
<logger name="org.hibernate.SQL" additivity="false">
<level value="debug" />
<appender-ref ref="CA" />
</logger>
<logger name="org.hibernate.hql" additivity="false">
<level value="debug" />
<appender-ref ref="CA" />
</logger>
<logger name="org.hibernate.stat" additivity="false">
<level value="trace" />
<appender-ref ref="CA" />
</logger>
</log4j:configuration>
But I am still getting nulls with org.hibernate.stat.internal.ConcurrentStatisticsImpl:
08-11-2016 09:54:39,318 [http-bio-8080-exec-8] DEBUG org.hibernate.stat.internal.ConcurrentStatisticsImpl - HHH000117: HQL: null, time: 1ms, rows: 4
How can I log full SQL instead of HQL: null?
To log the executed queries I added the following to my logj4-configuration:
<!-- log Hibernate SQL Statements without parameters -->
<logger name="org.hibernate.SQL" additivity="false">
<level value="DEBUG" />
<appender-ref ref="console" />
</logger>
<!-- add logging of parameters of the sql statements -->
<logger name="org.hibernate.type.descriptor.sql" additivity="false">
<level value="TRACE" />
<appender-ref ref="console" />
</logger>

Resources