【问题标题】:Error file not generated with log4jlog4j 未生成错误文件
【发布时间】:2017-06-30 15:15:27
【问题描述】:

我正在运行一个 gradle 项目,并且我试图让 log4j 同时登录到控制台和文件。当错误被记录到控制台时,没有文件被记录到。我在 src/main/resources 中有我的 log4j.properties。我尝试将属性文件移动到 src 文件夹以及 SO 上建议的几乎每个文件夹,但均未成功。我也尝试过 log4j 中的 rollingFile 和 File 。 log4j.properties 文件有问题,还是我没有将文件放在正确的位置?

这是我当前的文件

log4j.properties

# root level configurations
log4j.rootLogger=INFO,console,rollingFile

# configuration for console outputs
 log4j.appender.console=org.apache.log4j.ConsoleAppender
 log4j.appender.console.layout=org.apache.log4j.PatternLayout

# configuration for file output (into a file named messages.log)
log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.File=/home/cbolles/devel/testing/gradle_testing/messages.log
log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout 

build.gradle

apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.8.2'
    compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.8.2'
    compile 'org.slf4j:slf4j-log4j12:1.7.18'

    testCompile 'junit:junit:4.12'
}

task(runSimple, dependsOn: 'classes', type: JavaExec) {
    main = 'com.bolles.ErrorTester'
    classpath = sourceSets.main.runtimeClasspath
    args 'mrhaki'
    systemProperty 'simple.message', 'Hello '
}

defaultTasks 'runSimple'

LogTesting.java

package com.bolles;
import java.io.PrintWriter;
import java.io.StringWriter;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LogTesting
{

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

    public static void reportError(Exception e, boolean consoleLog)
    {
        String errorMessage = "";
        if(e.getMessage() != null)
        {
            errorMessage = e.getMessage();
        }

        StringWriter stackTraceWriter = new StringWriter();
        e.printStackTrace( new PrintWriter(stackTraceWriter));
        String stackTrace = stackTraceWriter.toString();

        log.error(errorMessage);
        log.log(Level.ERROR, errorMessage + "\n" + stackTrace);
    }
}

ErrorTester.java

package com.bolles;
public class ErrorTester 
{

    public static void nullStringTest()
    {
        String errorString = null;
        try
        {
            System.out.print(errorString);
        }
        catch(Exception e)
        {
            LogTesting.reportError(e, true);
        }
    }
    public static void main(String[] args)
    {
        nullStringTest();
    }
}

其他答案似乎都不适用于我的问题。

【问题讨论】:

    标签: java gradle log4j


    【解决方案1】:

    明显的问题似乎是您正在使用 log4j 的 LogManager 和 Logger 类。对您的 LogTesting 类进行以下更改(如我所见,slf4j 已经在您的依赖项中)

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    ...
    private static final Logger log = LoggerFactory.getLogger(LogTesting.class);
    ...
    log.error(errorMessage);
    //log.log(Level.ERROR, errorMessage + "\n" + stackTrace); //no such method in slf4j
    

    它也应该按预期将错误写入文件中。

    (您似乎还需要修改 ErrorTester 类,因为目前没有从那里抛出异常,因此不会调用 LogTesting.reportError())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 2013-12-31
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多