11
votes

Rediriger system.out.println pour se connecter

Dans ma suite de tests de projet, il y a une grande utilisation de xxx

J'essaie de rediriger ces sorties pour enregistrer un fichier de journal (via la configuration ou du point unique sans refactoriser tout le projet) afin que ce soit être désactivé si nécessaire pour améliorer les performances. J'utilise log4j pour la journalisation. Est-ce que quelqu'un sache est-ce possible? Dans l'affirmative, comment le faire ? Merci d'avance.


2 commentaires

Cette page explique-la très détaillée: Exemples.JavacodeGeeks.com/core-java/lang/system/out/...


N'abandonnez pas le système de redirection d'une sortie, de mordre la balle et d'utiliser une IDE décente et un refacteur de la base de code entière en une fois pour remplacer cela avec LOG.INFO (...) à la place.


5 Réponses :


2
votes

Ma suggestion serait de refacteur si possible. Pour une solution possible, vérifiez ces questions similaires

log4J Rediriger stdout à DailyRollingFileAppender

rediriger system.out.println à Log4J, tout en conservant les informations de nom de classe


0 commentaires

1
votes

Utiliser la redirection de Shell. Déterminez l'invocation «Java» pour votre projet, si vous êtes sur la plupart des systèmes de type UNIX, PS AUX | Grep Java aidera.

Exécutez simplement cette commande avec> / path / to / logfile. Exemple: xxx


1 commentaires

Ce n'est pas la question.



2
votes

Je pense que vous pouvez utiliser system.setout (imprimanteam) pour définir votre sortie dans un flux de sortie de fichier. Ensuite, vous pouvez mettre cette ligne dans votre méthode Beforeclass. J'aime utiliser une classe BaseTest et mettre cette ligne de code dans la méthode Beforeclass de cette classe. Ensuite, faites que tous les cas de test étendent ce CCLASS.


0 commentaires

0
votes
public class RecursiveLogging {
public static void main(String[] args) {
    System.setOut(new PrintStream(new CustomOutputStream()));

    TestMyException.testPrint();
}

}

class CustomOutputStream extends OutputStream {
private Logger logger = Logger.getLogger(this.getClass());

@Override
public final void write(int b) throws IOException {
    // the correct way of doing this would be using a buffer
    // to store characters until a newline is encountered,
    // this implementation is for illustration only
    logger.info((char) b);
}

@Override
public void write(byte[] b, int off, int len) throws IOException {
    if (b == null) {
        throw new NullPointerException();
    } else if ((off < 0) || (off > b.length) || (len < 0) ||
               ((off + len) > b.length) || ((off + len) < 0)) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return;
    }
    byte[] pb = new byte[len];
    for (int i = 0 ; i < len ; i++) {
        pb[i] = (b[off + i]);
    }
    String str = new String(pb);
    logger.info(str);
}
}

0 commentaires

6
votes

étant donné qu'il est préférable de remplacer le system.out.println () code>, parfois nous n'avons pas le choix. Quoi qu'il en soit, j'ai fait un petit utilitaire pour cela:

public class SystemOutToSlf4j extends PrintStream {

  private static final PrintStream originalSystemOut = System.out;
  private static SystemOutToSlf4j systemOutToLogger;

  /**
   * Enable forwarding System.out.println calls to the logger if the stacktrace contains the class parameter
   * @param clazz
   */
  public static void enableForClass(Class clazz) {
    systemOutToLogger = new SystemOutToSlf4j(originalSystemOut, clazz.getName());
    System.setOut(systemOutToLogger);
  }


  /**
   * Enable forwarding System.out.println calls to the logger if the stacktrace contains the package parameter
   * @param packageToLog
   */
  public static void enableForPackage(String packageToLog) {
    systemOutToLogger = new SystemOutToSlf4j(originalSystemOut, packageToLog);
    System.setOut(systemOutToLogger);
  }

  /**
   * Disable forwarding to the logger resetting the standard output to the console
   */
  public static void disable() {
    System.setOut(originalSystemOut);
    systemOutToLogger = null;
  }

  private String packageOrClassToLog;

  private SystemOutToSlf4j(PrintStream original, String packageOrClassToLog) {
    super(original);
    this.packageOrClassToLog = packageOrClassToLog;
  }

  @Override
  public void println(String line) {
    StackTraceElement[] stack = Thread.currentThread().getStackTrace();
    StackTraceElement caller = findCallerToLog(stack);
    if (caller == null) {
      super.println(line);
      return;
    }

    org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(caller.getClass());
    log.info(line);
  }

  public StackTraceElement findCallerToLog(StackTraceElement[] stack) {
    for (StackTraceElement element : stack) {
      if (element.getClassName().startsWith(packageOrClassToLog))
        return element;
    }

    return null;
  }

}


1 commentaires

Dans la méthode println (string) L'appel getlogger (appeler.getclass ()) doit être remplacé par getlogger (appeler.getclassname ()) , Sinon, le cadre de journalisation configuré pour SLF4J imprimera le nom de la classe de StackTraceElement .