簡體   English   中英

找不到 log4j2 配置文件。 使用默認配置:僅將錯誤記錄到控制台

[英]No log4j2 configuration file found. Using default configuration: logging only errors to the console

$ java -Dlog4j.configuration=file:///path/to/your/log4j2.xml -jar /path/to/your/jar_file.jar

寫到控制台,你得到

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

但是,看起來配置文件已經找到並且無法解析:

    log4j:WARN Continuable parsing error 2 and column 31
    log4j:WARN Document root element "Configuration", must match DOCTYPE root "null".
    log4j:WARN Continuable parsing error 2 and column 31
    log4j:WARN Document is invalid: no grammar found.
    log4j:ERROR DOM element is - not a <log4j:configuration> element.
    log4j:WARN No appenders could be found for logger (kafka.utils.VerifiableProperties).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

問題一

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

解決方案1

使用 log4j 又名“log4j2”的第 2 版

-Dlog4j.configuration=

應該讀

-Dlog4j.configurationFile=

問題二

log4j:WARN ....

解決方案2

在您的項目中,取消包含 log4j-1.2 jar,而是包含 log4j-1.2-api-2.1.jar。 我不確定如何准確排除 log4j 1.2。 我知道我的項目的什么依賴需要它。 所以,通過一些閱讀,我排除了一堆東西。

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.10</artifactId>
    <version>0.8.2.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>                
        </exclusion>
        <exclusion>
            <groupId>org.apache.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>          
    </exclusions>
</dependency>

我不確定哪些排除項起作用了。 另外,我包含了一個對 1​​.2 api 的依賴,它連接到 2.x。

<!--
    http://logging.apache.org/log4j/2.0/manual/migration.html
    http://logging.apache.org/log4j/2.0/maven-artifacts.html
    Log4j 1.x API Bridge
    If existing components use Log4j 1.x and you want to have this logging
    routed to Log4j 2, then remove any log4j 1.x dependencies and add the
    following.
-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-1.2-api</artifactId>
    <version>2.2</version>
</dependency>

現在,僅進入控制台的 1.2 日志實際上流向了我們的 2.x 附加程序。

如果 Renko在他的評論中指出的那樣,您的類路徑上沒有 log4j-1.2.jar 的財富,您將只會看到消息no log4j2 configuration file found

如果您的配置文件中有錯誤,這是一個問題,因為您不會在啟動時被告知問題出在哪里。

例如,如果您有一個 log4j2 無法處理的 log4j2.yaml 文件,因為例如您沒有為您的項目配置 YAML 解析器,或者您的配置根本不正確。 您將遇到no log4j2 configuration file found消息,沒有更多信息。 即使您有一個有效的 log4j2.xml 文件也是如此,因為 log4j2 只會嘗試處理它找到的第一個配置文件

我發現調試問題的最佳方法是根據上面提到的命令行參數明確說明您希望使用的配置文件。

-Dlog4j.configurationFile=

希望這將幫助您查明問題是否實際上是由您的類加載器未找到 log4j2 配置文件或您的配置中的其他內容引起的。

更新

您還可以使用以下屬性更改狀態記錄器的默認級別以獲取更多信息:

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=<level>

我有同樣的問題,但我在網上閱讀了這個問題后發現我的項目中沒有 log4j2.xml,所以我將相關代碼復制到記事本中並將記事本文件恢復為 xml 並添加到我的項目下文件夾資源。 這個對我有用。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
  <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="DEBUG">
  <AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>

我一直在處理這個問題。 我已經按照這篇文章中的描述更改了所有內容,甚至認為發生了錯誤。 在這種情況下,請確保在更改 .xml 或 .properties 文件中的設置時清理項目。 在eclipse環境中。 選擇項目 -> 清理

我在 java maven 項目中使用 hive jdbc 並且有同樣的問題。

我的方法是在src/main/java/resources下添加一個log4j2.xml文件

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

public class MyClassName {
    private static final Logger LOG = LoggerFactory.getLogger(MyClassName.class);
}

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="<your_package_name>.<your_class_name>" level="debug">
        <AppenderRef ref="Console"/>
        </Logger>
        <Root level="WARN">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

我檢查以驗證日志記錄的東西,

1) 檢查是否沒有舊的 log4j 版本。

mvn dependency:tree | grep log ## ./gradlew dependencies | grep log
[INFO] +- com.prayagupd:log-service:jar:1.0:compile
[INFO] +- org.apache.logging.log4j:log4j-api:jar:2.6.2:compile
[INFO] +- org.apache.logging.log4j:log4j-core:jar:2.6.2:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1.1:compile

2) 確保我正確設置了 log4j2.json,這是通過 -Dlog4j.configurationFile=???

val logConfig: PropertiesConfiguration = new PropertiesConfiguration("application.properties")
System.setProperty("log4j.configurationFile", logConfig.getString("log4j.config.file"))

