This is an automated email from the ASF dual-hosted git repository.
jhelou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
The following commit(s) were added to refs/heads/master by this push:
new 4c71ca2384 [devscout] upgrade logback and crowdsec
4c71ca2384 is described below
commit 4c71ca23844907353b61ce5c121e91fb15ccd4e1
Author: Jean Helou <[email protected]>
AuthorDate: Sat Dec 14 15:44:15 2024 +0100
[devscout] upgrade logback and crowdsec
This commit drops the unmaintained logback-classic dependecy
and upgrades logback to the latest version.
Logback-classic has a native JsonEncoder (already in the
original version). The latest version allows to have the
formatted message and to enable/disable any top level field\
by configuration.
This allows using logback's own JSON encoder and get rid ot logback-contrib
which is unmaintained to output json ( the repository is archived and the
dependencies are quite outdated)
A side effect was that the format of the Json output changes slightly, I
adjusted the samplec configurations for the crowdsec module.
One of the change is a higher resolution for the timestamp, which required
raising crowdsec to 1.6.x.
---
docs/modules/servers/partials/operate/logging.adoc | 12 ++++
pom.xml | 7 +--
.../protocols/netty/ProtocolMDCContextFactory.java | 1 -
server/apps/cassandra-app/pom.xml | 4 --
.../helm-chart/james/configs/logback.xml | 30 ++++-----
server/apps/distributed-app/pom.xml | 4 --
server/apps/distributed-pop3-app/pom.xml | 4 --
server/apps/jpa-app/pom.xml | 4 --
server/apps/jpa-smtp-app/pom.xml | 4 --
server/apps/memory-app/pom.xml | 4 --
server/apps/scaling-pulsar-smtp/pom.xml | 4 --
.../crowdsec/sample-configuration/logback.xml | 71 +++++++++-------------
.../apache/james/crowdsec/CrowdsecExtension.java | 9 ++-
.../resources/crowdsec/parsers/syslog-logs.yaml | 6 +-
.../crowdsec/src/test/resources/logback-test.xml | 30 +++++----
15 files changed, 87 insertions(+), 107 deletions(-)
diff --git a/docs/modules/servers/partials/operate/logging.adoc
b/docs/modules/servers/partials/operate/logging.adoc
index e8da4c3a4e..0d21945b76 100644
--- a/docs/modules/servers/partials/operate/logging.adoc
+++ b/docs/modules/servers/partials/operate/logging.adoc
@@ -25,6 +25,18 @@ and link:https://docs.fluentbit.io/[FluentBit] as centralize
logging.
Information about logback configuration can be found
link:http://logback.qos.ch/manual/configuration.html[here].
+It is possible to configure a logback appender to expose structured logging
+as JSON using logback's `JsonEncoder` like in the following example:
+
+```
+<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder class="ch.qos.logback.classic.encoder.JsonEncoder">
+ <withFormattedMessage>true</withFormattedMessage>
+ </encoder>
+ <immediateFlush>false</immediateFlush>
+</appender>
+```
+
Note that dedicated formatters can be added to your docker containers :
- Add the corresponding JAR onto the `/root/libs` folder of docker container
diff --git a/pom.xml b/pom.xml
index 12a9e45924..f2622cbd08 100644
--- a/pom.xml
+++ b/pom.xml
@@ -651,7 +651,7 @@
<lucene.version>9.11.1</lucene.version>
<jasypt.version>1.9.3</jasypt.version>
<guice.version>7.0.0</guice.version>
- <logback.version>1.4.14</logback.version>
+ <logback.version>1.5.12</logback.version>
<tink.version>1.9.0</tink.version>
<lettuce.core.version>6.3.2.RELEASE</lettuce.core.version>
<io.micrometer.core.version>1.13.6</io.micrometer.core.version>
@@ -2076,11 +2076,6 @@
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
- <dependency>
- <groupId>ch.qos.logback.contrib</groupId>
- <artifactId>logback-json-classic</artifactId>
- <version>0.1.5</version>
- </dependency>
<dependency>
<groupId>com.beetstra.jutf7</groupId>
<artifactId>jutf7</artifactId>
diff --git
a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContextFactory.java
b/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContextFactory.java
index d7adfde75f..096fb1e2fc 100644
---
a/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContextFactory.java
+++
b/protocols/netty/src/main/java/org/apache/james/protocols/netty/ProtocolMDCContextFactory.java
@@ -96,7 +96,6 @@ public interface ProtocolMDCContextFactory {
static MDCBuilder forSession(ProtocolSession protocolSession) {
return MDCBuilder.create()
.addToContext(MDCBuilder.SESSION_ID,
protocolSession.getSessionID())
- .addToContext(MDCBuilder.CHARSET,
protocolSession.getCharset().displayName())
.addToContextIfPresent(MDCBuilder.USER,
Optional.ofNullable(protocolSession.getUsername()).map(Username::asString));
}
diff --git a/server/apps/cassandra-app/pom.xml
b/server/apps/cassandra-app/pom.xml
index a78b343daf..36ddca71d4 100644
--- a/server/apps/cassandra-app/pom.xml
+++ b/server/apps/cassandra-app/pom.xml
@@ -247,10 +247,6 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
- <dependency>
- <groupId>ch.qos.logback.contrib</groupId>
- <artifactId>logback-json-classic</artifactId>
- </dependency>
<dependency>
<groupId>com.linagora</groupId>
<artifactId>logback-elasticsearch-appender</artifactId>
diff --git a/server/apps/distributed-app/helm-chart/james/configs/logback.xml
b/server/apps/distributed-app/helm-chart/james/configs/logback.xml
index 981c842472..8f0f133b9e 100644
--- a/server/apps/distributed-app/helm-chart/james/configs/logback.xml
+++ b/server/apps/distributed-app/helm-chart/james/configs/logback.xml
@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
under the License.
-->
diff --git a/server/apps/distributed-app/pom.xml
b/server/apps/distributed-app/pom.xml
index 95972160e1..7e98b1af44 100644
--- a/server/apps/distributed-app/pom.xml
+++ b/server/apps/distributed-app/pom.xml
@@ -308,10 +308,6 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
- <dependency>
- <groupId>ch.qos.logback.contrib</groupId>
- <artifactId>logback-json-classic</artifactId>
- </dependency>
<dependency>
<groupId>com.linagora</groupId>
<artifactId>logback-elasticsearch-appender</artifactId>
diff --git a/server/apps/distributed-pop3-app/pom.xml
b/server/apps/distributed-pop3-app/pom.xml
index 3cff0f9130..44b37d9ef0 100644
--- a/server/apps/distributed-pop3-app/pom.xml
+++ b/server/apps/distributed-pop3-app/pom.xml
@@ -299,10 +299,6 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
- <dependency>
- <groupId>ch.qos.logback.contrib</groupId>
- <artifactId>logback-json-classic</artifactId>
- </dependency>
<dependency>
<groupId>com.linagora</groupId>
<artifactId>logback-elasticsearch-appender</artifactId>
diff --git a/server/apps/jpa-app/pom.xml b/server/apps/jpa-app/pom.xml
index 52d9a102aa..77ff003e3e 100644
--- a/server/apps/jpa-app/pom.xml
+++ b/server/apps/jpa-app/pom.xml
@@ -200,10 +200,6 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
- <dependency>
- <groupId>ch.qos.logback.contrib</groupId>
- <artifactId>logback-json-classic</artifactId>
- </dependency>
<dependency>
<groupId>com.linagora</groupId>
<artifactId>logback-elasticsearch-appender</artifactId>
diff --git a/server/apps/jpa-smtp-app/pom.xml b/server/apps/jpa-smtp-app/pom.xml
index 10998e1d54..6b726ea5ad 100644
--- a/server/apps/jpa-smtp-app/pom.xml
+++ b/server/apps/jpa-smtp-app/pom.xml
@@ -148,10 +148,6 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
- <dependency>
- <groupId>ch.qos.logback.contrib</groupId>
- <artifactId>logback-json-classic</artifactId>
- </dependency>
<dependency>
<groupId>com.linagora</groupId>
<artifactId>logback-elasticsearch-appender</artifactId>
diff --git a/server/apps/memory-app/pom.xml b/server/apps/memory-app/pom.xml
index 1ed803261c..42ec3ee4a9 100644
--- a/server/apps/memory-app/pom.xml
+++ b/server/apps/memory-app/pom.xml
@@ -218,10 +218,6 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
- <dependency>
- <groupId>ch.qos.logback.contrib</groupId>
- <artifactId>logback-json-classic</artifactId>
- </dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
diff --git a/server/apps/scaling-pulsar-smtp/pom.xml
b/server/apps/scaling-pulsar-smtp/pom.xml
index 77e3559318..0368dd56a1 100644
--- a/server/apps/scaling-pulsar-smtp/pom.xml
+++ b/server/apps/scaling-pulsar-smtp/pom.xml
@@ -158,10 +158,6 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
- <dependency>
- <groupId>ch.qos.logback.contrib</groupId>
- <artifactId>logback-json-classic</artifactId>
- </dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
diff --git a/third-party/crowdsec/sample-configuration/logback.xml
b/third-party/crowdsec/sample-configuration/logback.xml
index af4b9feb1d..11b3556f24 100644
--- a/third-party/crowdsec/sample-configuration/logback.xml
+++ b/third-party/crowdsec/sample-configuration/logback.xml
@@ -1,49 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
- -->
-
-<configuration>
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
- <contextListener
class="ch.qos.logback.classic.jul.LevelChangePropagator">
- <resetJUL>true</resetJUL>
- </contextListener>
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ -->
- <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
- <encoder
class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
- <layout
class="ch.qos.logback.contrib.json.classic.JsonLayout">
-
<timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
-
<timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
+<configuration>
- <!-- Importance for handling multiple lines
log -->
- <appendLineSeparator>true</appendLineSeparator>
+ <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
+ <resetJUL>true</resetJUL>
+ </contextListener>
- <jsonFormatter
class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
- <prettyPrint>false</prettyPrint>
- </jsonFormatter>
- </layout>
- </encoder>
- <immediateFlush>false</immediateFlush>
- </appender>
- <root level="WARN">
- <appender-ref ref="CONSOLE" />
- </root>
+ <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder class="ch.qos.logback.classic.encoder.JsonEncoder">
+ <withFormattedMessage>true</withFormattedMessage>
+ </encoder>
+ <immediateFlush>false</immediateFlush>
+ </appender>
+ <root level="WARN">
+ <appender-ref ref="CONSOLE" />
+ </root>
- <logger name="org.apache.james" level="INFO" />
-</configuration>
+ <logger name="org.apache.james" level="INFO" />
+</configuration>
\ No newline at end of file
diff --git
a/third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecExtension.java
b/third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecExtension.java
index eb834b57e5..af93e1a4f1 100644
---
a/third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecExtension.java
+++
b/third-party/crowdsec/src/test/java/org/apache/james/crowdsec/CrowdsecExtension.java
@@ -34,8 +34,11 @@ import
org.apache.james.crowdsec.client.CrowdsecClientConfiguration;
import org.apache.james.crowdsec.client.CrowdsecHttpClient;
import org.apache.james.util.docker.RateLimiters;
import org.junit.jupiter.api.extension.ExtensionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy;
import org.testcontainers.utility.MountableFile;
@@ -47,7 +50,8 @@ import com.google.inject.Provides;
public class CrowdsecExtension implements GuiceModuleTestExtension {
public static final Duration STARTUP_TIMEOUT = Duration.ofMinutes(5);
public static final int CROWDSEC_PORT = 8080;
- public static final String CROWDSEC_IMAGE =
"crowdsecurity/crowdsec:v1.5.4";
+ public static final String CROWDSEC_IMAGE =
"crowdsecurity/crowdsec:v1.6.4";
+ private static final Logger LOGGER =
LoggerFactory.getLogger("tc.crowdsec");
private final GenericContainer<?> crowdsecContainer;
@@ -56,12 +60,15 @@ public class CrowdsecExtension implements
GuiceModuleTestExtension {
.withCreateContainerCmdModifier(cmd ->
cmd.withName("james-crowdsec-test-" + UUID.randomUUID()))
.withExposedPorts(CROWDSEC_PORT)
.withStartupTimeout(STARTUP_TIMEOUT)
+
.withCopyFileToContainer(MountableFile.forClasspathResource("crowdsec/acquis.yaml"),
"/etc/crowdsec/")
.withCopyFileToContainer(MountableFile.forClasspathResource("crowdsec/parsers/syslog-logs.yaml"),
"/etc/crowdsec/parsers/s00-raw/")
.withCopyFileToContainer(MountableFile.forClasspathResource("crowdsec/parsers/james-auth.yaml"),
"/etc/crowdsec/parsers/s01-parse/")
.withCopyFileToContainer(MountableFile.forClasspathResource("crowdsec/scenarios/james-bf-auth.yaml"),
"/etc/crowdsec/scenarios/")
.withCopyFileToContainer(MountableFile.forClasspathResource("crowdsec/scenarios/james-dictionary-attack.yaml"),
"/etc/crowdsec/scenarios/")
.withCopyFileToContainer(MountableFile.forClasspathResource("crowdsec/collections/james.yaml"),
"/etc/crowdsec/collections/")
+ .withEnv("DISABLE_PARSERS", "crowdsecurity/whitelists
crowdsecurity/geoip-enrich crowdsecurity/dateparse-enrich")
+ .withLogConsumer(new Slf4jLogConsumer(LOGGER))
.withFileSystemBind("src/test/resources/log", "/var/log",
BindMode.READ_WRITE)
.waitingFor(new
HostPortWaitStrategy().withRateLimiter(RateLimiters.TWENTIES_PER_SECOND));
}
diff --git
a/third-party/crowdsec/src/test/resources/crowdsec/parsers/syslog-logs.yaml
b/third-party/crowdsec/src/test/resources/crowdsec/parsers/syslog-logs.yaml
index 1b4f50f34e..a349f332af 100644
--- a/third-party/crowdsec/src/test/resources/crowdsec/parsers/syslog-logs.yaml
+++ b/third-party/crowdsec/src/test/resources/crowdsec/parsers/syslog-logs.yaml
@@ -64,11 +64,11 @@ statics:
- parsed: mdc_username
expression: evt.Unmarshaled.message.mdc.username
- parsed: logger
- expression: evt.Unmarshaled.message.logger
+ expression: evt.Unmarshaled.message.loggerName
- parsed: message
- expression: evt.Unmarshaled.message.message
+ expression: evt.Unmarshaled.message.formattedMessage
- parsed: context
- expression: evt.Unmarshaled.message.context
+ expression: ToJsonString(evt.Unmarshaled.message.context)
- meta: datasource_path
expression: evt.Line.Src
- meta: datasource_type
diff --git a/third-party/crowdsec/src/test/resources/logback-test.xml
b/third-party/crowdsec/src/test/resources/logback-test.xml
index ad3f309937..fd1c10bdca 100644
--- a/third-party/crowdsec/src/test/resources/logback-test.xml
+++ b/third-party/crowdsec/src/test/resources/logback-test.xml
@@ -37,23 +37,29 @@
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
- <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
- <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
- <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
- <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
-
- <!-- Importance for handling multiple lines log -->
- <appendLineSeparator>true</appendLineSeparator>
-
- <jsonFormatter
class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
- <prettyPrint>false</prettyPrint>
- </jsonFormatter>
- </layout>
+ <encoder class="ch.qos.logback.classic.encoder.JsonEncoder">
+ <withFormattedMessage>true</withFormattedMessage>
</encoder>
+ <immediateFlush>false</immediateFlush>
</appender>
<root level="WARN">
<appender-ref ref="LOG_FILE" />
+<!-- <appender-ref ref="CONSOLE" />-->
</root>
<logger name="org.apache.james" level="INFO" />
+
+ <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%-5level] %logger{15} -
%msg%n%rEx</pattern>
+ </encoder>
+ <immediateFlush>false</immediateFlush>
+ <!-- Disable below block for debug logs mode-->
+ <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+ <level>INFO</level>
+ </filter>
+ </appender>
+<!-- <logger name="tc" level="INFO" additivity="false">-->
+<!-- <appender-ref ref="CONSOLE"/>-->
+<!-- </logger>-->
</configuration>
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]