2014-02-19 84 views
31

我有跟着進口: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

我讀的答案類似的問題,但沒有人真正說如何解決這個問題。

+2

SLF4J僅是一個API。你應該有一個具體的實現(例如log4j)。這個具體的實現有一個配置文件,告訴你在哪裏存儲日誌。 –

+1

@ArnaudDenoyelle他以slf4j-log4j12-1.6.4.jar構建,這意味着他包含一個實現。 – jmkgreen

回答

1

默認情況下,它不寫入文件。您需要配置類似RollingFileAppender的東西,並讓根記錄器寫入它(可能除了缺省ConsoleAppender之外)。

+0

假設OP使用log4j –

+0

@CeilingGecko看到我的其他評論 - 他已經聲明,他包括log4j。 – jmkgreen

28

slf4j只是一個API。你應該有一個具體的實現(例如log4j)。這個具體的實現有一個配置文件,告訴你在哪裏存儲日誌。

enter image description here

當SLF4J抓住了一個記錄日誌信息,它被賦予到決定如何處理消息做一個appender。默認情況下,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> 

如果你把在classpath中可用的配置文件,那麼你的具體實現(在你的情況是,log4j)將找到並使用它。請參閱文件的appender Log4J documentation.

例子:

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

... 
</Appenders> 

與文件的appender完整的示例:

<?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> 
+0

我在我的構建路徑上有log4j不是嗎? – user2763361

+0

@ user2763361然後,您應該在您的類路徑中放入一個log4j配置文件,並且log4j將使用它。 –

+0

我需要調用這個配置文件才能找到它? – user2763361

18

前面已經提到它只是一個門面,它可以輕鬆實現不同的記錄器實現之間進行切換。例如,如果你想使用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 /主/資源/ log4j的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

+0

我需要把它放在'src/main/resources'中嗎?因爲我沒有'main'作爲'src'的子文件夾。所以我只是把它放在'src'中。然後我將'mylogs.log'覆蓋到'/ home/user/workspace/project/src/mylogs.log',然後運行'HelloWorld',它不會在所需的位置輸出日誌文件。 (沒有錯誤信息只是沒有輸出) – user2763361

+0

是的,如果它的Maven項目你會自動創建文件夾/ src/main/resources /。請參閱上面的屏幕截圖。 – Jay

+0

這不是Maven項目,所以我只把它放在'src'中。 – user2763361

0

的日誌文件,因爲SLF4J配置文件位置需要傳遞給使用以下參數Java運行命令是不可見的。(例如)

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

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