code4kix
code4kix

Reputation: 4187

Logback Not Sending Email (for Level less than ERROR)

I am using slf4j and logback for logging in my java web application. I need the info logs from a specific class (MyClass in the example below) to be sent in an email. I configured an email appender in logback. The rest of it can go wherever the root logger is set to. But the email doesn't go out with my current set up. See below...

Set Up:

Here's the relevant information about jar versions and other setup for this:

jars in the classpath:

activation-1.1.jar
jcl-over-slf4j-1.7.25.jar
logback-classic-1.2.3.jar
logback-core-1.2.3.jar
logback-ext-spring-0.1.4.jar
logstash-logback-encoder-4.11.jar
mail-1.4.jar
slf4j-api-1.7.25.jar

logback.xml from classpath:

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d [%thread] %-5level %logger{5}:%L - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="email" class="ch.qos.logback.classic.net.SMTPAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>

        <smtpHost>smtp.server</smtpHost>
        <to>[email protected]</to>
        <from>[email protected]</from>
        <subject>code4kix - ${HOSTNAME}: %logger{20} - %m</subject>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d [%thread] %-5level %logger{5}:%L - %msg%n</pattern>
        </layout>
<!--        <STARTTLS>true</STARTTLS> -->
<!--        <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker"> -->
<!--            <bufferSize>1</bufferSize> -->
<!--        </cyclicBufferTracker> -->
<!--        <asynchronousSending>false</asynchronousSending> -->
    </appender>

    <root level="error">
        <appender-ref ref="console" />
    </root>

    <logger name="mypackage.MyClass" level="info" additivity="true">
      <appender-ref ref="email"/>
    </logger>

The Issue:

The email seems to go out fine if I have logger.error statements in MyClass.java, but if they have just logger.info, the email doesn't go out... despite configuring the threshold to info!

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

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

    public void myMethod()
    {
        logger.error("using this sends the email out");
        logger.info("using this doesn't");
    }
}

I do get this in the console log, but the email never goes out. What could possibly be wrong?

SystemOut     O 13:18:00,012 |-INFO in ch.qos.logback.classic.net.SMTPAppender[email] - SMTPAppender [email] is tracking [1] buffers

Upvotes: 2

Views: 1535

Answers (2)

code4kix
code4kix

Reputation: 4187

Thanks to Elijah for pointing me in the right direction. As mentioned in the documentation in SMTP Appender:

by default, the email transmission is triggered by a logging event of level ERROR

There are multiple ways to solve this. The simplest way for me was to implement my own EventEvaluator like so, and use it in the smtp appender config (shown further below). Alternatively, you can explore using Markers to solve this issue.

public class OnInfoEvaluator extends EventEvaluatorBase<ILoggingEvent> {

    @Override
    public boolean evaluate(ILoggingEvent loggingEvent) throws NullPointerException, EvaluationException {
        if(loggingEvent.getLevel().toInt() >= Level.INFO_INT)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

In the config:

<appender name="email" class="ch.qos.logback.classic.net.SMTPAppender">
    <evaluator class="mypackage.OnInfoEvaluator" />
    ...
</appender>

Upvotes: 0

edjm
edjm

Reputation: 5472

From my recent reading of the logback it sounds as though only under ERROR will an email be sent out. Chapter 4: Appenders

Upvotes: 2

Related Questions