【问题标题】:read .properties file using slf4j使用 slf4j 读取 .properties 文件
【发布时间】:2011-12-12 13:18:39
【问题描述】:

我想使用 slf4j 从 .properties 文件中读取数据,我可以在控制台上输出数据,但我想要在某个文件上输出数据,所以我需要在 .properties 中声明的文件 Appender文件,我无法使用 slf4j 读取 .properties 文件。谁能帮忙。

PS:我需要一个示例来解释如何在 slf4j 中使用.properties 文件以及如何为此初始化记录器工厂。

【问题讨论】:

  • 您使用的是哪个 slf4j 实现?例如 log4j、logback?

标签: java logging slf4j


【解决方案1】:

http://slf4j.org/faq.html

SLF4J 只是一个门面,意味着它不提供完整的 日志记录解决方案。配置 appender 或设置等操作 无法使用 SLF4J 执行日志记录级别。

slf4j-simple 根本不提供额外的配置功能。

对于其他实现,您应该使用它们提供的配置方式。

例如,slf4j-log4j 的 log4j.properties。见http://logging.apache.org/log4j/1.2/manual.html#Configuration

【讨论】:

    【解决方案2】:

    如果使用 log4j,也可以使用“Log4jLoggerAdapter”,在 .properties 文件中定义配置。 代码如下。

    所需的罐子:

    slf4j-api-1.7.5.jar
    slf4j-log4j12-1.7.5.jar
    
    If desired the source code (useful when debugging):
    slf4j-api-1.7.5-sources.jar
    slf4j-log4j12-1.7.5-sources.jar
    

    测试java类:

    import org.apache.log4j.PropertyConfigurator; 
    import org.slf4j.LoggerFactory;
    import org.slf4j.impl.Log4jLoggerAdapter;
    
    
    public class Slf4j_log4j_main {
    
        private static Log4jLoggerAdapter log = (Log4jLoggerAdapter) LoggerFactory.getLogger(Slf4j_log4j_main.class);
    
        public static void main(String[] args) {
            PropertyConfigurator.configure(Slf4j_log4j_main.class.getClassLoader().getResource("basic/log4j.properties"));
            log.debug( "a debug" );
            log.info( "an info" );
            log.warn("a warn");
            log.error("an error");
            //log.fatal("a fatal");  // slf4j misses fatal log.
            log.trace("a fatal");
            System.out.println("");
            System.out.println("[INFO]: done");
        }
    }
    

    基本/log4j.properties

    #@FROM: log4j_slf4j.basic
    #@BASED: [BIN319P17]/[BIN319P42]
    #using your own named logger.
    
    # defining appender file
    log=/home/alsdias/work/dev/java/lab/slf4j/log4j/log4j_slf4j/src/basic
    
    # root logger setup
    log4j.rootLogger = DEBUG, A1, FILE
    
    #setting your own named logger. If more loggers, set additivity false (below)
    log4j.logger.log4j.level=INFO,A1
    log4j.additivity.log4j.level=false
    
    # console appender config
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    
    # Print the date in ISO 8601 format
    log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    
    # file appender config
    log4j.appender.FILE=org.apache.log4j.FileAppender
    log4j.appender.FILE.File=${log}/log.out
    
    #setting the immediate flush to true (default)
    log4j.appender.FILE.ImmediateFlush=true
    #setting the threshold
    log4j.appender.FILE.Threshold=debug
    #setting the append to false, overwrite
    log4j.appender.FILE.Append=false
    
    #set a layout for the appender
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILE.layout.conversionPattern=%d [%t] %-5p %c - %m%n
    

    生成的输出:

    2013-06-14 11:47:00,473 [main] DEBUG basic.Slf4j_log4j_main - a debug
    2013-06-14 11:47:00,474 [main] INFO  basic.Slf4j_log4j_main - an info
    2013-06-14 11:47:00,474 [main] WARN  basic.Slf4j_log4j_main - a warn
    2013-06-14 11:47:00,475 [main] ERROR basic.Slf4j_log4j_main - an error
    
    [INFO]: done
    

    【讨论】:

    • 非常感谢。就像,我必须与谁交谈才能获得示例属性文件,Internet?
    【解决方案3】:

    slf4j 是一个 API - 如果您认为它只包含接口而没有类,那么您离我们不远了。

    您需要的行为是在接口的实现中,对于 slf4j 可能是 logback、AVSL、JDK14 (java.util.logging)、log4j 或 Simple。有些可以读取属性,有些则不能。

    对于 logback,您可以使用

    <property file="src/main/java/chapters/configuration/variables1.properties" />
    

    详情请见http://logback.qos.ch/manual/configuration.html#definingProps

    【讨论】: