Mantengo una aplicación que actúa como un contenedor para múltiples programas individuales. Estos programas tienen su propia función de registro dedicada, es decir, todo lo que registran hace a un archivo de registro especial.Eliminando el acceso a System.out en java
Sin embargo, los desarrolladores de aplicaciones parecen amor a tirar System.out.println
y e.printStackTrace
llamadas por todas partes, por lo que es imposible mantener una consola limpia cuando se ejecuta el contenedor.
¿Cómo puedo evitar que estas aplicaciones contaminen System.out
y System.err
?
notas de implementación:
- las aplicaciones de uso Log4J para el registro;
- el contenedor también usa la consola para el registro, pero está estrictamente reservado para eventos y problemas del ciclo de vida, por lo que aún necesito la consola;
- las aplicaciones se cargan utilizando un cargador de clases personalizado, pero no se aplican controles de seguridad.
actualización:
simplemente redirigir System.out
no funcionaría, ya que vuelve a dirigir toda la salida, así que algo como esto falla:
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int b) {
throw new Error("Not on my watch you don't");
}
}));
Logger logger = Logger.getLogger(Runner.class);
logger.info("My log message");
Esto debería suceder.
Actualización 2:
Las aplicaciones se cargan y se configuran mediante un código similar al
App app = new UrlClassLoader(...).loadClass(className)).newInstance();
app.setLogger(loggerForClass(app));
Log4J se carga desde el cargador de clases del sistema.
Esto no es realmente una respuesta, pero: como desarrollador, suelo hacer esto también porque es más fácil verificar la consola en lugar de buscar en los archivos de registro. Así que cuando me registro, primero hago un buscar/reemplazar: buscar 'System.out' (reemplazar con' log.debug() '), buscar' System.err' (reemplazar con 'log.info()'), busque 'printStackTrace' (eliminar). Incluso creo que esto podría estar automatizado para svn por ejemplo (no estoy seguro de cómo, pero creo que se puede hacer) – laura
Hm, en un lenguaje de sistemas el modismo sería 'fork()', redirigir el stdout y stderr del proceso secundario, y luego 'exec()', pero no estoy seguro de cuál es el equivalente con los cargadores de clase Java. ¿Podría entrar en más detalles sobre cómo está cargando las aplicaciones? – thirtyseven
¿El contenedor está utilizando log4j o imprimiendo directamente a la consola? – Fedearne