"RFC5424 is not a valid syslog facility string" unable to configure RFC5424 syslog format in logback and sprinboot - spring-boot

I have configured syslog appender in my logback.xml
When I run my spring-boot application, I get the error "RFC5424 is not a valid syslog facility string"
below is my logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<property name="DEV_HOME" value="logs"></property>
<!--console appender-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss}] - %msg%n</pattern>
</encoder>
</appender>
<!--all logs-->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${DEV_HOME}/debug.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender>
<!--only controller class logs-->
<appender name="SPECIFIC_CLASS" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${DEV_HOME}/sizeTimeOutputlogFile.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%d{yyyy-MM-dd HH:mm:ss}] %p %c{1.} [%t]- %m%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${DEV_HOME}/archived/sizeTimeOutputlogFile.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!--Max Size of file to start Archive -->
<maxFileSize>10KB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- Days till log history to keep -->
<maxHistory>3</maxHistory>
</rollingPolicy>
</appender>
<!--syslog appender-->
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>127.0.0.1</syslogHost>
<facility>LOCAL0</facility>
<port>514</port>
<throwableExcluded>true</throwableExcluded>
<suffixPattern>%syslogStart{RFC5424}%n</suffixPattern>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root level="ERROR">
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
</root>
<!-- Specify the level specific to controller -->
<logger name="sysLogger" level="DEBUG" additivity="false">
<appender-ref ref="SYSLOG" />
</logger>
<logger name="com.syslogspringboot.syslog.poc" level="ERROR" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="SPECIFIC_CLASS" />
</logger>
with a different suffix pattern it works fine.
Can someone help

Related

Logback - Define many Appender/Pattern for a logger / log level [duplicate]

I am using logback/slf4j to do my logging. I want to parse my log file to analyze some data, so instead of parsing a great big file (mostly consisting of debug statements) I want to have two logger instances which each log to a separate file; one for analytics and one for all purpose logging. Does anyone know if this is possible with Logback, or any other logger for that matter?
It's very possible to do something like this in logback. Here's an example configuration:
<?xml version="1.0"?>
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logfile.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<appender name="ANALYTICS-FILE" class="ch.qos.logback.core.FileAppender">
<file>analytics.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<!-- additivity=false ensures analytics data only goes to the analytics log -->
<logger name="analytics" level="DEBUG" additivity="false">
<appender-ref ref="ANALYTICS-FILE"/>
</logger>
<root>
<appender-ref ref="FILE"/>
</root>
</configuration>
Then you'd setup two separate loggers, one for everything and one to log analytics data like so:
Logger analytics = LoggerFactory.getLogger("analytics");
You can have as many loggers as you wish. But, it's better you have one for each package that you need to log differently. Then all the classes in that package and its sub-packages will get the that specific logger. They all can share the root logger and send their log data to root logger appender using additivity="true". Here's an example:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="pattern" value="%date{HH:mm:ss.SSS} %-5p %logger{36}
%X{akkaSource} [%file:%line] - %m%n" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{HH:mm:ss.SSS} %-5p %logger{36} %X{akkaSource} [%file:%line] - %m%n</pattern>
</encoder>
</appender>
<appender name="abc" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${catalina.base}/logs/worker.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${catalina.base}/logs/worker-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
<maxHistory>360</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="xyz" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${catalina.base}/logs/transformer.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${catalina.base}/logs/transformer-%d{yyyy-MM-dd_HH}.log</fileNamePattern>
<maxHistory>360</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<logger name="com.xxx.yyy.zzz" level="INFO" additivity="true">
<appender-ref ref="xyz"/>
</logger>
<logger name="com.aaa.bbb.ccc" level="INFO" additivity="true">
<appender-ref ref="abc"/>
</logger>
<root>
<level value="INFO" />
<appender-ref ref="STDOUT" />
</root>
in my case I wanted to leave class names as log name
private static final Logger log = LoggerFactory.getLogger(ScheduledPost.class);
and as I had few such classes, so my logback.xml
<!--additivity=false ensures this log data only goes to the this log, and no one more -->
<logger name="xxx.xxx.xxx.ScheduledPost" level="DEBUG" additivity="false">
<appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.GcmPost" level="DEBUG" additivity="false">
<appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>
<logger name="xxx.xxx.xxx.PushUtils" level="DEBUG" additivity="false">
<appender-ref ref="ASYNC_SCHEDULE_LOG_FILE"/>
</logger>

