一个进程里两处日志时间时区不一样的问题

全球时间标准:24时区、GMT、UTC深度解析 协调世界时(UTC)是目前全球使用最广泛的时间标准,它的定义和重要性是现代通信、运输、商业和科学研究不可或缺的组成部分。UTC通过原子时钟的精确计量,以及对历史上的格林尼治标准时间(GMT)的继承与改良,为全世界提供了一个统一、准确的时间参考。UTC的定义是以国际原子时(TAI)为基础,以秒为时间单位,通过在必要时引入闰秒的方式来与地球自转保持同步。地球自转速度的变化会直接影响到基于地球自转的时间标准,如UT1。为了解决这一问题,UTC引入了闰秒,以维持与UT1的差异在0.9秒以内。 阅读详情

    最近发现一个进程里打出来的日志里时区不一样,一个是UTC时间,2018-09-12 10:48:12.278,一个是北京时间2018-09-12 18:48:15.453。北京时间的是log4j输出的,UTC时间的是我们自己输出的,我们自己的时间字符串来源是大概如下两行代码:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String dateString = dateFormat.format(new Date());

Log4j的时间是怎么来的呢?
以log4j1为例,有如下调用关系 
RollingFileAppender.subAppend()->WriterAppender.subAppend()-> PatternLayout.format() -> BridgePatternConverter.format() -> FormattingInfo.format() -> DatePatternConverter.format() -> CachedDateFormat.format()
那CachedDateFormat是怎么初始化的呢? DatePatternConverter 构造方法中可以看到

    if ((options != null) && (options.length > 1)) {
      TimeZone tz = TimeZone.getTimeZone((String) options[1]);
      simpleFormat.setTimeZone(tz);
    } else {
      simpleFormat = new DefaultZoneDateFormat(simpleFormat);
    }
    df = new CachedDateFormat(simpleFormat, maximumCacheValidity);


可以在log4j.xml中指定时区(比如"%d{ISO8601}{GMT-4}  %m%n"),如果不指定则是使用操作系统默认时区

log4j2中则是
RollingFileAppender.append() -> AbstractOutputStreamAppender.append() -> AbstractOutputStreamAppender.tryAppend() -> AbstractOutputStreamAppender.writeByteArrayToManager() -> AbstractStringLayout.toByteArray() -> PatternLayout.toSerializable() -> PatternLayout.PatternSerializer.toSerializable()->PatternLayout.PatternSerializer.toSerializable() -> PatternFormatter.format() —> DatePatternConverter.format()—> DatePatternConverter.formatWithoutAllocation()
在DatePatternConverter 类的 createNonFixedFormatter 可以看到

        TimeZone tz = null;
        if (options.length > 1 && options[1] != null) {
            tz = TimeZone.getTimeZone(options[1]);
        }

        try {
            final FastDateFormat tempFormat = FastDateFormat.getInstance(pattern, tz);
            return new PatternFormatter(tempFormat);

在不设置tz的情况下 timeZone = TimeZone.getDefault();
FormatCache 来cache每种类型;
不论log4j1还是log4j2,可以确定如下几点:
1.如果不配置时区,都是使用默认时区
2.时区初始化好了就不会变化
3.一个Appender对象一种格式化对象(log4j2是FastDateFormat对象;log4j1是DefaultZoneDateFormat)

 

回到问题,我们自己的和logj对时间的时区处理都是基于TimeZone.getDefault()来的,为什么会一个是UTC一个是CST呢?
后来定位到是因为我们自己自己懒加载的bean里有静态块
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
那么问题就清楚了,log4j的LOGGER和Appender对象初始化时先读取了操作系统的CST时间,然后对象一直没变;然后我们代码修改了时区,导致我们代码打出来的时间为UTC。

Log4j 配置日志打印时区的实现方法 下面小编就为大家分享一篇Log4j 配置日志打印时区的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 立即下载

相关推荐

主流算力卡性能对比分析

超大规模AI训练/HPC:优先选择NVIDIA H100或AMD MI300X,需关注显存带宽和多卡互联能力。企业级AI训练:NVIDIA A100性价比更高,生态成熟。国内自主可控需求:华为昇腾910B是首选,支持液冷和低功耗设计。本地AI推理/游戏:NVIDIA RTX 4090或RTX 5090性价比突出,但需注意显存容量限制。边缘计算/低功耗场景:华为昇腾310或清微智能TX536(能效比6.3TOPS/W@INT8)更合适。

m0_69867914的博客 7795

log4j设置日志的时区

对于跨时区部署的服务,为了保证时间的一致性,通常将服务的时区设置为UTC时区,但是这样会导致日志打印的时区也变成UTC。由于用户所在的时区与日志打印的时区不同,测试、开发和运维定位问题带来不变。因此,需要能够调整日志打印的时区。本文提供了两种修改日志打印时区的方案。......

每天学习一点点,每天记录一点点 2270

BACnet/IP BBMD跨网段通信深度解析与最佳实践

本文介绍了在BACnet/IP网络中通过BBMD实现跨子网设备通信的关键配置方法。重点阐述了广播分发表(BDT)中掩码设置的重要性:使用子网掩码(255.255.255.0)会导致路由器拦截广播消息,而必须采用主机掩码(255.255.255.255)才能启用单播隧道机制,使BACnet广播消息封装为可路由的单播UDP包。文章详细说明了BDT条目的正确配置格式、BIP广播地址的作用,并提供了验证步骤,强调在跨网段场景中,正确设置掩码是确保设备发现和通信成功的关键因素。

零一架构师的专栏 1536

graylog中如何修改表头的时间戳,显示毫秒数

graylog

乘风的博客 413

Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (一)

先把这连个都添加到场景中,然后把kinect的depth相机拖到vision sensor中,把kinect的script也拖到vision sensor中,同时要注意修改深度相机的坐标,及修改script,删掉/rgb部分。由于需要导入到仿真场景中PDF文件不能直接导入,所以需要生成图下文件,使用windows自带的画图工具,生成以厘米为单位的图像格式,大小和标定板的设置大小一直。可以生成需要用的标定板的文件,设置标定板的大小,棋盘格的大小,等相关的参数,之后可以保存PDF文件。设置plane的大小。

hong3731的专栏 1753

DeepSeek Harness 工程实践与高级特性:从测试到安全的完整指南

AI Agent 能执行命令、读写文件、自主决策,能力越强风险越大——删文件、泄密钥、死循环、竞态条件随时可能发生。本文是 DeepSeek Harness 系列第三篇,深入剖析其工程实践与高级特性:从单元测试到真实 API 冒烟测试的分层策略,拒绝 Mock 依赖、坚持"验证世界而非自我报告";从正交结果、规范化契约到 Dispose 静止的防御式编程铁律;以及跨平台多层进程沙箱、文件系统版本守卫、fail-closed 审批机制、模型编写的工作流引擎与上下文压缩等高级能力。

program哲学 207

Graylog 更改显示的时区(Display timezone)

每个 Graylog 用户都可以配置他们的显示时区。这会更改用于查看日志消息的时区,但不会更改日志消息的原始时区。默认情况下,Graylog 显示 UTC 格式的所有时间戳。这样调整后重启 Graylog 服务器就可以看到时间是北京时间了。:Admin 的时区只能通过 Graylog 服务器。

timczm的博客 2858

基于Simulink环境,提供一个关于如何对DC-DC变换器进行效率分析的仿真建模

效率定义:变换器效率通常定义为输出功率与输入功率之比,即 η=PoutPinη=Pin​Pout​​。重要性:高效率意味着更少的能量损失和更好的热管理,对于便携式设备、电动汽车等应用至关重要。挑战开关损耗:高频操作带来的开关器件损耗。导通损耗:电流流过电阻性元件(如MOSFET导通电阻)造成的能量损失。控制策略:优化控制算法以减少损耗。首先明确要模拟的任务内容。设计一个能够支持特定输入输出电压比的DC-DC变换器。根据工作频率和谐振元件值确定合适的电路参数。

xiaoheshang_123的博客 154

【GrayLog日志处理】

一.安装 docker部署 1.mongo docker pull mongo:latest docker run -d --restart=always -p 27017:27017 --name mongo -v /data/db:/data/db -d mongo docker exec -it mongodb /bin/bash 2.elasticsearch docker run --name graylog-elasticsearch -p 9200:9200 -p 9300:9300

frank_0807的博客 1783

YOLO训练/写作脚本目录一览 | 涉及标签格式转换、数据扩充、热力图、感受野、精度曲线、数量统计等近百个脚本文件

在大家购买专栏后,便可获得全部的脚本文件。在获取到文件后,只需按照将程序放在个人项目中即可一键运行。

Limiiiing的博客 2375

基于MATLAB的变分模态分解(VMD)算法详解

变分模态分解(VMD)是一种先进的信号处理方法,通过变分框架将复杂信号分解为多个模态分量。相比传统经验模态分解(EMD),VMD具有坚实的数学基础,能有效抑制模态混叠和端点效应。其核心思想是将信号分解转化为约束优化问题,通过交替方向乘子法迭代求解各模态的中心频率和带宽。VMD在机械故障诊断、生物医学信号处理等领域展现出优越性能,尤其适合处理非平稳非线性信号。该算法通过严格的数学模型实现自适应频谱优化,为信号分析提供了更可靠的工具。

qq_42212808的博客 735

GrayLog 设置日志保留时间每天1个索引,保留183天(6个月)

allway2的博客 4133

mapbox进阶,dem数据转为等高面,加载转换后的等高面到地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,使用dem数据转为等高面,加载转换后的等高面到地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 406

容器时区不一致如何解决?

在使用容器化技术时,容器时区与主机或其他容器不一致可能导致日志时间错误或应用程序时间不同步。以下是解决该问题的常见方法: 挂载主机时区文件:通过挂载主机的/etc/localtime和/etc/timezone文件,使容器与主机时区一致。 设置环境变量:通过TZ环境变量(如TZ=Asia/Shanghai)配置时区,适用于支持该变量的镜像。 手动修改容器时区:在已运行的容器中,通过命令手动更新时区配置。 确保时区数据安装:在轻量级镜像中安装tzdata包以支持时区设置。 Kubernetes中的解决方案:通

运维老生常谈 1610

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Jenkins时区设置终极指南:3步解决日志与构建时间混乱

你是否遇到过Jenkins构建日志时间与本地时间相差8小时的问题?部署在Docker中的Jenkins服务经常出现时区不一致导致的时间混乱,这不仅让日志分析变得困难,更会导致构建任务时间戳错误。本文将通过3个简单步骤彻底解决这一问题,确保你的CI/CD流水线时间系统准确无误。 ## 问题根源:Docker镜像的默认时区陷阱 Jenkins官方Docker镜像([debian/trixie/st

gitblog_00529的博客 1052

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

服务器时区与数据库时区不一致导致时间bug记录

(1)临界点时间(跨天、跨月、跨年)极易受时区影响导致极大误差,出现时间问题时可第一时间查看时区问题(2)机器时区与进程时区并不总是一致,需要摆脱这个惯性思维,用其他方式(如日志)确定进程时区。

程序猿一只 1485

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Ranger】Ranger 审计日志时间与系统时间不一致调整

摘要: Ranger审计日志时间与服务器时间不一致问题分析表明,该问题通常出现在Kerberos集群中,Ranger Admin进程因JVM启动参数显式指定了UTC时区(-Duser.timezone=UTC),导致日志时间出现固定偏移。排查确认操作系统时区配置正常,问题根源在于JVM时区设置。解决方案需调整JVM参数并重启Ranger Admin服务,修复后审计日志时间与系统时间完全对齐,解决了安全事件回溯和跨系统日志对齐问题。

TTBIGDATA的博客 671

Linux 基础操作(九)————系统日志、时间同步、修改时区

上一节总结了ssh服务的用法及配置,这一节主要将系统日志及同步时间、修改时区的方法一、系统日志1、系统日志的分类及所在目录/var/log/messages ##系统服务及日志,包括服务的信息,报错等等 /var/log/secure ##系统认证信息日志 /var/log/maillog ##系统邮件服务信息 /var/log/cron ##系统定时任务信息

eb_28的博客 6236

java linux 时区_Linux系统如何更改时间时区

对于许多与系统相关的任务和进程,使用正确的时区是必不可少的。例如,cron守护进程使用系统的时区执行cron作业,日志文件中的时间戳基于同一系统的时区。环境Centos8检查现在的时区timedatectl是一个命令行实用程序,允许您查看和更改系统的时间和日期。[root@localhost ~]# timedatectlLocal time: Tue 2020-03-31 16:35:23 CS...

weixin_39915367的博客 293

【Docker系列】Docker 容器时间与宿主机不一致

本文详细探讨了Docker容器时间与宿主机时间不一致的问题,特别是中国地区常见的8小时时差问题。文章首先分析了问题的根源,指出Docker容器默认使用UTC时区,而宿主机通常使用CST时区。接着,提供了三种解决方案:挂载宿主机时区文件、在Dockerfile中固化时区、通过环境变量设置时区。每种方法都详细说明了实现原理、具体步骤、优点及注意事项。此外,文章还介绍了在数据库容器和Kubernetes中的高级场景处理,并强调了验证和测试的重要性。最后,作者鼓励读者点赞、收藏,并欢迎批评指正。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 1万+

Docker容器时区不一致怎么办?99%的人都忽略的localtime挂载细节

解决Docker容器时区不一致难题,关键在于localtime挂载。通过挂载宿主机的/etc/localtime文件,可确保容器与主机时区同步,适用于日志记录、定时任务等场景。配置简单且无需修改镜像,提升运维效率。掌握Docker容器时区的localtime处理细节,值得收藏。

LiteCode的博客 1092

Rust 长跑守护进程日志治理:切分、时区与结构化

本文针对长跑守护进程的日志治理问题,提出基于Rust的解决方案。主要解决三大痛点:1)按大小而非天级切分日志,进程内自主管理文件滚动;2)采用带时区的UTC时间戳(ISO8601格式),确保跨机器可对齐;3)结构化日志采用单行紧凑JSON(ndjson),支持jq流式处理。通过tokio异步任务与同步写分离的设计,既保证日志顺序又避免阻塞事件循环。该方案适用于需要小时级回溯、跨机器日志分析等场景,兼容主流日志采集工具。核心代码已封装为可复用的RollingLog组件。

