首页 > 解决方案 > Using SNMP4J-Agent with a Logback configuration

问题描述

I have a logback configuration for the rest of my code and I am now using SNMP4J-Agent. When I start this agent I have to give a logFactory and it seems to accept only Log4J. I would like to log along with the rest of my app.

  LogFactory.setLogFactory(new Log4jLogFactory());
  org.apache.log4j.BasicConfigurator.configure();
  LogFactory.getLogFactory().getRootLogger().setLogLevel(LogLevel.DEBUG);

I found that I could pass a custom appender to the log4j configuration so I tried to create one, but I got an error. Please help.

private static org.apache.log4j.Appender snmpAppender =
        (org.apache.log4j.Appender) Logger.getRootLogger().getAppender("SNMP");

static {
    LogFactory.setLogFactory(new Log4jLogFactory());
    org.apache.log4j.BasicConfigurator.configure(snmpAppender);
    LogFactory.getLogFactory().getRootLogger().setLogLevel(LogLevel.DEBUG);
}

Snippet of my appender class :

public class SnmpAppender extends AppenderBase<ILoggingEvent> {

private final ConcurrentMap<String, ILoggingEvent> eventMap
        = new ConcurrentHashMap<>();

private String prefix;

@Override
protected void append(final ILoggingEvent event) {
    if (prefix == null || "".equals(prefix)) {
        addError("Prefix is not set for MapAppender.");
        return;
    }

    eventMap.put(prefix + System.currentTimeMillis(), event);
}

Snippet of my logback config :

<appender name="SNMP-Agent" 
           class="ca.bat.snmp.SnmpAppender">
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator 
  class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
            <marker>SNMP</marker>
        </evaluator>
        <onMismatch>DENY</onMismatch>
        <onMatch>NEUTRAL</onMatch>
    </filter>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level %logger{50} - %msg%n</pattern>
        <charset>UTF-8</charset>
        <immediateFlush>true</immediateFlush>
    </encoder>
    <rollingPolicy 
         class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOG_DIR}/snmp/snmp.%d{yyyy-MM- 
          dd}.log.zip</fileNamePattern>
        <maxHistory>90</maxHistory>
    </rollingPolicy>
</appender>

Here is what I get :

log4j:WARN No appenders could be found for logger (org.snmp4j.security.Salt).
log4j:WARN Please initialize the log4j system properly.

My Gradle :

dependencies {
  [...]
  compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
  compile group: 'org.snmp4j', name: 'snmp4j-agent', version: '2.6.3'
}

标签: javagradlelogbacksnmp4j

解决方案


您认为 SNMP4J(-Agent) 仅支持 Log4J 的看法是不正确的。与其创建自己的 Log4J-Appender,不如扩展 SNMP4J LogFactory 接口并将自己的日志桥接实现为“MyLogBackLogFactory”。然后打电话

LogFactory.setLogFactory(new MyLogBackLogFactory());

在调用任何其他 SNMP4J(-Agent) 代码之前。


推荐阅读