java - Log4J 不写入文件

标签 java logging log4j

在我的应用程序中,我想登录到文件和控制台。我在我的类(class)中使用记录器:

 private static Logger LOGGER = Logger.getLogger(CLASSNAME);

配置文件按预期加载(请参阅输出中的 setfile 行):

  DOMConfigurator.configure("c:\\test\\log4j2.xml"); 

输出:

log4j: reset attribute= "false".
log4j: Threshold ="null".
log4j: Level value for root is  [DEBUG].
log4j: root level set to DEBUG
log4j: Class name: [org.apache.log4j.RollingFileAppender]
log4j: Setting property [append] to [false].
log4j: Setting property [maxFileSize] to [10MB].
log4j: Setting property [maxBackupIndex] to [10].
log4j: Setting property [file] to [c:\test\App.log].
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n].
log4j: setFile called: c:\test\App.log, false
log4j: setFile ended
log4j: Adding appender named [file] to category [root].
log4j: Class name: [org.apache.log4j.ConsoleAppender]
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [%d{yyyy-MM-dd HH:mm:ss} %-5p     %c{1}:%L - %m%n].
log4j: Adding appender named [console] to category [root].

但是当我尝试在上面的条目之后直接登录时,我不会得到任何结果

  LOGGER.logp(Level.ALL, CLASSNAME, "TEST", "TEST__");

允许程序写入文件。 无论是否加载文件,控制台输出都有效。

有人发现可能有错误吗?

配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true"  xmlns:log4j='http://jakarta.apache.org/log4j/'>

    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" 
          value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
        </layout>
    </appender>

    <appender name="file" class="org.apache.log4j.RollingFileAppender">
        <param name="append" value="false" />
        <param name="maxFileSize" value="10MB" />
        <param name="maxBackupIndex" value="10" />
        <param name="file" value="c:\\test\\App.log" />
        <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" 
            value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
        </layout>
    </appender>

    <root>
        <level value="DEBUG" />
        <appender-ref ref="file" />
        <appender-ref ref="console" />
    </root>

</log4j:configuration>

编辑:我使用 log4j-1.2.17

Edit2:原来邮件程序组件可以登录文件,而上面的代码仍然只导致登录控制台窗口...

private static final Logger log = Logger.getLogger(Mailer.class);

  public static void logMail(String mailString)
  {
    log.error(mailString);
    log.info(mailString);
  }

最佳答案

所以,基本上你正在尝试使用 jdk 日志记录和 log4j 实现。为此,您需要使用 > log4j 2.0 。并使用 log4j-jul 适配器将对 jdk 日志记录 api 的所有调用路由到 log4j2。

您可以尝试如下.. 依赖关系:

<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jul</artifactId>
        <version>2.1</version>
    </dependency>

示例类文件

package com.test.log4j_test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class App 
{

    private static final String CLASSNAME = "App.class";
    private static Logger LOGGER = Logger.getLogger(CLASSNAME);

    public static void main( String[] args ) throws FileNotFoundException,    IOException
    {
        LOGGER.logp(Level.WARNING, CLASSNAME, "TEST", "TEST__");
    }
}

log4j.xml 文件

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
      <Appenders>
        <File name="A1" fileName="c:\\test\\app.log" append="true">
          <PatternLayout pattern="%t %-5p %c{2} - %m%n"/>
        </File>
        <Console name="STDOUT" target="SYSTEM_OUT">
          <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
        </Console>
      </Appenders>
      <Loggers>
        <Logger name="org.apache.log4j.xml" level="debug">
          <AppenderRef ref="A1"/>
        </Logger>
        <Root level="ALL">
          <AppenderRef ref="STDOUT"/>
          <AppenderRef ref="A1"/>
        </Root>
      </Loggers>
    </Configuration>

要运行该程序,请添加以下 java 属性

-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j.configurationFile=file:///c:/test/log4.xml

关于java - Log4J 不写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31916208/

相关文章:

java - 使用 AmqpAppender for log4j 需要什么依赖项?

java - 使用我的 Facebook 应用程序中的 session key 将用户登录到 Facebook

java - 如何统计HashMap中唯一值的个数?

c# - 从 ActionExecutingContext 获取原始端口?

python - 如何使用pymysql将日志上传到mysql

java - 关闭 Hibernate 日志记录

java - 复制大流时 IOUtils.copy() 挂起?

java - 使用 Maven 编译 Inno Setup 脚本(.iss 文件)?

logging - Neo4j 3.x 非托管扩展 slf4j 问题

Jenkins:类路径包含多个 SLF4J 绑定(bind)