美文网首页
log4j日志输出时间与系统时间不一致解决办法

log4j日志输出时间与系统时间不一致解决办法

作者: MJLDG | 来源:发表于2019-10-30 20:55 被阅读0次

    这里主要解决的是log配置文件引起的时间不一致问题
    其中是因为配置日志输出格式时使用了这种配法引起的

    %d{yyyy-MM-dd HH:mm:ss,SSS}
    

    逗号分隔两部分配置,其中前面第一个配置是时间格式

    yyyy-MM-dd HH:mm:ss
    

    后面第二个配置是时区的配置,因为这里配置的是SSS,不是有效的时区配置,所以用系统默认的时区配置,配置错误时系统就使用GMT,但是我们使用的是GMT+8,所以日志输出会少8个小时

    SSS
    

    解决办法是不配置后面的时区,不配置的时候会拿当前地区时区配置,所以不配置也是正确的,或者使用正确的时区配置

    %d{yyyy-MM-dd HH:mm:ss}
    

    或者

    %d{yyyy-MM-dd HH:mm:ss,CTT}
    

    CTT 是指上海的时间,具体可查看jdk中 ZoneId 这个类,其中就有各个地方的时区名字,
    源码如下

      public static final Map<String, String> SHORT_IDS;
        static {
            Map<String, String> map = new HashMap<>(64);
            map.put("ACT", "Australia/Darwin");
            map.put("AET", "Australia/Sydney");
            map.put("AGT", "America/Argentina/Buenos_Aires");
            map.put("ART", "Africa/Cairo");
            map.put("AST", "America/Anchorage");
            map.put("BET", "America/Sao_Paulo");
            map.put("BST", "Asia/Dhaka");
            map.put("CAT", "Africa/Harare");
            map.put("CNT", "America/St_Johns");
            map.put("CST", "America/Chicago");
            map.put("CTT", "Asia/Shanghai");
            map.put("EAT", "Africa/Addis_Ababa");
            map.put("ECT", "Europe/Paris");
            map.put("IET", "America/Indiana/Indianapolis");
            map.put("IST", "Asia/Kolkata");
            map.put("JST", "Asia/Tokyo");
            map.put("MIT", "Pacific/Apia");
            map.put("NET", "Asia/Yerevan");
            map.put("NST", "Pacific/Auckland");
            map.put("PLT", "Asia/Karachi");
            map.put("PNT", "America/Phoenix");
            map.put("PRT", "America/Puerto_Rico");
            map.put("PST", "America/Los_Angeles");
            map.put("SST", "Pacific/Guadalcanal");
            map.put("VST", "Asia/Ho_Chi_Minh");
            map.put("EST", "-05:00");
            map.put("MST", "-07:00");
            map.put("HST", "-10:00");
            SHORT_IDS = Collections.unmodifiableMap(map);
        }
    
    

    所以总结来说就是不配置时是正确的,配置错误就使用GMT,配置了存在的时区就使用配置的。
    系统默认的是当地时区,当然可以修改这个,在java bean 中加入这个静态代码块,spring在加载bean的时候就会执行这一段代码,就可以修改系统默认的时区。
    在log配置文件中不配置时区的话会生效,否则这个静态代码的效果会被log日志配置覆盖

    static {
            TimeZone.setDefault(TimeZone.getTimeZone("CTT"));
        }
    
    

    相关文章

      网友评论

          本文标题:log4j日志输出时间与系统时间不一致解决办法

          本文链接:https://www.haomeiwen.com/subject/gflwyctx.html