web-dev-qa-db-ja.com

slf4jログファイルはどこに保存されますか?

私は次のインポートを持っています:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

および次のインスタンス化:

private static Logger logger = LoggerFactory.getLogger(Test.class);

私のメインメソッドでは次のとおりです:

logger.info("SOME MESSAGE: ");

しかし、どこにも出力を見つけることができません。私が見るすべては私のコンソールにあるということです:

21:21:24.235 [main] INFO  some_folder.Test - SOME MESSAGE: 

ログファイルを見つけるにはどうすればよいですか?

ビルドパスには次のものがあります。

slf4j-api-1.7.5.jar

slf4j-log4j12-1.6.4.jar

私は同様の質問に対する答えを読みましたが、実際に問題を解決する方法を言う人はいません。

50
user2763361

slf4jはAPIのみです。具体的な実装(log4jなど)が必要です。この具体的な実装には、ログの保存場所を指定する構成ファイルがあります。

enter image description here

Slf4jがロガーでログメッセージをキャッチすると、メッセージの処理方法を決定するアペンダーに渡されます。デフォルトでは、ConsoleAppenderはコンソールにメッセージを表示します。

デフォルトの構成ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">

  <Appenders>
    <!-- By default => console -->
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>

  <Loggers>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

構成ファイルをクラスパスで使用可能にすると、具体的な実装(この場合はlog4j)がそれを見つけて使用します。 Log4Jのドキュメント を参照してください

ファイルアペンダーの例:

<Appenders>
<File name="File" fileName="${filename}">
  <PatternLayout>
    <pattern>%d %p %C{1.} [%t] %m%n</pattern>
  </PatternLayout>
</File>

...
</Appenders>

ファイルアペンダーを使用した完全な例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">

  <Appenders>
    <File name="File" fileName="${filename}">
      <PatternLayout>
        <pattern>%d %p %C{1.} [%t] %m%n</pattern>
      </PatternLayout>
    </File>
  </Appenders>

  <Loggers>
    <Root level="error">
      <AppenderRef ref="File"/>
    </Root>
  </Loggers>

</Configuration>
44

すでに述べたように、その外観は単なるものであり、異なるロガーの実装を簡単に切り替えるのに役立ちます。たとえば、log4j実装を使用する場合。

サンプルコードは次のようになります。

Mavenを使用する場合、依存関係を取得します

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.6</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>

Src/main/resources/log4j.propertiesの場所のlog4j.propertiesに以下を用意します。

            log4j.rootLogger=DEBUG, STDOUT, file

            log4j.appender.STDOUT=org.Apache.log4j.ConsoleAppender
            log4j.appender.STDOUT.layout=org.Apache.log4j.PatternLayout
            log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

            log4j.appender.file=org.Apache.log4j.RollingFileAppender
            log4j.appender.file.File=mylogs.log
            log4j.appender.file.layout=org.Apache.log4j.PatternLayout
            log4j.appender.file.layout.ConversionPattern=%d{dd-MM-yyyy HH:mm:ss} %-5p %c{1}:%L - %m%n

以下のHello Worldコードは、上記の構成に従ってコンソールおよびログファイルに出力されます。

            import org.slf4j.Logger;
            import org.slf4j.LoggerFactory;

            public class HelloWorld {
              public static void main(String[] args) {
                Logger logger = LoggerFactory.getLogger(HelloWorld.class);
                logger.info("Hello World");
              }
            }

enter image description here

31
Jay

デフォルトではファイルに書き込みません。 RollingFileAppenderのようなものを構成し、ルートロガーに書き込みを行う必要があります(デフォルトのConsoleAppenderに加えて)。

3
jmkgreen

Slf4j構成ファイルの場所を次の引数を使用してJava runコマンドに渡す必要があるため、ログファイルは表示されません。

-Dlogging.config = {file_location}\log4j2.xml

-Dlog4j.configurationFile = {file_location}\log4j2.xml

1