Showing posts with label logback. Show all posts
Showing posts with label logback. Show all posts

Tuesday, 1 March 2022

logback: gzip rolling log files automatically

File compression format can be specified via fileNamePattern property.

 

Example

<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
  <fileNamePattern>${LOG_FILES_HOME}/app-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>

  <maxFileSize>1MB</maxFileSize>
  <maxHistory>30</maxHistory>
  <totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>

 

Find the below working application.

 

Step 1: Create new maven project ‘logback-zip-log-files’.

 

Step 2: Update pom.xml with maven dependencies,

 

pom.xml

 

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sample.app</groupId>
  <artifactId>logback-zip-log-files</artifactId>
  <version>1</version>

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.10</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.2.10</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.36</version>
    </dependency>


  </dependencies>
</project>

 

Step 3: Create logback.xml file under src/main/resources folder.

 

logback.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
  <property name="LOG_FILES_HOME" value="/Users/Shared/logback" />

  <appender name="consoleAppender"
    class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <charset>UTF-8</charset>
      <Pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n
      </Pattern>
    </encoder>
  </appender>


  <appender name="FILE"
    class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_FILES_HOME}/app.log</file>

    <rollingPolicy
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <fileNamePattern>${LOG_FILES_HOME}/app-%d{yyyy-MM-dd}.%i.log.gz
      </fileNamePattern>

      <maxFileSize>1MB</maxFileSize>
      <maxHistory>30</maxHistory>
      <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>


    <encoder>
      <charset>UTF-8</charset>
      <pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n
      </pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="consoleAppender" />
    <appender-ref ref="FILE" />
  </root>
</configuration>

 

Step 4: Define HelloWorld class.

 

HelloWorld.java

 

package com.sample.app;

