我需要为动态加载和重新加载的类动态创建Logback记录器和各种位.我有一些可变数量的这些类,尽管它会少于150个.性能是一个很大的问题,这是一个高度线程和极其并发的环境,所以使用MDC的想法不会飞,因为当出现问题时可能会有数千次调用.我也不想直接将记录器传递给类,我希望他们只需使用getLogger就可以将它们拉出来.
每个类都必须将所有错误消息记录到它自己的错误文件中,并将所有错误消息记录到它自己的跟踪文件中.这两个文件都需要每晚滚动.此外,系统中记录的任何内容也必须最终出现在主系统日志中.
我已经创建了以下代码片段来尝试这个想法.它看起来像它可以工作,但结果不是我所期望的.这是可以直接运行的测试程序:
package logbacktesting;
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.filter.LevelFilter;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.spi.FilterReply;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.LoggerFactory;
public class Main {
public static void main(String[] args) {
Logger templateLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.myapp");
LoggerContext loggerContext = templateLogger.getLoggerContext();
String[] nameList = new String[] {"test1.class", "test2.class"};
// Set up the pattern
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.start();
// Spin over the names to create all the needed objects …Run Code Online (Sandbox Code Playgroud)