Logback - How to get ListAppender instance - logback

I'm using a logging client/server architecture with SocketAppender in the client, and SimpleSocketServer in the server.
I want to store all the logs in a Java List for later processing. I think I can use the ListAppender, which has a backing List collection.
I got the Console and Rolling appenders working, but I have no idea how to get the ListAppender instance so I can access the logs.
Client config file
<?xml version="1.0" encoding="UTF-8" ?>
<!-- ==================================================================== -->
<!-- SocketAppender configuration file. -->
<!-- ==================================================================== -->
<configuration>
<appender name="SOCKET" class="ch.qos.logback.classic.net.SocketAppender">
<RemoteHost>127.0.0.1</RemoteHost>
<Port>6000</Port>
<ReconnectionDelay>5000</ReconnectionDelay>
<IncludeCallerData>true</IncludeCallerData>
</appender>
<root level="debug">
<appender-ref ref="SOCKET" />
</root>
</configuration>
Server config file
<?xml version="1.0" encoding="UTF-8" ?>
<!-- ==================================================================== -->
<!-- This config file is intended to be used by a SocketServer that logs -->
<!-- events received from various clients on the console and to a file -->
<!-- that is rolled over when appropriate. The interesting point to note -->
<!-- is that it is a configuration file like any other. -->
<!-- ==================================================================== -->
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date %-5level [%thread] %logger - %message%n</Pattern>
</layout>
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>rolling.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>rolling.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>3</MaxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>8KB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%relative %-5level %logger - %message%n</Pattern>
</layout>
</appender>
<appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
<root>
<level value ="debug"/>
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLLING" />
</root>
</configuration>

In order to use ListAppender, I was missing to attach it to the root logger in the server xml file. Check the root tag in the server config file below.
<?xml version="1.0" encoding="UTF-8" ?>
<!-- ==================================================================== -->
<!-- This config file is intended to be used by a SocketServer that logs -->
<!-- events received from various clients on the console and to a file -->
<!-- that is rolled over when appropriate. The interesting point to note -->
<!-- is that it is a configuration file like any other. -->
<!-- ==================================================================== -->
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%date %-5level [%thread] %logger - %message%n</Pattern>
</layout>
</appender>
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>rolling.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>rolling.%i.log</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>3</MaxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>8KB</MaxFileSize>
</triggeringPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%relative %-5level %logger - %message%n</Pattern>
</layout>
</appender>
<appender name="LIST" class="ch.qos.logback.core.read.ListAppender"/>
<root>
<level value ="debug"/>
<!-- <appender-ref ref="CONSOLE" />-->
<!-- <appender-ref ref="ROLLING" />-->
<appender-ref ref="LIST" />
</root>
</configuration>
After that, it's trivial to get the list appender in Java:
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
import org.slf4j.LoggerFactory;
Logger rootLogger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
ListAppender<ILoggingEvent> listAppender = (ListAppender<ILoggingEvent>) rootLogger.getAppender("LIST");

Related

Logback - Different log file path base on the application profile