import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  private static Logger logger = LoggerFactory.getLogger(HelloWorld.class);

  private static void sleep(int noOfSeconds) {
    try {
      TimeUnit.SECONDS.sleep(noOfSeconds);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {

    while (true) {
      for (int i = 0; i < 10000; i++) {
        logger.trace("Trace message");
        logger.debug("Debug message");
        logger.info("Info message");
        logger.warn("Warning message");
        logger.error("Error message");
      }

      sleep(1);

    }

  }
}

 

Total project structure looks like below.


 


 

Run HelloWorld.java application.

 

You can observe that log files are compressed to .gz format in /Users/Shared/logback folder.

 

$ls -lart
total 2456
drwxrwxrwt  15 root     wheel      480 Feb 25 15:39 ..
-rw-r--r--   1 krishna  wheel     9193 Feb 25 15:45 app-2022-02-25.0.log.gz
-rw-r--r--   1 krishna  wheel     8201 Feb 25 15:45 app-2022-02-25.1.log.gz
-rw-r--r--   1 krishna  wheel     8058 Feb 25 15:45 app-2022-02-25.2.log.gz
drwxr-xr-x   7 krishna  wheel      224 Feb 25 15:45 .
-rw-r--r--   1 krishna  wheel  1215810 Feb 25 15:45 app.log

You can download the complete working application from below link.

https://github.com/harikrishna553/java-libs/tree/master/logback/logback-zip-log-files


Previous                                                 Next                                                 Home

Monday, 28 February 2022

logback: get the log files location programmatically

Below snippet prints the log files location programmatically.

LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();

// Print all the log files location
for (Logger logger : context.getLoggerList()) {
  Iterator<Appender<ILoggingEvent>> appendersIterator = ((ch.qos.logback.classic.Logger) logger)
      .iteratorForAppenders();

  while (appendersIterator.hasNext()) {
    Appender<ILoggingEvent> appender = appendersIterator.next();

    if (appender instanceof FileAppender) {
      FileAppender<?> fileAppender = (FileAppender<?>) appender;

      System.out.println(fileAppender.getFile());
    }
  }

}

 

Find the below working application.

 

Step 1: Create new maven project ‘logback-print-log-files-location’.

 

Step 2: Update pom.xml with maven dependencies.

 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sample.app</groupId>
  <artifactId>logback-print-log-files-location</artifactId>
  <version>1</version>

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.10</version>
    </dependency>

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>1.2.10</version>
    </dependency>

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.36</version>
    </dependency>


  </dependencies>
</project>

 

Step 3: Create logback.xml file under src/main/resources folder.

 

logback.xml

<configuration scan="true" scanPeriod="15 seconds">


  <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="FILE" class="ch.qos.logback.core.FileAppender">
    <file>/Users/Shared/logback/myApp.log</file>

    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n
      </pattern>
    </encoder>
  </appender>


  <logger name="com.sample.app" level="WARN">
    <appender-ref ref="FILE" />
  </logger>


  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

 

Step 4: Define HelloWorld class.

 

HelloWorld.java

package com.sample.app;

import java.util.Iterator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import ch.qos.logback.core.FileAppender;

public class HelloWorld {

  public static void main(String[] args) {
    LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();

    // Print all the log files location
    for (Logger logger : context.getLoggerList()) {
      Iterator<Appender<ILoggingEvent>> appendersIterator = ((ch.qos.logback.classic.Logger) logger)
          .iteratorForAppenders();

      while (appendersIterator.hasNext()) {
        Appender<ILoggingEvent> appender = appendersIterator.next();

        if (appender instanceof FileAppender) {
          FileAppender<?> fileAppender = (FileAppender<?>) appender;

          System.out.println(fileAppender.getFile());
        }
      }

    }

  }
}

 

Total project structure looks like below.




Run HelloWorld.java application, you will see below message in the console.

 

/Users/Shared/logback/myApp.log

 

You can download complete working application from below link.

https://github.com/harikrishna553/java-libs/tree/master/logback/logback-print-log-files-location

 

 


  

 

 

Previous                                                 Next                                                 Home

Logback: print log messages in pretty json format

Using ‘'ch.qos.logback.contrib.json.classic.JsonLayout' layout we can log messages in json format.

<appender name="STDOUT"
	class="ch.qos.logback.core.ConsoleAppender">
	<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
		<jsonFormatter
			class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
			<prettyPrint>true</prettyPrint>
		</jsonFormatter>
		<timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
		<appendLineSeparator>true</appendLineSeparator>
	</layout>
</appender>

 

I would recommend you, to not enable ‘prettyPrint’ in production to reduce space consumption.

 

Find the below working application.

 

Step 1: Create new maven project ‘logback-pretty-json’.

 

Step 2: Update pom.xml with maven dependencies.

 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.sample.app</groupId>
	<artifactId>logback-pretty-json</artifactId>
	<version>1</version>

	<properties>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.8</maven.compiler.target>
	</properties>

	<dependencies>

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.2.10</version>
		</dependency>


		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>1.2.10</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.36</version>
		</dependency>


		<dependency>
			<groupId>ch.qos.logback.contrib</groupId>
			<artifactId>logback-json-classic</artifactId>
			<version>0.1.5</version>
		</dependency>


		<dependency>
			<groupId>ch.qos.logback.contrib</groupId>
			<artifactId>logback-jackson</artifactId>
			<version>0.1.5</version>
		</dependency>


		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.13.1</version>
		</dependency>



	</dependencies>
</project>

 

Step 3: Create logback.xml file under src/main/resources folder.

 

logback.xml

<configuration scan="true" scanPeriod="200 seconds">

	<appender name="STDOUT"
		class="ch.qos.logback.core.ConsoleAppender">
		<layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
			<jsonFormatter
				class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
				<prettyPrint>true</prettyPrint>
			</jsonFormatter>
			<timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
			<appendLineSeparator>true</appendLineSeparator>
		</layout>
	</appender>


	<root level="INFO">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

 

Step 4: Define HelloWorld application class.

 

HelloWorld.java

 

package com.sample.app;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.qos.logback.core.joran.spi.JoranException;

public class HelloWorld {
	private static Logger logger = LoggerFactory.getLogger(HelloWorld.class);

	public static void main(String[] args) throws JoranException, IOException {

		logger.trace("Trace message");
		logger.debug("Debug message");
		logger.info("Info message");
		logger.warn("Warning message");
		logger.error("Error message");

	}
}

 

Total project structure looks like below.

 

 


Run HelloWorld application, you will see below messages in console.

{
  "timestamp" : "2022-02-25 12:43:50.799",
  "level" : "INFO",
  "thread" : "main",
  "logger" : "com.sample.app.HelloWorld",
  "message" : "Info message",
  "context" : "default"
}
{
  "timestamp" : "2022-02-25 12:43:50.813",
  "level" : "WARN",
  "thread" : "main",
  "logger" : "com.sample.app.HelloWorld",
  "message" : "Warning message",
  "context" : "default"
}
{
  "timestamp" : "2022-02-25 12:43:50.813",
  "level" : "ERROR",
  "thread" : "main",
  "logger" : "com.sample.app.HelloWorld",
  "message" : "Error message",
  "context" : "default"
}

 

You can download complete working application from below link.

https://github.com/harikrishna553/java-libs/tree/master/logback/logback-pretty-json

 

 

Previous                                                 Next                                                 Home