2016-02-11 6 views
3

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

ответ

1

Hack похож на это должно помочь:

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); 
      } 
     } 
    }; 
Смежные вопросы