66 java spring logback javabeans
我在logback.xml中定义了一个logback appender,它是一个DB appender,但我很好奇是否有任何方法可以使用我自己定义为bean的连接池在java中配置appender.
我找到类似的东西,但从来没有真正的答案.
ret*_*eto 107
这是一个适合我的简单示例(请注意,我在此示例中使用了FileAppender)
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.FileAppender;
public class Loggerutils {
    public static void main(String[] args) {
          Logger foo = createLoggerFor("foo", "foo.log");
          Logger bar = createLoggerFor("bar", "bar.log");
          foo.info("test");
          bar.info("bar");
    }
    private static Logger createLoggerFor(String string, String file) {
          LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
          PatternLayoutEncoder ple = new PatternLayoutEncoder();
          ple.setPattern("%date %level [%thread] %logger{10} [%file:%line] %msg%n");
          ple.setContext(lc);
          ple.start();
          FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
          fileAppender.setFile(file);
          fileAppender.setEncoder(ple);
          fileAppender.setContext(lc);
          fileAppender.start();
          Logger logger = (Logger) LoggerFactory.getLogger(string);
          logger.addAppender(fileAppender);
          logger.setLevel(Level.DEBUG);
          logger.setAdditive(false); /* set to true if root should log too */
          return logger;
    }
}
Cek*_*eki 14
您可以以编程方式配置appender.几乎所有的appender都使用程序化配置进行测试.因此,在logback项目源代码中有许多程序化appender配置的例子.对于logback-core appender,请查看下面的内容logback-core/src/test/java,并查看logback-classic appender logback-classic/src/test/java.
作为参考,当您尝试修改负责创建记录器的代码时,必须满足一系列规则才能使记录器工作.
这些规则在一篇很有帮助的文章中描述了slf4j/logback的编程配置:
现在我有slf4j/logback的编程配置经验.
任务
程序必须为每个已处理的输入文件打开单独的日志文件.
任务解决方案
不需要通过xml配置logback,而是需要"手动"实例化编码器,追加器和记录器,然后配置它们并将它们链接在一起.
警告1
尝试在appender之间共享编码器(即PatternLayoutEncoder)时,Logback变得疯狂.
警告解决方案1
为每个appender创建单独的编码器.
警告2
如果编码器和appender与日志记录上下文无关,则Logback拒绝记录任何内容.
警告的解决方案2
在每个编码器和appender上调用setContext,将LoggerFactory作为参数传递.
警告3
如果未启动编码器和追加器,则Logback拒绝记录任何内容.
警告的解决方案3
编码器和appender需要以正确的顺序启动,即第一个编码器,然后是appender.
警告4
RollingPolicy对象(即TimeBasedRollingPolicy)在没有附加到与appender相同的上下文时会产生奇怪的错误消息,例如"日期格式无法识别".
警告解决方案4
在RollingPolicy上调用setContext与编码器和appender相同.
以下是"手动"logback配置的工作示例:
package testpackage
import ch.qos.logback.classic.Level
import ch.qos.logback.classic.Logger
import ch.qos.logback.classic.LoggerContext
import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.ConsoleAppender
import ch.qos.logback.core.rolling.RollingFileAppender
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy
import org.slf4j.LoggerFactory
class TestLogConfig {
  public static void main(String[] args) {
    LoggerContext logCtx = LoggerFactory.getILoggerFactory();
    PatternLayoutEncoder logEncoder = new PatternLayoutEncoder();
    logEncoder.setContext(logCtx);
    logEncoder.setPattern("%-12date{YYYY-MM-dd HH:mm:ss.SSS} %-5level - %msg%n");
    logEncoder.start();
    ConsoleAppender logConsoleAppender = new ConsoleAppender();
    logConsoleAppender.setContext(logCtx);
    logConsoleAppender.setName("console");
    logConsoleAppender.setEncoder(logEncoder);
    logConsoleAppender.start();
    logEncoder = new PatternLayoutEncoder();
    logEncoder.setContext(logCtx);
    logEncoder.setPattern("%-12date{YYYY-MM-dd HH:mm:ss.SSS} %-5level - %msg%n");
    logEncoder.start();
    RollingFileAppender logFileAppender = new RollingFileAppender();
    logFileAppender.setContext(logCtx);
    logFileAppender.setName("logFile");
    logFileAppender.setEncoder(logEncoder);
    logFileAppender.setAppend(true);
    logFileAppender.setFile("logs/logfile.log");
    TimeBasedRollingPolicy logFilePolicy = new TimeBasedRollingPolicy();
    logFilePolicy.setContext(logCtx);
    logFilePolicy.setParent(logFileAppender);
    logFilePolicy.setFileNamePattern("logs/logfile-%d{yyyy-MM-dd_HH}.log");
    logFilePolicy.setMaxHistory(7);
    logFilePolicy.start();
    logFileAppender.setRollingPolicy(logFilePolicy);
    logFileAppender.start();
    Logger log = logCtx.getLogger("Main");
    log.additive = false;
    log.level = Level.INFO;
    log.addAppender(logConsoleAppender);
    log.addAppender(logFileAppender);
  }
}
只是,如果有人要寻找程序化配置的具体示例。
在这里,我设置了ConsoleAppender的字符集:
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
ConsoleAppender<ILoggingEvent> appender =
    (ConsoleAppender) lc.getLogger("appconsole").getAppender("STDOUT");
LayoutWrappingEncoder<ILoggingEvent> enc = 
    (LayoutWrappingEncoder<ILoggingEvent>) appender.getEncoder();
enc.setCharset(Charset.forName("utf-8"));
而我的logback.xml:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <charset>866</charset>
        <pattern>[%level] %msg%n</pattern>
    </encoder>
</appender>
<logger name="appconsole">
    <appender-ref ref="STDOUT" />
</logger>
为什么我需要以编程方式配置记录器?因为,我将我的应用程序(Spring Boot)打包到一个jar文件中。因此,Logback.xml文件似乎隐藏在jar中。但是,解包和更改它并不方便。而且,我的app.jar旁边不需要任何logback.xml文件。我只有app.yaml文件,其中包含应用程序的所有配置属性。
| 归档时间: | 
 | 
| 查看次数: | 59803 次 | 
| 最近记录: |