I am trying to use logback.xml for my project and for development i am using windows env and for deployment i am using unix env so i have created below xml file.
However when my application starts look like it's trying to validate the path specified. and it end up with below error.
how do i achieve this using logback?
java.lang.IllegalStateException: Logback configuration error detected:
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[UNIX_FILE] - Failed to create parent directories for [C:\as\Users\satishkn\apps\workspaceslogs\carats-api-2019-02-18.log]
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[UNIX_FILE] - openFile(null,true) call failed. java.io.FileNotFoundException: \as\Users\satishkn\apps\workspaceslogs\carats-api-2019-02-18.log (The system cannot find the path specified)
at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="windows_log_dir" value="./logs/" />
<property name="unix_log_dir" value="/as/Users/satishkn/apps/workspaceslogs/" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{dd-MM-yyyy HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger.%M - %msg%n
</pattern>
</encoder>
</appender>
<appender name="WIN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${windows_log_dir}carats-api-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M - %msg%n
</Pattern>
</encoder>
</appender>
<appender name="UNIX_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${unix_log_dir}carats-api-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M - %msg%n
</Pattern>
</encoder>
</appender>
<springProfile name="default">
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="WIN_FILE" />
</root>
</springProfile>
<!-- <springProfile name="dev">
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="UNIX_FILE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="info">
<appender-ref ref="UNIX_FILE" />
</root>
</springProfile> -->
</configuration>
Using your configuration both appenders will be instanciated in both unix and windows environnement. You should use conditional configuration to achive your requirements.
I suggest you define a log_dir param this way :
<if condition='property("os.name").contains("win")'>
<then>
<property name="log_dir" value="./logs/" />
</then>
<else>
<property name="log_dir" value="/as/Users/satishkn/apps/workspaceslogs/" />
</else>
</if>
Then create a single appender that uses the log_dir property.

Logback Configuration: Two appenders, logging based on package

I'm trying to configure logback so that certain packages are logged differently depending on the appender. I have a ConsoleAppender and a RollingFileAppender. I want TRACE level logging for the ConsoleAppender and I want only two packages logged to the RollingFileAppender. What ends up happening is my ConsoleAppender and RollingFileAppender behave exactly the same.
Here is my logback.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<property resource="logback.properties" />
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>.%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg %n</pattern>
</encoder>
</appender>
<appender name="dailyRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logback.dir}${logback.filename}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${logback.dir}${logback.filename}.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 90 days' worth of history -->
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="INFO">
<appender-ref ref="dailyRollingFileAppender" />
</logger>
<logger name="x.y" level="DEBUG">
<appender-ref ref="dailyRollingFileAppender" />
</logger>
<root>
<level value="TRACE" />
<appender-ref ref="consoleAppender" />
</root>
</configuration>

logback rollingpolicy dont work (no backup file is created)

I try to use logback for a project and want to have a classic daily rollover.
I cant make it work : all logs keep in the default file.
Either I badly understood the rolling policy, or it dont work corectly. In fact I thought that I I run for instance my tomcat one minute after the last log, the "current" log file is backed up in another file...
For test purpose I tried a "minutely" rollover. Someone see something horrible in my config ? :
<appender name="dailyRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>C:/myProject/programs/apache-tomcat-8.0.21-presentation/logs/presentation-log.log
</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<FileNamePattern>C:/myProject/programs/apache-tomcat-8.0.21-presentation/logs/presentation-log.%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 1 day history -->
<maxHistory>1</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n
</Pattern>
</encoder>
</appender>
Thanks!
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="dailyRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${catalina.base}/logs/presentation-log.log
</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<FileNamePattern>${catalina.base}/logs/presentation-log.%d{yyyy-MM-dd_HH-mm}.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n
</Pattern>
</encoder>
</appender>
<logger name="com.cloudsviews.presentation" additivity="false">
<level value="WARN" />
<appender-ref ref="dailyRollingFileAppender" />
</logger>
<root>
<level value="WARN" />
<appender-ref ref="STDOUT" />
<appender-ref ref="dailyRollingFileAppender" />
</root>
</configuration>

Logback is only logging to console, not working on file

I'm trying redirect all my logs to a file but it's not working. It only displays on console.
Here is my configuration:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
</layout>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/Users/Plac/Development/logs/detc.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/Users/Plac/Development/logs/detc.log_%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.detc.resources" level="INFO" />
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
What is wrong on my configuration?
Thank in advance.
Configuration looks fine. I would suggest two things:
Check the file permissions, and ownerships on /Users/Plac/Development/logs/detc.log, right up to the root.
Make sure that the logger is using the same config file. To be certain, delete/Move other instances of config file from other directories like bin.

How do I configure logback to gzip my logs automatically?

i am using logback in my java web appliaction. here's my "logback.xml" file.
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<property name="LOG_DIR" value="/home/ying/.jetty_logs/vehicle" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date [%thread] %-5level %logger{36}[%L] - %msg%n</pattern>
</encoder>
</appender>
<appender name="LAST" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/last.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>last.%d{yyyy-MM}.gz</fileNamePattern>
<maxHistory>24</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date:%msg%n</pattern>
</encoder>
</appender>
<logger name="org.springframework" level="WARN" />
<logger name="org.apache.shiro" level="WARN" />
<logger name="org.hibernate" level="WARN" />
<logger name="ying.car.interceptor.AutoLoginInterceptor" additivity="false" level="INFO">
<appender-ref ref="LAST" />
</logger>
<logger name="ying.car.controller.LoginController" additivity="false" level="INFO">
<appender-ref ref="LAST" />
</logger>
<logger name="ying.car.controller.LogoutController" additivity="false" level="INFO">
<appender-ref ref="LAST" />
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
today is june 1st 2013, all my old logs are overwrited and no *.gz created.
somebody help me, please.
Try to do like this, Hope it will work for you.
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOGDIR}/filename.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<FileNamePattern>${LOGDIR}/file.%d{yyyy-MM-dd}.%i.log.gz
</FileNamePattern>
<!-- keep 30 days' worth of history -->
<MaxHistory>30</MaxHistory>
<!-- or whenever the file size reaches 10MB -->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%date [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</encoder>
</appender>
The above code will compress your file on the day basis or If the log file size exceeds 10MB.
Note : I have added "%i" in filePattern, It will iterate your file name as file1,file2 etc.
Try adding <cleanHistoryOnStart>true</cleanHistoryOnStart> so that the rollover happens on next startup, as if it wasn't running at the time of rollover it wouldn't have happened.