【问题标题】:FileHandler.limit java 7 not workingFileHandler.limit java 7 不工作
【发布时间】:2014-11-01 10:31:47
【问题描述】:

我的 java.util.logging.FileHandler.limit 属性有问题,因为文件大小超过了限制大小 这是我的应用程序中使用的属性

java.util.logging.FileHandler.pattern = ATMChannelAdapter%u.log
java.util.logging.FileHandler.limit = 2000000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

它工作正常,然后在某些时候应用程序只写入一个文件,没有超出配置文件大小的限制,大约 1 GB,要恢复正常配置,我必须重新启动我的应用程序。

操作系统是windows server 2012 java 7

有人有类似的问题吗?这可能在高负载下发生吗?

提前致谢

【问题讨论】:

  • 您发布的配置是整个配置吗?我错过了handlers = java.util.logging.FileHandler 这样的行
  • 还有更多配置属性 handlers= java.util.logging.ConsoleHandler ,java.util.logging.FileHandler .level= INFO 'java.util.logging.ConsoleHandler.level = INFO java.util. logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter'
  • 我还注意到 count 和 size 工作将在第一次滚动,然后当第 10 个文件达到限制时不再滚动并继续按顺序写入最后一个文件
  • 配置看起来不错,应该可以按预期工作。您是否尝试过通过代码实例化和配置 FileHandler? FileHandler(String pattern, int limit, int count)。你可以试试这个吗?如果通过 Code 进行配置,我猜想读取配置文件本身存在一些问题。
  • 感谢您的回复,我已经在使用这个构造函数了,我正面临这个问题,我认为这与 JDK 7 有关

标签: java file logging filehandler


【解决方案1】:

某些东西正在重置您的 LogManager 属性,或者您正在运行到 java.util.logging.FileHandler integer overflow prevents file rotation。尝试安装以下格式化程序,查看防止旋转的条件。

public class FileSimpleFormatter extends SimpleFormatter {

    private static final Field METER;
    private static final Field COUNT;

    static {
        try {
            METER = FileHandler.class.getDeclaredField("meter");
            METER.setAccessible(true);

            COUNT = FileHandler.class.getDeclaredField("count");
            COUNT.setAccessible(true);
        } catch (RuntimeException re) {
            throw re;
        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    private volatile FileHandler h;

    @Override
    public String getHead(Handler h) {
        this.h = FileHandler.class.cast(h);
        return super.getHead(h);
    }

    private String check() {
        FileHandler target = h;
        if (target != null) {
            try {
                Object os = METER.get(target);
                if (os != null && os.getClass().getName().endsWith("MeteredStream")) {
                    Field written = os.getClass().getDeclaredField("written");
                    written.setAccessible(true);
                    Number c = Number.class.cast(COUNT.get(target));
                    Number w = Number.class.cast(written.get(os));
                    if (c.intValue() <= 0 || w.intValue() < 0) {
                        return String.format("target=%1$s count=%2$s written=%3$s%n",
                                target, c, w);
                    }
                }
            } catch (IllegalAccessException ex) {
                throw (Error) new IllegalAccessError(ex.getMessage()).initCause(ex);
            } catch (NoSuchFieldException ex) {
                throw (Error) new NoSuchFieldError(ex.getMessage()).initCause(ex);
            }
        }
        return "";
    }

    @Override
    public String format(LogRecord record) {
        return super.format(record).concat(check());
    }
}

然后搜索您的日志文件以查看是否找到任何内容。

更新:Oracle 正在 JDK-8059767 FileHandler should allow 'long' limits and handle overflow of MeteredStream.written. 下处理此问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2023-03-10
    • 2020-10-04
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多