重新启动rsyslog守护进程之后,syslog4j 0.9.46将无法在不重新启动java进程的情况下成功地写入syslog。没有抛出任何异常,我看不到通过API检查日志是否仍然有效。是否有办法使syslog4j从rsyslog重新启动中恢复,或者至少抛出一个异常,以便可以手动重新启动连接?
样本代码:
import java.util.Scanner;
import org.productivity.java.syslog4j.SyslogConstants;
import org.productivity.java.syslog4j.SyslogIF;
import org.productivity.java.syslog4j.impl.unix.socket.UnixSocketSyslog;
import org.productivity.java.syslog4j.impl.unix.socket.UnixSocketSyslogConfig;
public class SysLogging {
public static void main(String[] args) {
UnixSocketSyslogConfig cfg = new UnixSocketSyslogConfig();
cfg.setFacility(SyslogConstants.FACILITY_LOCAL1);
cfg.removeAllMessageModifiers();
cfg.setIdent(null);
cfg.setThrowExceptionOnWrite(true);
cfg.setWriteRetries(5);
SyslogIF log = new UnixSocketSyslog();
log.initialize(SyslogConstants.UNIX_SOCKET, cfg);
Scanner scanner = new Scanner(System.in);
System.out.println("type quit to quit, anything else to log");
String line = scanner.nextLine();
while(!line.equals("quit")) {
log.info(line);
System.out.println("type quit to quit, anything else to log");
line = scanner.nextLine();
}
scanner.close();
}
}在重新启动rsyslog之前,上面的代码可以像您想象的那样工作。此时,syslog中不再出现任何消息,尽管一切似乎都在正常工作。
发布于 2016-02-11 20:59:02
与此类似的黑客应该会有所帮助:
SyslogIF log = new UnixSocketSyslog() {
@Override
protected void write(int level, byte[] message) throws SyslogRuntimeException {
if (this.fd == -1)
connect();
if (this.fd == -1)
return;
ByteBuffer byteBuffer = ByteBuffer.wrap(message);
int ret = this.libraryInstance.write(this.fd,byteBuffer,message.length);
if (ret < 0) {
shutdown();
connect();
if (this.fd == -1)
return;
ret = this.libraryInstance.write(this.fd,byteBuffer,message.length);
}
}
};https://stackoverflow.com/questions/35329217
复制相似问题