Log4j2

Dynamic Log Levels for Log4j2 hooks into Pekko Management and provides a route where log levels can be read and set over HTTP.

Project Info

Project Info: Apache Pekko Dynamic Log Levels Log4j 2
Artifact
org.apache.pekko
pekko-management-loglevels-log4j2
1.1.0
JDK versions
OpenJDK 8
OpenJDK 11
OpenJDK 17
OpenJDK 21
Scala versions2.12.20, 2.13.15, 3.3.4
License
Home pagehttps://pekko.apache.org/
API documentation
Forums
Release notesRelease Notes
IssuesGitHub issues
Sourceshttps://github.com/apache/pekko-management

Requires Pekko Management and that the application uses Log4j2 as logging backend.

sbt
val PekkoManagementVersion = "1.1.0"
libraryDependencies ++= Seq(
  "org.apache.pekko" %% "pekko-management-loglevels-log4j2" % PekkoManagementVersion,
  "org.apache.pekko" %% "pekko-management" % PekkoManagementVersion
)
Gradle
def versions = [
  PekkoManagementVersion: "1.1.0",
  ScalaBinary: "2.13"
]
dependencies {
  implementation "org.apache.pekko:pekko-management-loglevels-log4j2_${versions.ScalaBinary}:${versions.PekkoManagementVersion}"
  implementation "org.apache.pekko:pekko-management_${versions.ScalaBinary}:${versions.PekkoManagementVersion}"
}
Maven
<properties>
  <pekko.management.version>1.1.0</pekko.management.version>
  <scala.binary.version>2.13</scala.binary.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.apache.pekko</groupId>
    <artifactId>pekko-management-loglevels-log4j2_${scala.binary.version}</artifactId>
    <version>${pekko.management.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.pekko</groupId>
    <artifactId>pekko-management_${scala.binary.version}</artifactId>
    <version>${pekko.management.version}</version>
  </dependency>
</dependencies>

Pekko Management and pekko-management-loglevels-log4j2 can be used with Pekko 1.1.2 or later. You have to override the following Pekko dependencies by defining them explicitly in your build and define the Pekko version to the one that you are using. Latest patch version of Pekko is recommended and a later version than 1.1.2 can be used.

sbt
val PekkoVersion = "1.1.2"
libraryDependencies ++= Seq(
  "org.apache.pekko" %% "pekko-stream" % PekkoVersion,
  "org.apache.pekko" %% "pekko-slf4j" % PekkoVersion
)
Gradle
def versions = [
  PekkoVersion: "1.1.2",
  ScalaBinary: "2.13"
]
dependencies {
  implementation "org.apache.pekko:pekko-stream_${versions.ScalaBinary}:${versions.PekkoVersion}"
  implementation "org.apache.pekko:pekko-slf4j_${versions.ScalaBinary}:${versions.PekkoVersion}"
}
Maven
<properties>
  <pekko.version>1.1.2</pekko.version>
  <scala.binary.version>2.13</scala.binary.version>
</properties>
<dependencies>
  <dependency>
    <groupId>org.apache.pekko</groupId>
    <artifactId>pekko-stream_${scala.binary.version}</artifactId>
    <version>${pekko.version}</version>
  </dependency>
  <dependency>
    <groupId>org.apache.pekko</groupId>
    <artifactId>pekko-slf4j_${scala.binary.version}</artifactId>
    <version>${pekko.version}</version>
  </dependency>
</dependencies>

With Pekko Management started and this module on the classpath the module is automatically picked up and provides the following two HTTP routes:

Reading Logger Levels

A HTTP GET request to loglevel/log4j2?logger=[logger name] will return the log level of that logger.

Changing Logger Levels

Only enabled if pekko.management.http.route-providers-read-only is set to false.

Warning

If enabling this make sure to properly secure your endpoint with HTTPS and authentication or else anyone with access to the system could change logger levels and potentially do a DoS attack by setting all loggers to TRACE.

A HTTP PUT request to loglevel/log4j2?logger=[logger name]&level=[level name] will change the level of that logger on the JVM the ActorSystem runs on.

For example using curl:

curl -X PUT "http://127.0.0.1:7626/loglevel/log4j2?logger=com.example.MyActor&level=DEBUG"

Classic and Internal Pekko Logger Level

Internal Pekko actors and classic Pekko does logging through the built in API there is an additional level of filtering using the pekko.loglevel setting. If you have not set pekko.loglevel to DEBUG (recommended) log entries from the classic logging API may never reach the logger backend at all.

The current level configured with pekko.loglevel can be inspected with a GET request to loglevel/pekko.

If management read-only is set to false PUT requests to loglevel/pekko?level=[level name] will dynamically change that. Note that the allowed level for Pekko Classic logging is a subset of the loglevels supported by SLF4j, valid values are OFF, DEBUG, INFO, WARNING and ERROR.

For example using curl:

curl -X PUT "http://127.0.0.1:7626/loglevel/pekko?level=DEBUG"