【问题标题】:Issue creating file for logs with SLF4J and Logback使用 SLF4J 和 Logback 为日志创建文件的问题
【发布时间】:2020-09-17 10:09:07
【问题描述】:

我想在特定文件夹中创建错误日志文件。该文件夹具有以下结构:

app 
  |_ application.jar
  |_ configuration.json
  |_ logs
      |_ log-error.log

我构建了包,当我使用命令行运行应用程序时: java -jar readExternalFilesFromJar-jar-with-dependencies.jar

我确实得到了以下结果:

[main] INFO fr.mydomain.app.ReadJson - Main Application called
[main] INFO fr.mydomain.app.JsonReader - getJson() method called
[main] ERROR fr.mydomain.app.ReadJson - Error message

我在控制台上登录没有问题。我的问题是没有创建日志文件。

我在 pom.xml 中添加了 SLF4J 和 Logback 依赖项:

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.30</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.7.30</version>
</dependency>

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-core</artifactId>
  <version>1.2.3</version>
</dependency>

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>

我还尝试使用资源文件夹中的 logback.xml 文件配置 Logback:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <timestamp key="times" datePattern="yyyyMMdd.HHmmss" />

    <appender name="STDOUT" class="ch.qos.logback.core.FileAppender">
        <file>${path}/${log.name}-${times}.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${path}/${log.name}-${times}.log</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <logger name="fr.mydomain.app" level="debug" additivity="false">
        <appender-ref ref="FILE" />
    </logger>

    <logger name="fr.mydomain.app" level="error" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>

    <root level="error">
        <appender-ref ref="FILE" />
    </root>

</configuration>

在我的主类中,我希望能够配置日志文件路径和名称。为什么要在 java 方法中配置这些值?原因很简单。我希望能够从配置文件中读取这些值。

我阅读了一些关于如何设置文件名和路径的文档: https://mkyong.com/logging/logback-set-log-file-name-programmatically/

为此,我添加了以下代码:

public class ReadJson {
    private static Logger logger = LoggerFactory.getLogger(ReadJson.class);

    public static void main( String[] args ) throws Exception {
        System.setProperty("path", "./logs");
        System.setProperty("log.name", "error");
        logger.info("Main Application called");
        // déclaration de variables

        System.setProperty("path", ".");
        System.setProperty("log.name", "error");
        ...
    }
}

【问题讨论】:

    标签: java logback slf4j


    【解决方案1】:

    我用 getLogger 方法创建了一个 LogConfigurer 类:

    public Logger getLogger(Configuration configuration, String docType) {
        ...
        String logFileName = "whateverILog";
        fileAppender = new FileAppender();
        fileAppender.setContext(loggerContext);
        fileAppender.setName("timestamp");
        Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        root.setLevel(Level.ERROR);
        fileAppender.setFile(logFolder + "\\"+ logFilename +".log");
        encoder.setContext(loggerContext);
        encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n");
        encoder.start();
        fileAppender.setEncoder(encoder);
        fileAppender.start();
        logger = loggerContext.getLogger(getClass().getSimpleName());
        logger.addAppender(fileAppender);
    
        // OPTIONAL: print logback internal status messages
        StatusPrinter.print(loggerContext);
        // log something
        logger.debug("Logger Implemented");
        return logger;
    }
    

    在我调用的主要方法中:

    LogConfigurer logConfigurer = new LogConfigurer();
    Logger logger = logConfigurer.getLogger(configuration, docType);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      相关资源
      最近更新 更多