syslog4j прекращает ведение журнала при перезапуске rsyslog

После перезапуска демона rsyslog syslog4j 0.9.46 больше нельзя успешно записывать в системный журнал без перезапуска процесса Java. Никаких исключений не выдается, и я не вижу способа проверить через 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 не будет перезапущен. В этот момент в системном журнале больше не появляются сообщения, хотя в остальном все работает.


person elhefe    schedule 11.02.2016    source источник


Ответы (1)


Подобный хак должен помочь:

    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);
            }
        }
    };
person rsutormin    schedule 11.02.2016