2017-07-13 5 views
1

J'appelle du code C via JNI de JAVA.JNI printf to log4j

Dans mon C, je fais plusieurs printf que je veux enregistrer avec log4j.

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

Ils apparaissent bien dans la console Eclipse, avec log4j rediriger stdout à mon enregistreur:

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

Quand j'appelle « System.out.println », il est écrit à mon fichier journal .

Mais les imprimantes JNI ne le font pas. Ne sont-ils pas dans la stdout?
Comment puis-je les mettre dans mon fichier journal?

+0

'System.setOut' change où' System.out.println' est dirigé, depuis 'stdout' vers votre flux personnalisé. Cela ne change pas réellement 'stdout'. – bradimus

+0

Y at-il un moyen de capturer tous les stdout? – Romain

Répondre

0

Une chose que vous pouvez faire est d'utiliser dup et dup2 dans votre coeur JNI. De cette façon, vous pouvez associer votre fichier stdout au fichier utilisé par Log4J.

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

Ensuite, dans votre code, vous pouvez l'utiliser comme ceci:

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

Ce n'est pas exactement ce que vous cherchez, mais encore, peut-être une solution pour vous.

+0

Merci pour l'idée – Romain

1

Ils dans stdout.

Le problème est que System.setOut(new PrintStream(new OutputStreamLogger(log, Priority.DEBUG), true)); il suffit d'instruire pour utiliser le flux d'impression personnalisé au lieu de stdout.

Votre problème n'a pas de solution simple.

Le plus simple que je peux imaginer est de vous changer c code pour utiliser Java logger.

Je vous suggère de vivre avec ou de configurer c la journalisation et avoir deux fichiers journaux. Ce sera beaucoup plus facile.

+0

System.setOut réaffecte le flux de sortie standard à mon flux d'impression personnalisé. Si la sortie standard est redirigée vers le nouveau PrintStream, et que printfs se trouve dans la sortie standard, pourquoi ne sont-ils pas redirigés? Est-ce qu'il redirige uniquement les appels explicites? – Romain

+0

Pas du point de vue du système d'exploitation. 'stdout' est un gestionnaire de fichiers avec la valeur' 1' AFAIR. Après cet appel, rien ne se passe avec. – talex

+0

Comment la console Eclipse parvient-elle à les imprimer? Bien sûr, je peux créer un fichier journal à partir de C, mais je voudrais comprendre – Romain