Skip to content

Commit 23018fa

Browse files
committed
Merge remote-tracking branch 'central/master'
2 parents e5cff86 + ccba3de commit 23018fa

File tree

53 files changed

+1526
-47
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+1526
-47
lines changed

guest/logback-example/pom.xml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
<groupId>com.stackify</groupId>
5+
<artifactId>logback-example</artifactId>
6+
<version>0.0.1-SNAPSHOT</version>
7+
8+
<dependencies>
9+
<dependency>
10+
<groupId>ch.qos.logback</groupId>
11+
<artifactId>logback-classic</artifactId>
12+
<version>1.2.3</version>
13+
</dependency>
14+
15+
<dependency>
16+
<groupId>junit</groupId>
17+
<artifactId>junit</artifactId>
18+
<version>4.12</version>
19+
</dependency>
20+
21+
<dependency>
22+
<groupId>org.codehaus.janino</groupId>
23+
<artifactId>janino</artifactId>
24+
<version>3.0.7</version>
25+
</dependency>
26+
27+
</dependencies>
28+
29+
<build>
30+
<plugins>
31+
<plugin>
32+
<artifactId>maven-compiler-plugin</artifactId>
33+
<version>3.5</version>
34+
<configuration>
35+
<source>1.8</source>
36+
<target>1.8</target>
37+
</configuration>
38+
</plugin>
39+
</plugins>
40+
</build>
41+
</project>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.stackify.logging;
2+
3+
import org.slf4j.Marker;
4+
5+
import ch.qos.logback.classic.Level;
6+
import ch.qos.logback.classic.Logger;
7+
import ch.qos.logback.classic.turbo.TurboFilter;
8+
import ch.qos.logback.core.spi.FilterReply;
9+
10+
public class IgnoreLoggerFilter extends TurboFilter {
11+
12+
private String loggerName;
13+
14+
@Override
15+
public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
16+
if (loggerName == null) {
17+
return FilterReply.NEUTRAL;
18+
} else if (loggerName.equals(logger.getName())) {
19+
return FilterReply.DENY;
20+
} else
21+
return FilterReply.NEUTRAL;
22+
}
23+
24+
public void setLoggerName(String loggerName) {
25+
this.loggerName = loggerName;
26+
}
27+
28+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.stackify.models;
2+
3+
public class Employee {
4+
5+
private String email;
6+
private String name;
7+
8+
private double salary;
9+
10+
public Employee() {
11+
}
12+
13+
public Employee(String email, String name, double salary) {
14+
this.email = email;
15+
this.name = name;
16+
this.salary = salary;
17+
}
18+
19+
public String getEmail() {
20+
return email;
21+
}
22+
23+
public void setEmail(String email) {
24+
this.email = email;
25+
}
26+
27+
public String getName() {
28+
return name;
29+
}
30+
31+
public void setName(String name) {
32+
this.name = name;
33+
}
34+
35+
public double getSalary() {
36+
return salary;
37+
}
38+
39+
public void setSalary(double salary) {
40+
this.salary = salary;
41+
}
42+
43+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.stackify.services;
2+
3+
import com.stackify.models.Employee;
4+
5+
public class EmployeeService {
6+
7+
public double calculateBonus(Employee user) {
8+
return 0.1 * user.getSalary();
9+
}
10+
11+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
env=dev
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
<configuration debug="true">
2+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
3+
<encoder>
4+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
5+
</encoder>
6+
<target>System.out</target>
7+
</appender>
8+
9+
<property name="fileName" value="file.log" />
10+
<property scope="context" resource="application.properties" />
11+
12+
<!-- configure appenders -->
13+
<appender name="rollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
14+
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
15+
<fileNamePattern>log-%d{yyyy-MM-dd}.log</fileNamePattern>
16+
<maxHistory>30</maxHistory>
17+
<totalSizeCap>3GB</totalSizeCap>
18+
</rollingPolicy>
19+
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
20+
<maxFileSize>3MB</maxFileSize>
21+
</triggeringPolicy>
22+
<encoder>
23+
<pattern>%d [%thread] %-5level %logger{50} - %msg%n</pattern>
24+
</encoder>
25+
</appender>
26+
27+
<appender name="roleSiftingAppender" class="ch.qos.logback.classic.sift.SiftingAppender">
28+
<discriminator>
29+
<key>userRole</key>
30+
<defaultValue>ANONYMOUS</defaultValue>
31+
</discriminator>
32+
<sift>
33+
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
34+
<file>${userRole}.log</file>
35+
<layout class="ch.qos.logback.classic.PatternLayout">
36+
<pattern>%d [%thread] %level %mdc %logger{50} - %msg%n</pattern>
37+
</layout>
38+
</appender>
39+
</sift>
40+
</appender>
41+
42+
<!-- configure layouts -->
43+
<appender name="colorAppender" class="ch.qos.logback.core.ConsoleAppender">
44+
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
45+
<pattern>%d %green([%thread]) %highlight(%level) %logger{50} - %msg%n</pattern>
46+
</encoder>
47+
</appender>
48+
49+
<appender name="htmlAppender" class="ch.qos.logback.core.FileAppender">
50+
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
51+
<layout class="ch.qos.logback.classic.html.HTMLLayout">
52+
<pattern>%thread%level%logger%msg</pattern>
53+
</layout>
54+
</encoder>
55+
<file>log.html</file>
56+
</appender>
57+
58+
<!-- configure filters -->
59+
<appender name="STDOUT_LEVEL_FILTER_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
60+
<filter class="ch.qos.logback.classic.filter.LevelFilter">
61+
<level>ERROR</level>
62+
<onMatch>ACCEPT</onMatch>
63+
<onMismatch>DENY</onMismatch>
64+
</filter>
65+
<encoder>
66+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
67+
</encoder>
68+
<target>System.err</target>
69+
</appender>
70+
71+
<appender name="STDOUT_THRESHOLD_FILTER_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
72+
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
73+
<level>WARN</level>
74+
</filter>
75+
<encoder>
76+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
77+
</encoder>
78+
</appender>
79+
80+
<appender name="STDOUT_EVALUATOR_FILTER_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
81+
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
82+
<evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
83+
<expression>return (level > DEBUG &amp;&amp; message.toLowerCase().contains("employee"));</expression>
84+
</evaluator>
85+
<OnMismatch>DENY</OnMismatch>
86+
<OnMatch>NEUTRAL</OnMatch>
87+
</filter>
88+
<encoder>
89+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
90+
</encoder>
91+
</appender>
92+
93+
<!-- configure turbo filters -->
94+
<turboFilter class="ch.qos.logback.classic.turbo.DuplicateMessageFilter">
95+
<AllowedRepetitions>2</AllowedRepetitions>
96+
</turboFilter>
97+
98+
<turboFilter class="com.stackify.logging.IgnoreLoggerFilter">
99+
<LoggerName>ignoredColorLogger</LoggerName>
100+
</turboFilter>
101+
102+
<!-- configure loggers -->
103+
<logger level="info" name="rollingFileLogger" additivity="false">
104+
<appender-ref ref="rollingFileAppender" />
105+
</logger>
106+
107+
<logger level="info" name="htmlLogger" additivity="false">
108+
<appender-ref ref="htmlAppender" />
109+
</logger>
110+
111+
<logger level="info" name="roleSiftingLogger" additivity="false">
112+
<appender-ref ref="roleSiftingAppender" />
113+
</logger>
114+
115+
<logger level="info" name="colorLogger" additivity="false">
116+
<appender-ref ref="colorAppender" />
117+
</logger>
118+
119+
<logger level="info" name="ignoredColorLogger">
120+
<appender-ref ref="colorAppender" />
121+
</logger>
122+
123+
<logger level="info" name="levelFilterLogger" additivity="false">
124+
<appender-ref ref="STDOUT_LEVEL_FILTER_APPENDER" />
125+
</logger>
126+
127+
<logger level="info" name="thresholdFilterLogger" additivity="false">
128+
<appender-ref ref="STDOUT_THRESHOLD_FILTER_APPENDER" />
129+
</logger>
130+
131+
<logger level="info" name="evaluatorFilterLogger" additivity="false">
132+
<appender-ref ref="STDOUT_EVALUATOR_FILTER_APPENDER" />
133+
</logger>
134+
135+
<!-- configure root logger -->
136+
<root level="INFO">
137+
<appender-ref ref="STDOUT" />
138+
</root>
139+
140+
<!-- configure root logger conditionally -->
141+
<property scope="context" resource="application.properties" />
142+
143+
<if condition='property("env").equals("dev")'>
144+
<then>
145+
<root level="TRACE">
146+
<appender-ref ref="STDOUT" />
147+
</root>
148+
</then>
149+
</if>
150+
151+
</configuration>
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.stackify.services;
2+
3+
import org.junit.Test;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.slf4j.MDC;
7+
8+
import com.stackify.models.Employee;
9+
10+
import ch.qos.logback.classic.Level;
11+
12+
public class EmployeeServiceTest {
13+
private static final Logger logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
14+
15+
private EmployeeService employeeService = new EmployeeService();
16+
17+
@Test
18+
public void testAppenders() {
19+
Logger rollingFileLogger = LoggerFactory.getLogger("rollingFileLogger");
20+
rollingFileLogger.info("Testing rolling file logger");
21+
22+
MDC.put("userRole", "ADMIN");
23+
Logger siftingLogger = LoggerFactory.getLogger("roleSiftingLogger");
24+
siftingLogger.info("Admin Action");
25+
}
26+
27+
@Test
28+
public void testLayouts() {
29+
Logger htmlLogger = LoggerFactory.getLogger("htmlLogger");
30+
htmlLogger.error("Employee Information Update Failed");
31+
htmlLogger.info("New Account Created");
32+
33+
Logger colorLogger = LoggerFactory.getLogger("colorLogger");
34+
colorLogger.error("Employee Information Update Failed");
35+
colorLogger.info("New Account Created");
36+
}
37+
38+
@Test
39+
public void testLogLevel() {
40+
ch.qos.logback.classic.Logger rollingFileLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("rollingFileLogger");
41+
rollingFileLogger.setLevel(Level.DEBUG);
42+
rollingFileLogger.debug("Testing Log Level");
43+
}
44+
45+
@Test
46+
public void testParameter() {
47+
Employee employee = new Employee("john@gmail.com", "John", 2000);
48+
if (logger.isDebugEnabled()) {
49+
logger.debug("The bonus for employee: " + employee.getName() + " is " + employeeService.calculateBonus(employee));
50+
}
51+
logger.debug("The bonus for employee {} is {}", employee.getName(), employeeService.calculateBonus(employee));
52+
}
53+
54+
@Test
55+
public void testFilters() {
56+
Logger levelFilterLogger = LoggerFactory.getLogger("levelFilterLogger");
57+
levelFilterLogger.error("Employee Information Update Failed");
58+
Logger thresholdFilterLogger = LoggerFactory.getLogger("thresholdFilterLogger");
59+
thresholdFilterLogger.trace("Employee record inserted");
60+
Logger evaluatorFilterLogger = LoggerFactory.getLogger("evaluatorFilterLogger");
61+
evaluatorFilterLogger.debug("Employee account deactivated");
62+
}
63+
64+
@Test
65+
public void testIgnoredLogger() {
66+
Logger colorLogger = LoggerFactory.getLogger("ignoredColorLogger");
67+
colorLogger.info("Ignored Log Message");
68+
}
69+
70+
@Test
71+
public void testConditionalConfiguration() {
72+
logger.trace("Employee record updated");
73+
}
74+
}

0 commit comments

Comments
 (0)