println("log4j.configurationFile :: " + System.getProperty("log4j.configurationFile"))

或者

Configurator.initialize(null, logConfig.getString("log4j.config.file"));

此外,如果發生自動檢測,請確保文件名是 log4j2.* 而不是 log4j.*

3) 另一項檢查是針對 log4j2.json 的解析器。 感謝 log4j 團隊沒有在 API 中提供解析器。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.0</version>
</dependency>

如果找不到 json 解析器,這可能會引發異常

[Fatal Error] log4j2.json:1:1: Content is not allowed in prolog.

確保您在.../src/main/resources文件夾下放置了log4j2.*文件而不是log4j.*文件。

就我而言,我在 gradle 項目的類路徑中使用 log4j2 Json 文件log4j2.json ,但遇到了同樣的錯誤。

這里的解決方案是將 JSON 處理的依賴項添加到我的 gradle 依賴項中。

compile group:"com.fasterxml.jackson.core", name:"jackson-core", version:'2.8.4'
compile group:"com.fasterxml.jackson.core", name:"jackson-databind", version:'2.8.4'
compile group:"com.fasterxml.jackson.core", name:"jackson-annotations", version:'2.8.4'

另請參閱log4j2 的文檔

JSON 支持使用 Jackson 數據處理器來解析 JSON 文件。 必須將這些依賴項添加到要使用 JSON 進行配置的項目中:

我收到此錯誤是因為 log4j2 文件已從我的 src 文件夾中刪除

只需在 src 文件夾下添加 xml 文件

<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
    </Console>

    <RollingFile name="RollingFile" filename="logs/B2CATA-hybrid.log"
        filepattern="${logPath}/%d{yyyyMMddHHmmss}-fargo.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" />
        <Policies>
            <SizeBasedTriggeringPolicy size="100 MB" />
        </Policies>
        <DefaultRolloverStrategy max="20" />
    </RollingFile>

</Appenders>
<Loggers>
   <Logger name="com.pragiti." level="trace" />
    <Root level="info">
        <AppenderRef ref="Console" />
        <AppenderRef ref="RollingFile" />
    </Root>
</Loggers>

我正在研究 TestNG Maven 項目,這對我log4j2.xml ,通過在pom.xml添加<resources>標簽,這恰好是我的自定義配置文件log4j2.xml的路徑。

<url>http://maven.apache.org</url>
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<build>
  <resources>
    <resource>
      <directory>src/main/java/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M3</version>
        <configuration>
          <suiteXmlFiles>
            <suiteXmlFile>testng.xml</suiteXmlFile>
          </suiteXmlFiles>
        </configuration>
      </plugin>
    </plugins>
  </pluginManagement>
</build>
<dependencies>
  <dependency>

將xml文件名重命名為log4j2.xml后問題解決

測試:log4j-ap 2.13.2,log4j-core 2.13.2。

  1. 將 XML 文件直接保存在下面的文件夾結構下。 源代碼/主/Java
  2. 在 POM 中:
 <build> <resources> <resource> <filtering>false</filtering> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
  1. 清潔和建造。

我通過配置構建路徑解決了這個問題。 以下是我遵循的步驟: 在 eclipse 中。

  1. 創建一個文件夾並將 logj4 文件保存在其中。
  2. 在創建的文件夾中寫入單擊並轉到構建路徑。
  3. 點擊添加文件夾
  4. 選擇創建的文件夾。
  5. 單擊確定並應用並關閉。

現在你應該可以運行了

這有時會在 web servlet 上找到的實際 log4j2 配置文件之前拋出。 至少就我而言,我是這么認為的。 因為我的 web.xml 中已經有了

  <context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>classpath:log4j2-app.xml</param-value>
  </context-param>

並檢查 log4j-web 源; 在班上

org.apache.logging.log4j.web.Log4jWebInitializerImpl

有這條線;

String location = this.substitutor
                 .replace(this.servletContext.getInitParameter("log4jConfiguration"));

所有這些讓我認為這是找到配置之前的臨時日志。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
  <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="DEBUG">
  <AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
  1. 創建一個新的 Text 文檔並復制粘貼上面的代碼並將其保存為 log4j2.xml。

  2. 現在復制這個 log4j2.xml 文件並將其粘貼到 Java 項目的 src 文件夾下。

  3. 再次運行你的java程序,你會看到錯誤消失了。

只需嘗試以下步驟,它就會起作用,

  1. 將 XML 文件直接保存在下面的文件夾結構下。 src/main/java
  2. 確保保存pom.xml文件以防發生任何更改。

Intellij 用戶的答案 2022

如果您使用 Intellij:

請按照以下步驟操作:

  1. 將“資源”文件夾放在“YourProject”根目錄下,並將其標記為“資源根目錄”。

  2. 將“log4j2.xml”放入資源文件夾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM