2017-07-13 3 views
1

Ich rufe C-Code über JNI von JAVA.JNI printf zu log4j

In meinem C, mache ich mehrere printf, die ich mit log4j loggen möchte.

printf("Could not find HID device\n"); 
    fflush(stdout); 

Sie zeigen sich fein in der Eclipse-Konsole, mit log4j ich die stdout meinem Logger umleiten:

 System.setOut(new PrintStream(new OutputStreamLogger(log, Priority.DEBUG), true)); 

Als ich "System.out.println" nennen, ist es meiner Protokolldatei geschrieben .

Aber die JNI printfs nicht. Sind sie nicht im Stand?
Wie kann ich sie in mein Logfile einfügen?

+0

"System.setOut" ändert sich, wobei "System.out.println" von "stdout" zu Ihrem benutzerdefinierten Stream geleitet wird. Es ändert nicht wirklich 'stdout'. – bradimus

+0

Gibt es eine Möglichkeit, alle stdout zu erfassen? – Romain

Antwort

0

Eine Sache, die Sie tun können, ist dup und dup2 in Ihrem JNI Kern zu verwenden. Auf diese Weise können Sie Ihr stdout mit der Datei verknüpfen, die von Log4J verwendet wird.

int newStdout(const char *filename, fpos_t *pos) 
{ 
    fflush(stdout); 
    fgetpos(stdout, pos); 
    int fd = dup(fileno(stdout)); 
    freopen(filename, "w", stdout); 
    return fd; 
} 

void revertStdout(int fd, fpos_t *pos) 
{ 
    fflush(stdout); 
    dup2(fd, fileno(stdout)); 
    close(fd); 
    clearerr(stdout); 
    fsetpos(stdout, pos); 
} 

Dann in Ihrem Code können Sie es wie folgt verwenden:

fpos_t pos; 
char filelocation[256] = "some_place"; 
int fd = newStdout(filelocation, &pos); 
// 
//... do some stuff here ... 
//... things that put data into stdout ... 
// 
revertStdout(fd, &pos); 

Das ist nicht genau das, was Sie suchen, aber immer noch, könnte eine Lösung für Sie sein.

+0

Danke für die Idee – Romain

1

Sie in stdout.

Problem ist, dass System.setOut(new PrintStream(new OutputStreamLogger(log, Priority.DEBUG), true)); nur anweisen, benutzerdefinierte Druck Stream statt stdout zu verwenden.

Sie Problem haben keine einfache Lösung.

Einfachste, die ich mir vorstellen kann, ist, Sie zu ändern c Code zu verwenden Java Logger.

Ich empfehle Ihnen, damit zu leben oder setup c Protokollierung und haben zwei Protokolldateien. Es wird viel einfacher sein.

+0

System.setOut weist den benutzerdefinierten Ausgabestream meinem benutzerdefinierten Druckstrom zu. Wenn das stdout auf den neuen PrintStream umgeleitet wird und die printfs im stdout sind, warum werden sie nicht umgeleitet? Leitet es nur explizite Anrufe um? – Romain

+0

Nicht aus Sicht des Betriebssystems. 'stdout' ist ein Dateihandler mit dem Wert' 1' AFAIR. Nach diesem Anruf passiert nichts. – talex

+0

Wie verwaltet die Eclipse-Konsole diese? Natürlich kann ich eine Protokolldatei von C erstellen, aber ich würde gerne verstehen, – Romain