Skip to content
This repository has been archived by the owner on Jan 3, 2023. It is now read-only.

Commit

Permalink
Added support for Logback.
Browse files Browse the repository at this point in the history
  • Loading branch information
odrotbohm committed Oct 27, 2010
1 parent e046160 commit 527b4fa
Show file tree
Hide file tree
Showing 8 changed files with 230 additions and 3 deletions.
31 changes: 31 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,30 @@
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.6.1</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.6.1</version>
</dependency>

<dependency>
Expand All @@ -39,6 +63,13 @@
<optional>true</optional>
</dependency>

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>0.9.25</version>
<optional>true</optional>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanReference;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.parsing.ReaderContext;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
Expand All @@ -18,6 +20,8 @@
import org.springframework.jmx.export.annotation.AnnotationMBeanExporter;
import org.w3c.dom.Element;

import ch.qos.logback.classic.LoggerContext;


/**
* Simple delegating {@link BeanDefinitionParser} that uses a
Expand All @@ -34,11 +38,23 @@ public BeanDefinition parse(Element element, ParserContext parserContext) {
BeanDefinitionBuilder
.rootBeanDefinition(AnnotationMBeanExporter.class);

BeanDefinitionParser delegate =
new Log4JAutoDiscoveringLoggerBeanDefinitionParser(builder);
String type = element.getAttribute("type");
BeanDefinitionParser delegate = null;

if ("Log4J".equals(type)) {
delegate =
new Log4JAutoDiscoveringLoggerBeanDefinitionParser(builder);
} else if ("Logback".equals(type)) {
delegate =
new LogbackAutoDiscoveringLoggerBeanDefinitionParser(
builder);
} else {
ReaderContext context = parserContext.getReaderContext();
context.error("Unsupported logger!", context.extractSource(element));
return null;
}

BeanDefinition result = delegate.parse(element, parserContext);

BeanDefinitionReaderUtils.registerWithGeneratedName(
builder.getBeanDefinition(), parserContext.getRegistry());

Expand Down Expand Up @@ -177,4 +193,65 @@ private BeanDefinition getLoggerBeanDefinition(String name,
}

}

private static class LogbackAutoDiscoveringLoggerBeanDefinitionParser
extends AbstractAutoDiscoveringLoggerBeanDefinitionParser {

private final LoggerContext context = (LoggerContext) LoggerFactory
.getILoggerFactory();


public LogbackAutoDiscoveringLoggerBeanDefinitionParser(
BeanDefinitionBuilder builder) {

super(builder);
}


/*
* (non-Javadoc)
*
* @see org.springframework.jmx.config.JmxLoggerBeanDefinitionParser.
* AbstractAutoDiscoveringLoggerBeanDefinitionParser
* #getSources(java.lang.String)
*/
@Override
protected Iterable<String> getSources(String basePackage) {

Set<String> result = new HashSet<String>();

for (ch.qos.logback.classic.Logger logger : context.getLoggerList()) {
if (logger.getName().startsWith(basePackage)) {

result.add(logger.getName());
}
}

return result;
}


/*
* (non-Javadoc)
*
* @see org.springframework.jmx.config.JmxLoggerBeanDefinitionParser.
* AbstractAutoDiscoveringLoggerBeanDefinitionParser
* #registerBeanDefinition(org.springframework.jmx.config.JmxLogger,
* org.springframework.beans.factory.xml.ParserContext,
* java.lang.Object)
*/
@Override
protected String registerBeanDefinition(JmxLogger logger,
ParserContext parserContext, Object source) {

BeanDefinitionBuilder builder =
BeanDefinitionBuilder
.rootBeanDefinition("org.springframework.jmx.config.LogbackJmxLogger");
builder.addConstructorArgValue(context.getLogger(logger.getName()));

return BeanDefinitionReaderUtils.registerWithGeneratedName(
getSourcedBeanDefinition(builder, source),
parserContext.getRegistry());
}
}
}
55 changes: 55 additions & 0 deletions src/main/java/org/springframework/jmx/config/LogbackJmxLogger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package org.springframework.jmx.config;

import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;


/**
* Simple wrapper class to easily expose a Logback logger to JMX.
*
* @author Oliver Gierke
*/
@ManagedResource
public class LogbackJmxLogger {

private final Logger logger;


public LogbackJmxLogger(Logger logger) {

this.logger = logger;
}


@ManagedAttribute
public String getName() {

return logger.getName();
}


@ManagedAttribute
public String getLevel() {

Level level = logger.getLevel();
return level == null ? "" : level.toString();
}


@ManagedAttribute
public void setLevel(String level) {

Level toSet = Level.toLevel(level);

// Level.toLevel defaults to DEBUG, so only set it if input was DEBUG
// already
if (!"DEBUG".equals(level) && Level.DEBUG.equals(toSet)) {
return;
}

this.logger.setLevel(toSet);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Log4J" />
<xsd:enumeration value="Logback" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.springframework.jmx.config;

import static org.junit.Assert.*;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


/**
* Integration test for {@link JmxLoggerBeanDefinitionParser}.
*
* @author Oliver Gierke
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:logback-logger.xml")
public class LogbackLoggerBeanDefinitionParserIntegrationTest {

@Autowired
List<LogbackJmxLogger> logger;


@Test
public void testname() throws Exception {

assertNotNull(logger);
assertFalse(logger.isEmpty());
}
}
1 change: 1 addition & 0 deletions src/test/java/org/springframework/jmx/config/Sample.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public static void main(String... args) {

ConfigurableApplicationContext context =
new ClassPathXmlApplicationContext("jmx-logger.xml");
// new ClassPathXmlApplicationContext("logback-logger.xml");

Scanner scanner = new Scanner(System.in);

Expand Down
13 changes: 13 additions & 0 deletions src/test/resources/logback-logger.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jmx="http://www.springframework.org/schema/jmx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jmx http://www.springframework.org/schema/jmx/spring-jmx-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:mbean-server />

<jmx:logger type="Logback" name="org.springframework" levels="2" />

</beans>
16 changes: 16 additions & 0 deletions src/test/resources/logback.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<root level="debug">
<appender-ref ref="STDOUT" />
</root>

<logger name="org.springframework" level="INFO" />

</configuration>

0 comments on commit 527b4fa

Please sign in to comment.