如何使用Java以编程方式配置Logback conversionRule?

如何使用Java以编程方式配置Logback conversionRule?,java,logback,Java,Logback,LogbackconversionRule是否可以以编程方式配置(无需编辑XML文件),就像Logback Appender可以以编程方式配置一样?//下面是一个简单的示例,适用于我 //Here a simple example that works for me package com; import ch.qos.logback.classic.pattern.ClassicConverter; import ch.qos.logback.classic.spi

Logback
conversionRule
是否可以以编程方式配置(无需编辑XML文件),就像Logback Appender可以以编程方式配置一样?

//下面是一个简单的示例,适用于我
  //Here a simple example that works for me
    package com;
    import ch.qos.logback.classic.pattern.ClassicConverter;
    import ch.qos.logback.classic.spi.ILoggingEvent;

    public class MySampleConverter extends ClassicConverter {
        long start = System.nanoTime();
        @Override
        public String convert(ILoggingEvent event) {
            long nowInNanos = System.nanoTime();
            return Long.toString(nowInNanos - start);
        }
    }
    package com;
    import java.util.HashMap;
    import java.util.Map;
    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.ConsoleAppender;
    import ch.qos.logback.core.CoreConstants;
    import ch.qos.logback.core.FileAppender;

    public class loggerutils {
        static Logger foo = createLoggerFor("foo", "foo.log");
        public static void main(String[] args) {
            foo.info("test");
        }

        private static Logger createLoggerFor(String string, String file) {
            String conversionWord = "nanoTime";
            String converterClass = "com.MySampleConverter";
            LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
            Map<String, String> ruleRegistry = (Map) lc
                    .getObject(CoreConstants.PATTERN_RULE_REGISTRY);
            if (ruleRegistry == null) {
                ruleRegistry = new HashMap<String, String>();
            }
            lc.putObject(CoreConstants.PATTERN_RULE_REGISTRY, ruleRegistry);
            ruleRegistry.put(conversionWord, converterClass);

            PatternLayoutEncoder ple = new PatternLayoutEncoder();
            ple.setPattern("%-20nanoTime %-30(%d{HH:mm:ss.SSS} [%thread]) - %-15(%M) - %-5level -%logger{32} - %msg%n ");

            ple.setContext(lc);
            ple.start();
            FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();
            fileAppender.setFile(file);
            fileAppender.setEncoder(ple);
            fileAppender.setContext(lc);
            fileAppender.start();

            ConsoleAppender<ILoggingEvent> consoleAppender = new ConsoleAppender<ILoggingEvent>();
            consoleAppender.setEncoder(ple);
            consoleAppender.setContext(lc);
            consoleAppender.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 */
            logger.addAppender(consoleAppender);
            logger.setLevel(Level.DEBUG);
            logger.setAdditive(false);
            return logger;
        }
    }
