2017-06-30 2 views
-1

Ich bin ein Großprojekt und ich versuche Log4j sowohl auf der Konsole als auch in einer Datei zu loggen. Während der Fehler in der Konsole protokolliert wird, wird keine Datei protokolliert. Ich habe meine log4j.properties im src/main/resources. Ich habe versucht, die Eigenschaftendateien zum src-Ordner sowie zu fast jedem auf SO vorgeschlagenen Ordner ohne Erfolg zu verschieben. Ich habe sowohl rollingFile als auch File innerhalb des log4j versucht. Ist etwas mit der Datei log4j.properties nicht in Ordnung, oder platziere ich die Datei nicht an der richtigen Stelle?Fehler Datei nicht generiert mit log4j

Hier sind meine aktuellen Dateien

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(); 
    } 
} 

Keine der anderen Antworten scheinen für mein Problem zu funktionieren.

Antwort

0

Das scheinbare Problem scheint zu sein, dass Sie Log4j LogManager und Logger-Klassen verwenden. Nehmen Sie die folgenden Änderungen an Ihrer LogTesting Klasse (slf4j ist bereits unter Ihren Abhängigkeiten wie ich sehe)

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 

und es soll den Fehler in der Datei schreiben, wie erwartet.

(auch Sie scheinen die ErrorTester-Klasse ändern zu müssen, da derzeit keine Ausnahme von dort geworfen wird, so dass LogTesting.reportError() nicht aufgerufen wird)