java - syslog4j 在 rsyslog 重新启动时停止记录

标签 java logging syslog rsyslog syslog4j

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 重新启动之前,上面的代码可以正常工作。那时,系统日志中不再出现任何消​​息,尽管一切似乎都正常。

最佳答案

类似于此的 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);
            }
        }
    };

关于java - syslog4j 在 rsyslog 重新启动时停止记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35329217/

相关文章:

linux - 从 nginx 日志文件的 IP 地址获取热门网址

python - 如何在中间件FastAPI python中获取当前活跃用户

ruby-on-rails - 在生产中禁用 Rails 路由日志

php - 当我尝试为设施 LOG_LOCAL1 配置日志时出现 syslog-ng 错误

javafx 时间线中的 java.util.ConcurrentModificationException

java - Room Insert 仅插入主键而不插入列

java - Unix 时间戳(UTC)和 Java UTC 相同吗?我们可以比较吗?

java - 从设备获取当前时间毫秒并将其转换为具有不同时区的新日期

python:测试发送日志到系统日志服务器

linux - syslog 性能可以提高吗?