包装组件; 导入ch.qos.logback.classic.pattern.ClassicConverter; 导入ch.qos.logback.classic.spi.ILoggingEvent; 公共类MySampleConverter扩展ClassicConverter{ 长启动=System.nanoTime(); @凌驾 公共字符串转换(ILOGINGEVENT事件){ long nowInNanos=System.nanoTime(); 返回Long.toString(nowInNanos-start); } } 包装组件; 导入java.util.HashMap; 导入java.util.Map; 导入org.slf4j.LoggerFactory; 导入ch.qos.logback.classic.Level; 导入ch.qos.logback.classic.Logger; 导入ch.qos.logback.classic.LoggerContext; 导入ch.qos.logback.classic.encoder.PatternLayoutEncoder; 导入ch.qos.logback.classic.spi.ILoggingEvent; 导入ch.qos.logback.core.ConsoleAppender; 导入ch.qos.logback.core.core常量; 导入ch.qos.logback.core.FileAppender; 公共类刺猬{ 静态记录器foo=createLoggerFor(“foo”,“foo.log”); 公共静态void main(字符串[]args){ 食品信息(“测试”); } 专用静态记录器createLoggerFor(字符串、字符串文件){ 字符串转换word=“nanoTime”; 字符串converterClass=“com.MySampleConverter”; LoggerContext lc=(LoggerContext)LoggerFactory.getILoggerFactory(); 映射规则注册表=(映射)lc .getObject(CoreConstants.PATTERN\u RULE\u注册表); if(ruleRegistry==null){ ruleRegistry=newHashMap(); } lc.putObject(CoreConstants.PATTERN_RULE_REGISTRY,ruleRegistry); put(conversionWord,converterClass); PatternLayoutCoder ple=新的PatternLayoutCoder(); setPattern(“%-20nanoTime%-30(%d{HH:mm:ss.SSS}[%thread])-%-15(%M)-%-5级-%logger{32}-%msg%n”); ple.setContext(lc); ple.start(); FileAppender FileAppender=新FileAppender(); fileAppender.setFile(文件); fileAppender.setEncoder(ple); setContext(lc); fileAppender.start(); ConsoleAppender ConsoleAppender=新的ConsoleAppender(); 控制台Pender.setEncoder(ple); consoleAppender.setContext(lc); consoleApender.start(); Logger Logger=(Logger)LoggerFactory.getLogger(字符串); logger.addAppender(fileAppender); logger.setLevel(Level.DEBUG); logger.setadditional(false);/*如果root也应该记录,则设置为true*/ logger.addAppender(控制台程序); logger.setLevel(Level.DEBUG); logger.setaddition(假); 返回记录器; } }
//这里有一个简单的例子对我很有用
包装组件;
导入ch.qos.logback.classic.pattern.ClassicConverter;
导入ch.qos.logback.classic.spi.ILoggingEvent;
公共类MySampleConverter扩展ClassicConverter{
长启动=System.nanoTime();
@凌驾
公共字符串转换(ILOGINGEVENT事件){
long nowInNanos=System.nanoTime();
返回Long.toString(nowInNanos-start);
}
}
包装组件;
导入java.util.HashMap;
导入java.util.Map;
导入org.slf4j.LoggerFactory;
导入ch.qos.logback.classic.Level;
导入ch.qos.logback.classic.Logger;
导入ch.qos.logback.classic.LoggerContext;
导入ch.qos.logback.classic.encoder.PatternLayoutEncoder;
导入ch.qos.logback.classic.spi.ILoggingEvent;
导入ch.qos.logback.core.ConsoleAppender;
导入ch.qos.logback.core.core常量;
导入ch.qos.logback.core.FileAppender;
公共类刺猬{
静态记录器foo=createLoggerFor(“foo”,“foo.log”);
公共静态void main(字符串[]args){
食品信息(“测试”);
}
专用静态记录器createLoggerFor(字符串、字符串文件){
字符串转换word=“nanoTime”;
字符串converterClass=“com.MySampleConverter”;
LoggerContext lc=(LoggerContext)LoggerFactory.getILoggerFactory();
映射规则注册表=(映射)lc
.getObject(CoreConstants.PATTERN\u RULE\u注册表);
if(ruleRegistry==null){
ruleRegistry=newHashMap();
}
lc.putObject(CoreConstants.PATTERN_RULE_REGISTRY,ruleRegistry);
put(conversionWord,converterClass);
PatternLayoutCoder ple=新的PatternLayoutCoder();
setPattern(“%-20nanoTime%-30(%d{HH:mm:ss.SSS}[%thread])-%-15(%M)-%-5级-%logger{32}-%msg%n”);
ple.setContext(lc);
ple.start();
FileAppender FileAppender=新FileAppender();
fileAppender.setFile(文件);
fileAppender.setEncoder(ple);
setContext(lc);
fileAppender.start();
ConsoleAppender ConsoleAppender=新的ConsoleAppender();
控制台Pender.setEncoder(ple);
consoleAppender.setContext(lc);
consoleApender.start();
Logger Logger=(Logger)LoggerFactory.getLogger(字符串);
logger.addAppender(fileAppender);
logger.setLevel(Level.DEBUG);
logger.setadditional(false);/*如果root也应该记录,则设置为true*/
logger.addAppender(控制台程序);
logger.setLevel(Level.DEBUG);
logger.setaddition(假);
返回记录器;
}
}