如何创建每天使用java.util.logging.Logger自动生成的回滚日志?

如何创建每天使用java.util.logging.Logger自动生成的回滚日志?,java,spring,logging,log4j,java.util.logging,Java,Spring,Logging,Log4j,Java.util.logging,我使用以下代码根据我的要求创建自定义日志 但是无法获得回滚功能,因为java.util.logging.Logger不支持它 我可以实施哪些选项 是否可以使用相同的库自动生成回滚日志 代码: private static class MyCustomFormatterforUpdate extends java.util.logging.Formatter { @Override public String format(LogRecord record) {

我使用以下代码根据我的要求创建自定义日志

但是无法获得回滚功能,因为
java.util.logging.Logger
不支持它

我可以实施哪些选项

是否可以使用相同的库自动生成回滚日志

代码:

private static class MyCustomFormatterforUpdate extends java.util.logging.Formatter {

    @Override
    public String format(LogRecord record) {
        StringBuffer sb = new StringBuffer();
        sb.append("update ApiStatistics set RespDateTime =");
        sb.append(record.getMessage());
        sb.append(";");
        sb.append("\n");
        return sb.toString();
    }

}

java.util.logging.Logger updatefile = java.util.logging.Logger.getLogger("Update Script");
boolean appendu = false;
FileHandler fhu;

{
    try {
        fhu = new FileHandler("src/main/resources/updatescript.log",appendu);
        updatefile.addHandler(fhu);
        fhu.setFormatter(new MyCustomFormatterforUpdate());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

建议您使用其他具有许多特性的日志框架 而不是
java.util.logging.Logger

有用的链接


  • 建议您使用其他具有许多特性的日志框架 而不是
    java.util.logging.Logger

    有用的链接

  • 在此基础上,您只需要构建在该答案中推断出的代理实现。其想法是安装一个代理处理程序,允许您打开和关闭FileHandler对象。这启用了所需的旋转。下面是一个工作示例,它将在日期更改时进行轮换。测试用例包括在内,默认情况下,输出将显示在主文件夹中

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.Charset;
    import java.util.Calendar;
    import java.util.logging.ErrorManager;
    import java.util.logging.FileHandler;
    import java.util.logging.Filter;
    import java.util.logging.Formatter;
    import java.util.logging.Handler;
    import java.util.logging.Level;
    import java.util.logging.LogManager;
    import java.util.logging.LogRecord;
    import java.util.logging.SimpleFormatter;
    import java.util.logging.XMLFormatter;
    
    public class DailyFileHandler extends Handler {
        
        public static void main(String[] args) throws IOException {
            DailyFileHandler dfh = new DailyFileHandler();
            try {
                dfh.setFormatter(new SimpleFormatter());
                LogRecord r1 = new LogRecord(Level.SEVERE, "test 1");
                LogRecord r2 = new LogRecord(Level.SEVERE, "test 2");
                r2.setMillis(r1.getMillis() + (24L * 60L * 60L * 1000L));
                dfh.publish(r1);
                dfh.publish(r2);
                
            } finally {
                dfh.close();
            }
        }
        
        private Calendar current = Calendar.getInstance();
        private FileHandler target;
        
        public DailyFileHandler() throws IOException {
            target = new FileHandler(pattern(), limit(), count(), false);
            init();
        }
        
        public DailyFileHandler(String pattern, int limit, int count)
                throws IOException {
            target = new FileHandler(pattern, limit, count, false);
            init();
        }
        
        private void init() {
            super.setLevel(level());
            super.setFormatter(formatter());
            super.setFilter(filter());
            try {
                super.setEncoding(encoding());
            } catch (UnsupportedEncodingException impossible) {
                throw new AssertionError(impossible);
            }
            initTarget();
        }
        
        private void initTarget() {
            target.setErrorManager(super.getErrorManager());
            target.setLevel(super.getLevel());
            target.setFormatter(super.getFormatter());
            target.setFilter(super.getFilter());
            try {
                target.setEncoding(super.getEncoding());
            } catch (UnsupportedEncodingException impossible) {
                throw new AssertionError(impossible);
            }
        }
        
        private void rotate() {
            String pattern = pattern();
            int count = count();
            int limit = limit();
            try {
                super.setErrorManager(target.getErrorManager());
                target.close();
                
                FileHandler rotate = new FileHandler(pattern, 0, count, false);
                rotate.setFormatter(new SimpleFormatter()); //empty tail.
                rotate.close();
                
                current = Calendar.getInstance();
                target = new FileHandler(pattern, limit, count, true);
                initTarget();
            } catch (RuntimeException | IOException e) {
                this.reportError("", e, ErrorManager.OPEN_FAILURE);
            }
        }
        
        private boolean shouldRotate(long millis) {
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(millis);
            return cal.get(Calendar.DAY_OF_YEAR) != current.get(Calendar.DAY_OF_YEAR);
        }
    
        @Override
        public synchronized void publish(LogRecord record) {
            if (shouldRotate(record.getMillis())) {
                rotate();
            }
            target.publish(record);
        }
    
        @Override
        public synchronized void close() throws SecurityException {
            target.close();
        }
    
        @Override
        public synchronized void setEncoding(String encoding) throws SecurityException, UnsupportedEncodingException {
            target.setEncoding(encoding);
            super.setEncoding(encoding);
        }
    
        @Override
        public synchronized boolean isLoggable(LogRecord record) {
            return target.isLoggable(record);
        }
    
        @Override
        public synchronized void flush() {
            target.flush();
        }
    
        @Override
        public synchronized void setFormatter(Formatter newFormatter) {
            target.setFormatter(newFormatter);
            super.setFormatter(newFormatter);
        }
    
        @Override
        public synchronized Formatter getFormatter() {
            return target.getFormatter();
        }
    
        @Override
        public synchronized String getEncoding() {
            return target.getEncoding();
        }
    
        @Override
        public synchronized void setFilter(Filter newFilter) throws SecurityException {
            target.setFilter(newFilter);
            super.setFilter(newFilter);
        }
    
        @Override
        public synchronized Filter getFilter() {
            return target.getFilter();
        }
    
        @Override
        public synchronized void setErrorManager(ErrorManager em) {
            target.setErrorManager(em);
            super.setErrorManager(em);
        }
    
        @Override
        public synchronized ErrorManager getErrorManager() {
            return target.getErrorManager();
        }
    
        @Override
        public synchronized void setLevel(Level newLevel) throws SecurityException {
            target.setLevel(newLevel);
            super.setLevel(newLevel);
        }
    
        @Override
        public synchronized Level getLevel() {
            return target.getLevel();
        }
    
        private String pattern() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String pattern = m.getProperty(p + ".pattern");
            if (pattern == null) {
                pattern = "%h/java%u.log";
            }
            return pattern;
        }
        
        private int limit() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".limit");
            int limit = v == null ? Integer.MAX_VALUE : Integer.parseInt(v);
            return limit;
        }
        
        private int count() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".count");
            int limit = v == null ? 7 : Integer.parseInt(v);
            return limit;
        }
        
        private Level level() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".level");
            if (v != null) {
                try {
                    return Level.parse(v);
                } catch (Exception e) {
                    this.reportError(v, e, ErrorManager.OPEN_FAILURE);
                }
            }
            return Level.ALL;
        }
        
        private Formatter formatter() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".formatter");
            if (v != null) {
                try {
                    return Formatter.class.cast(Class.forName(v).newInstance());
                } catch (Exception e) {
                    this.reportError("", e, ErrorManager.OPEN_FAILURE);
                }
            }
            return new XMLFormatter();
        }
        
        private Filter filter() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".filter");
            if (v != null) {
                try {
                    return Filter.class.cast(Class.forName(v).newInstance());
                } catch (Exception e) {
                    this.reportError("", e, ErrorManager.OPEN_FAILURE);
                }
            }
            return null;
        }
        
        private String encoding() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".encoding");
            if (v != null) {
                try {
                    return Charset.forName(v).name();
                } catch (Exception e) {
                    this.reportError(v, e, ErrorManager.OPEN_FAILURE);
                }
            }
            return null;
        }
    }
    
    在此基础上,您只需要构建在该答案中推断出的代理实现。其想法是安装一个代理处理程序,允许您打开和关闭FileHandler对象。这启用了所需的旋转。下面是一个工作示例,它将在日期更改时进行轮换。测试用例包括在内,默认情况下,输出将显示在主文件夹中

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.Charset;
    import java.util.Calendar;
    import java.util.logging.ErrorManager;
    import java.util.logging.FileHandler;
    import java.util.logging.Filter;
    import java.util.logging.Formatter;
    import java.util.logging.Handler;
    import java.util.logging.Level;
    import java.util.logging.LogManager;
    import java.util.logging.LogRecord;
    import java.util.logging.SimpleFormatter;
    import java.util.logging.XMLFormatter;
    
    public class DailyFileHandler extends Handler {
        
        public static void main(String[] args) throws IOException {
            DailyFileHandler dfh = new DailyFileHandler();
            try {
                dfh.setFormatter(new SimpleFormatter());
                LogRecord r1 = new LogRecord(Level.SEVERE, "test 1");
                LogRecord r2 = new LogRecord(Level.SEVERE, "test 2");
                r2.setMillis(r1.getMillis() + (24L * 60L * 60L * 1000L));
                dfh.publish(r1);
                dfh.publish(r2);
                
            } finally {
                dfh.close();
            }
        }
        
        private Calendar current = Calendar.getInstance();
        private FileHandler target;
        
        public DailyFileHandler() throws IOException {
            target = new FileHandler(pattern(), limit(), count(), false);
            init();
        }
        
        public DailyFileHandler(String pattern, int limit, int count)
                throws IOException {
            target = new FileHandler(pattern, limit, count, false);
            init();
        }
        
        private void init() {
            super.setLevel(level());
            super.setFormatter(formatter());
            super.setFilter(filter());
            try {
                super.setEncoding(encoding());
            } catch (UnsupportedEncodingException impossible) {
                throw new AssertionError(impossible);
            }
            initTarget();
        }
        
        private void initTarget() {
            target.setErrorManager(super.getErrorManager());
            target.setLevel(super.getLevel());
            target.setFormatter(super.getFormatter());
            target.setFilter(super.getFilter());
            try {
                target.setEncoding(super.getEncoding());
            } catch (UnsupportedEncodingException impossible) {
                throw new AssertionError(impossible);
            }
        }
        
        private void rotate() {
            String pattern = pattern();
            int count = count();
            int limit = limit();
            try {
                super.setErrorManager(target.getErrorManager());
                target.close();
                
                FileHandler rotate = new FileHandler(pattern, 0, count, false);
                rotate.setFormatter(new SimpleFormatter()); //empty tail.
                rotate.close();
                
                current = Calendar.getInstance();
                target = new FileHandler(pattern, limit, count, true);
                initTarget();
            } catch (RuntimeException | IOException e) {
                this.reportError("", e, ErrorManager.OPEN_FAILURE);
            }
        }
        
        private boolean shouldRotate(long millis) {
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(millis);
            return cal.get(Calendar.DAY_OF_YEAR) != current.get(Calendar.DAY_OF_YEAR);
        }
    
        @Override
        public synchronized void publish(LogRecord record) {
            if (shouldRotate(record.getMillis())) {
                rotate();
            }
            target.publish(record);
        }
    
        @Override
        public synchronized void close() throws SecurityException {
            target.close();
        }
    
        @Override
        public synchronized void setEncoding(String encoding) throws SecurityException, UnsupportedEncodingException {
            target.setEncoding(encoding);
            super.setEncoding(encoding);
        }
    
        @Override
        public synchronized boolean isLoggable(LogRecord record) {
            return target.isLoggable(record);
        }
    
        @Override
        public synchronized void flush() {
            target.flush();
        }
    
        @Override
        public synchronized void setFormatter(Formatter newFormatter) {
            target.setFormatter(newFormatter);
            super.setFormatter(newFormatter);
        }
    
        @Override
        public synchronized Formatter getFormatter() {
            return target.getFormatter();
        }
    
        @Override
        public synchronized String getEncoding() {
            return target.getEncoding();
        }
    
        @Override
        public synchronized void setFilter(Filter newFilter) throws SecurityException {
            target.setFilter(newFilter);
            super.setFilter(newFilter);
        }
    
        @Override
        public synchronized Filter getFilter() {
            return target.getFilter();
        }
    
        @Override
        public synchronized void setErrorManager(ErrorManager em) {
            target.setErrorManager(em);
            super.setErrorManager(em);
        }
    
        @Override
        public synchronized ErrorManager getErrorManager() {
            return target.getErrorManager();
        }
    
        @Override
        public synchronized void setLevel(Level newLevel) throws SecurityException {
            target.setLevel(newLevel);
            super.setLevel(newLevel);
        }
    
        @Override
        public synchronized Level getLevel() {
            return target.getLevel();
        }
    
        private String pattern() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String pattern = m.getProperty(p + ".pattern");
            if (pattern == null) {
                pattern = "%h/java%u.log";
            }
            return pattern;
        }
        
        private int limit() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".limit");
            int limit = v == null ? Integer.MAX_VALUE : Integer.parseInt(v);
            return limit;
        }
        
        private int count() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".count");
            int limit = v == null ? 7 : Integer.parseInt(v);
            return limit;
        }
        
        private Level level() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".level");
            if (v != null) {
                try {
                    return Level.parse(v);
                } catch (Exception e) {
                    this.reportError(v, e, ErrorManager.OPEN_FAILURE);
                }
            }
            return Level.ALL;
        }
        
        private Formatter formatter() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".formatter");
            if (v != null) {
                try {
                    return Formatter.class.cast(Class.forName(v).newInstance());
                } catch (Exception e) {
                    this.reportError("", e, ErrorManager.OPEN_FAILURE);
                }
            }
            return new XMLFormatter();
        }
        
        private Filter filter() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".filter");
            if (v != null) {
                try {
                    return Filter.class.cast(Class.forName(v).newInstance());
                } catch (Exception e) {
                    this.reportError("", e, ErrorManager.OPEN_FAILURE);
                }
            }
            return null;
        }
        
        private String encoding() {
            LogManager m = LogManager.getLogManager();
            String p = getClass().getName();
            String v = m.getProperty(p + ".encoding");
            if (v != null) {
                try {
                    return Charset.forName(v).name();
                } catch (Exception e) {
                    this.reportError(v, e, ErrorManager.OPEN_FAILURE);
                }
            }
            return null;
        }
    }
    

    回答你的问题了吗?没有,因为它只回答了部分问题。我正在寻找一个解决方案,每天都这样做。上述解决方案适用于每次通话。进一步的回答是,您使用的日志实用程序不支持该功能。恐怕你得换一个。或者,该问题的最后一个答案可能有效,因为它依赖于每天运行的任务。我可以使用哪些支持自定义格式设置程序和文件处理程序的库?回答您的问题了吗?没有,因为它只部分回答了问题。我正在寻找一种每天都执行的解决方案。上述解决方案适用于每次通话。进一步的回答是,您使用的日志实用程序不支持该功能。恐怕你得换一个。或者,这个问题的最后一个答案可能有效,因为它依赖于每天运行的任务。我可以使用哪些库来支持自定义格式化程序和文件处理程序?我需要回滚和文件格式化程序功能。对于我的情况,哪一个库可能是最好的库?我添加了log4j格式化和滚动概念的示例链接,希望这会有所帮助我需要回滚和文件格式化程序功能。对于我的案例,哪一个是最好的库?我添加了log4j格式化和滚动概念的示例链接,希望这会有所帮助