Log4J:如何将输出流或编写器重定向到记录器的编写器?
2022-09-01 05:23:38
我有一个在启动后异步运行的方法,使用 OutputStream 或 Writer 作为参数。
它充当 OutputStream 或 Writer 的录制适配器(它是我无法更改的第三方 API)。
如何将Log4J的内部输出流或写入器传递给该方法?
...因为Log4J吞噬了System.out和System.err,我以前使用过。
我有一个在启动后异步运行的方法,使用 OutputStream 或 Writer 作为参数。
它充当 OutputStream 或 Writer 的录制适配器(它是我无法更改的第三方 API)。
如何将Log4J的内部输出流或写入器传递给该方法?
...因为Log4J吞噬了System.out和System.err,我以前使用过。
我的建议是,你为什么不写你的输出流呢?!我正要为你写一个,但我在网上找到了这个很好的例子,看看吧!
/*
* Jacareto Copyright (c) 2002-2005
* Applied Computer Science Research Group, Darmstadt University of
* Technology, Institute of Mathematics & Computer Science,
* Ludwigsburg University of Education, and Computer Based
* Learning Research Group, Aachen University. All rights reserved.
*
* Jacareto is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* Jacareto is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with Jacareto; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
package jacareto.toolkit.log4j;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import java.io.OutputStream;
/**
* This class logs all bytes written to it as output stream with a specified logging level.
*
* @author <a href="mailto:cspannagel@web.de">Christian Spannagel</a>
* @version 1.0
*/
public class LogOutputStream extends OutputStream {
/** The logger where to log the written bytes. */
private Logger logger;
/** The level. */
private Level level;
/** The internal memory for the written bytes. */
private String mem;
/**
* Creates a new log output stream which logs bytes to the specified logger with the specified
* level.
*
* @param logger the logger where to log the written bytes
* @param level the level
*/
public LogOutputStream (Logger logger, Level level) {
setLogger (logger);
setLevel (level);
mem = "";
}
/**
* Sets the logger where to log the bytes.
*
* @param logger the logger
*/
public void setLogger (Logger logger) {
this.logger = logger;
}
/**
* Returns the logger.
*
* @return DOCUMENT ME!
*/
public Logger getLogger () {
return logger;
}
/**
* Sets the logging level.
*
* @param level DOCUMENT ME!
*/
public void setLevel (Level level) {
this.level = level;
}
/**
* Returns the logging level.
*
* @return DOCUMENT ME!
*/
public Level getLevel () {
return level;
}
/**
* Writes a byte to the output stream. This method flushes automatically at the end of a line.
*
* @param b DOCUMENT ME!
*/
public void write (int b) {
byte[] bytes = new byte[1];
bytes[0] = (byte) (b & 0xff);
mem = mem + new String(bytes);
if (mem.endsWith ("\n")) {
mem = mem.substring (0, mem.length () - 1);
flush ();
}
}
/**
* Flushes the output stream.
*/
public void flush () {
logger.log (level, mem);
mem = "";
}
}
您可以使用 Log4j IOStreams
IOStreams组件是一个Log4j API扩展,它提供了来自 java.io 的许多类,这些类可以在写入另一个输出流或编写器的同时写入记录器,或者输入流或读取器读取的内容可以由记录器进行线窃听。
您可以通过以下方式创建输出流:
OutputStream outputStream = IoBuilder
.forLogger(logger)
.buildOutputStream();
下面是一个 Appium 的例子,以编程方式启动它,并使用 log4j 控制它的日志。
final Logger logger = LogManager.getLogger(getClass());
cap = new DesiredCapabilities();
cap.setCapability("noReset", "false");
//Build the Appium service
builder = new AppiumServiceBuilder();
builder.withIPAddress("127.0.0.1");
builder.usingPort(4723);
builder.withCapabilities(cap);
builder.withArgument(GeneralServerFlag.SESSION_OVERRIDE);
builder.withArgument(GeneralServerFlag.LOG_LEVEL,"debug");
//Start the server with the builder
service = AppiumDriverLocalService.buildService(builder);
OutputStream outputStream = IoBuilder
.forLogger(logger)
.buildOutputStream();
service.addOutPutStream(outputStream);
service.start();
希望这有帮助!!!