2601_96158891的博客 366

Websphere设置JVM时区解决程序、日志时间快8小时问题

原文链接:http://www.itpub.net/thread-1204714-1-1.html 相信很多使用Websphere的朋友会经常在Windows操作系统中遇到程序时间快8小时的问题 如果是修改操作系统的时区,Windows 2012是UTC+8,而不是GMT时间 但是,修改了操作系统的时区,Websphere的时间问题依然存在 下面说说通过修改Webs

专注于Java技术、软件架构设计、数据分析 3013

紧急修复指南:Docker容器localtime未生效导致的日志时间偏差问题

快速解决Docker容器日志时间偏差问题,详解Docker容器时区的localtime配置方法。适用于日志排查、服务监控等场景,通过挂载宿主机localtime文件实现时区同步,操作简单且稳定可靠。值得收藏的运维技巧,点击了解具体步骤。

FuncWander的博客 900

揭秘Docker容器时间错乱问题:5步实现精准时区同步

解决Docker容器时间错乱,轻松实现精准时区同步。本文详解Docker容器的时区与本地化配置,涵盖宿主机时区映射、环境变量设置等5步实操方法,适用于日志记录、定时任务等场景,确保时间一致性,值得收藏。

DeepLens的博客 875

紧急修复!线上服务因Docker时区不同步导致日志混乱,怎么办?

快速解决Docker容器时区异常问题,本文详解Docker容器时区同步宿主机方法,适用于日志记录、定时任务等场景。通过挂载本地时区文件或设置环境变量实现精准同步,操作简单且无需重构镜像,保障服务时间一致性,值得收藏。

ProceShoal的博客 493
上一篇: 增加一个bean改变spring初始化顺序问题
下一篇: 记录一个正则表达式 cpu 100%的问题
coder_xia
博客等级 码龄17年 151粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值