slf4 logging day wise log from application.properties

I am using sl4j configuration in spring boots application.properties with single log file logging.log , how can i create a daily log file with name of the file as the current date.
logging.level.root= INFO
logging.level.org.springframework.web= ERROR
logging.file = logging.log
I found that the easiest solution is to make a logback.xml file in the resource folder.
And config the file like this:
<?xml version="1.0" encoding="UTF-8"?>
<property name="DEV_HOME" value="c:/logs" />
<appender name="FILE-AUDIT"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${DEV_HOME}/debug.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>
${DEV_HOME}/debug.%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<logger name="ar.com" level="debug" additivity="false">
<appender-ref ref="FILE-AUDIT" />
</logger>
<root level="error">
<appender-ref ref="FILE-AUDIT" />
</root>
I found this information in:
https://www.mkyong.com/spring-boot/spring-boot-slf4j-logging-example/

How to separate log output on method level (use different log files within one class)

I am trying to log in to two different logger from a class.I have a class and defined two methods and trying to log messages from one method to a one log file and from another method in to different log file.
Here is my code:
private static final Logger logger = LoggerFactory.getLogger(SummaryService.class);
public void empSalInfo(){
logger.info("employee info.."); // this should log into SalaryLogAppender
}
public void empDeptInfo(){
logger.info("dept info"); // this should log into DeptLogAppender
}
Here is my logback-spring file:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS_HOME" value="${LOG_PATH}"/>
<!-- standard encoder pattern-->
<property name="LOG_PATTERN" value="%d{MM/dd/yy HH:mm:ss.SSS} %-5p %t %C{0}:%L - %m%n" />
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>${LOG_PATTERN}</Pattern>
</layout>
</appender>
<property name="EMPLOYEE_LOG_FILE" value="${LOGS_HOME}/employee.log"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${EMPLOYEE_LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${EMPLOYEE_LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>14</maxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<property name="EMPLOYEE_SALARY_LOG_FILE" value="${LOGS_HOME}/emp_sal.log"/>
<appender name="SalaryLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${EMPLOYEE_SALARY_LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${EMPLOYEE_SALARY_LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>14</maxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<property name="EMPLOYEE_DEPT_LOG_FILE" value="${LOGS_HOME}/emp_sal.log"/>
<appender name="DeptLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${EMPLOYEE_DEPT_LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${EMPLOYEE_DEPT_LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern>
<maxHistory>14</maxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<logger name="com.nbt.apps.employeeInfo" level="info" additivity="false">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</logger>
<logger name="com.garmin.gh.apps.wellnessmonitor.service.EmployeeService" level="info" additivity="false">
<appender-ref ref="DeptLogAppender" />
<appender-ref ref="SalaryLogAppender"/>
</logger>
<root level="INFO">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
How to log from one class to two different log files based on methods?
If you want to write into different logfiles, at first you need different (file-)appenders to enable separating the outputs.
This is a simple logback-spring.xml which would provide multiple appenders and related loggers:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="application.log"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="FILE" />
</root>
<appender name="oneAppender" class="ch.qos.logback.core.FileAppender">
<file>one.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="anotherAppender" class="ch.qos.logback.core.FileAppender">
<file>another.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<logger name="oneLogger" level="ALL" additivity="false">
<appender-ref ref="oneAppender" />
</logger>
<logger name="anotherLogger" level="ALL" additivity="false">
<appender-ref ref="anotherAppender" />
</logger>
</configuration>
The (default) root logger forwards all common application messages into a common "application.log", e.g. application startup messages and so on.
Then, there are two explicit file appenders (oneAppender & anotherAppender) bound to different files (one.log & another.log).
At least two loggers (oneLogger & anotherLogger) bound to this appenders which can be referenced by their names to pipe the certain messages to the different logfiles.
With that configuration you can now implement your logging, the most simple way would be to create two separate Logger instances like that directly inside your business layer:
final Logger oneLogger = LoggerFactory.getLogger("oneLogger");
final Logger anotherLogger = LoggerFactory.getLogger("anotherLogger");
public void empSalInfo(){
oneLogger.info("employee info.."); // this should log into SalaryLogAppender
}
public void empDeptInfo(){
anotherLogger.info("dept info"); // this should log into DeptLogAppender
}
But since that would be some kind of verbose and error-prone, maybe think about intercepting your business code (in case it's managed by Spring) with Spring AOP to keep it clean of logging concerns.

Spring Boot logback.xml file has stopped standard logging

I have a Spring Boot application which was logging all output to the console by default. In my project I have a need where a number of classes are required to log their output to separate log files to make logging and debugging issues easier. To do this I've created the following logback.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS_HOME" value="/tmp/sflogs/" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
<appender name="TUMBLR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_HOME}tumblr.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOGS_HOME}tumblr.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<appender name="SCHEDULER_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_HOME}scheduler.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} %-5level - %msg%n
</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>${LOGS_HOME}scheduler.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<logger name="com.supafanz.controllers.TaskController" level="info" additivity="false">
<appender-ref ref="SCHEDULER_FILE" />
</logger>
<logger name="com.supafanz.parsers.TumblrParser" level="info" additivity="false">
<appender-ref ref="TUMBLR_FILE" />
</logger>
</configuration>
This works fine and the additional log files are being created, however in applying this Spring Boot no longer outputs it's usual output to the console.
Would someone be able to confirm how I go about re-instating the standard console logs using the logback.xml file?
You need to run somewhere "STDOUT" like you run "SCHEDULER_FILE" or "TUMBLR_FILE":
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
</Pattern>
</layout>
</appender>
You can use root level:
<root>
<appender-ref ref="STDOUT" />
</root>
Or append to "SCHEDULER_FILE" or "TUMBLR_FILE":
<logger name="com.supafanz.controllers.TaskController" level="info" additivity="false">
<appender-ref ref="SCHEDULER_FILE" />
<appender-ref ref="STDOUT" />
</logger>
<logger name="com.supafanz.parsers.TumblrParser" level="info" additivity="false">
<appender-ref ref="TUMBLR_FILE" />
<appender-ref ref="STDOUT" />
</logger>

Actuator /logfile endpoint no longer works with external logback configuration

I needed my logs to be rolling, so I have created a "logback-spring.xml" file and placed it src/main/resources. Works flawlessly.
The issue is that the actuator endpoint "/logfile" no longer works as I have removed the logging configuration from the "applications.yml" file.
According to documentation, either "logging.path" or "logging.file" needs to be set in order to make the "/logfile" endpoint work. This however seem to conflict with my new 'xml configuration.
Here is my logback-spring.xml configuration for good measure:
<configuration debug="true" scan="true">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<property name="LOG_PATH" value="logs"/>
<property name="LOG_ARCHIVE" value="${LOG_PATH}/archive"/>
<appender name="RollingFile-Appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_ARCHIVE}/bookingflow-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d %-5level [%thread] %logger : %msg%n</pattern>
</encoder>
</appender>
<appender name="Async-Appender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="RollingFile-Appender"/>
</appender>
<logger name="com.novasol.bookingflow.api" level="debug">
<appender-ref ref="Async-Appender"/>
</logger>
<springProfile name="production">
<logger name="com.novasol.bookingflow.api" level="error">
<appender-ref ref="Async-Appender"/>
</logger>
</springProfile>
</configuration>
Any pointers appreciated.
Kind regards
Lars
Solved it in the following manner:
In application.yml
logging:
config:
classpath: "logback-spring.xml"
file: logs/bookingflow.log
The "logback-spring.xml":
<configuration debug="true" scan="true">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<property name="LOG_ARCHIVE" value="${LOG_PATH}/archive"/>
<appender name="RollingFile-Appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_ARCHIVE}/bookingflow-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d %-5level [%thread] %logger : %msg%n</pattern>
</encoder>
</appender>
<appender name="Async-Appender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="RollingFile-Appender"/>
</appender>
<logger name="com.novasol.bookingflow.api" level="debug">
<appender-ref ref="Async-Appender"/>
</logger>
<springProfile name="production">
<logger name="com.novasol.bookingflow.api" level="error">
<appender-ref ref="Async-Appender"/>
</logger>
</springProfile>
Finally found the solution:
The following needs to be specified
endpoints:
logfile:
external-file: logs/custom.log

Resources