nginx/tomcat日志格式规范

    最近准备设计和开发一套日志收集平台,进而后续进行实时的日志分析、业务监控和预警等。在此之前,需要制定日志的格式规范,当然还有其他的约束性规范,才能良好的实现日志搜集、数据分拣、数据分析等特性。

 

    制定日志格式规范的方式与目的:

    1)所有项目,日志格式统一,可以极大的简化日志收集和分析的复杂度。

    2)nginx、tomcat等日志格式,需要合理,让日志查看和问题排查更加便捷,排除不用的字段信息,增加更多的有效字段。

    3)考虑到日志格式将来总会要变化,但是日志数据会被运维、开发、大数据平台、BI、安全等团队共同使用,为了避免日志格式的变化给所有相关团队带来干扰,降低改动的影响面,我们将日志中的字段进行分“域”;每个域包括多个字段,不同的团队关注不同的域,某个域中的字段列表改动时,不影响其他团队对数据的使用。我们解析日志数据时,首先将日志按照域分隔符分成多个"域",然后根据字段在域中的相对位置来获取字段值,而不是使用字段在整条日志的位置。我们使用“^_^”符号作为域分隔符。

    4)为了便于数据分拣、日志收集,我们约定所有的日志文件名必须遵循统一规则,这对Flume进行数据搜集非常有利。比如nginx日志、tomcat access log、业务日志等,日志的文件名遵循:<project-name>.<tag>.log.<yyyy-MM-dd>.<index>;例如:order-center.error.log.2017-10-11.0,其中<index>为rolling时生成的索引号。统一日志名称的原因是:易于通过文件名了解日志的来源和核心特性,此外对于Flume而言可以从文件名中得知项目的名称、日志等重要信息,既可以在收集时对日志进行按项目、日志进行分类存储。

    5)严格控制日志文件的大小,适时对日志文件进行rolling,我们约定任何日志文件的大小不得超过256M,超过此值时应该对日志进行rolling。原因非常简单,较大的日志文件既不便于收集、传输,也不便于进行查看,此外较大的日志还会降低文件IO的效率。在此基础上,我们要求在打印日志时需要对日志信息进行合理规划,尽可能精简日志信息,冗杂而庞大的日志信息不仅价值较低,而且消耗存储,此外较大的日志内容输出还会增加宿主机器的IO负载,毕竟我们的普通的application机器的IOPS通常不高。

    6)为了便于日志分拣、日志内容的可读性、本地性,我们在nginx、tomcat等所有日志内容中,都打印“当前机器的IP”、“日志产生的时间戳”等标记信息。

 

1、nginx日志格式:

log_format  main  '$time_local|$hostname|$remote_addr|$upstream_addr|$request_time|$upstream_response_time|$upstream_connect_time|'

'$status|$upstream_status|-|$bytes_sent|-|-|$remote_user|$request|$http_user_agent|$http_referer|^_^|'

'$scheme|$request_method|$request_trace_id|$request_trace_seq|^_^|'

'$http_x_forwarded_for|$http_Authorization|$cookie_uid';

 

    其中有几个“-”占位符,本人使用nginx 1.10版本,但是有几个非常重要的字段需要等到1.11版本发布后才能使用,所以此处先用“-”占位。

    nginx日志格式,本人参考了AWS ELB,我觉得ELB的日志格式还是比较规范,具有较高的参考价值。此处的nginx格式,与ELB日志格式在字段含以上一一对应,对于nginx缺失的字段,先用“-”占位。

   我们将nginx日志分为四个域,第一个域包含一些最常用、最重要的字段,通常与性能评估、数据分拣有关系;第二个域表示此次请求的一些状态信息,排查问题时可以关注此域;第三个域,是关于请求追踪的,我们为每个请求设定request_id等(其中$request_trace_id,$request_trace_seq是自定义的变量),此后在业务监控时可以将异常请求的全追踪链整理出来;第四个域,面向开发,通常用于打印一些HTTP参数等。

    $request_trace_id和$request_trace_seq是自定义的变量,分别表示“请求的追踪ID”和“请求追踪的序列数字”:

    一个新的请求都会有一个唯一的trace_id,此trace_id通常有最顶层proxy负责生成,生成后将会把trace_id添加到header中并传递给upstream层(tomcat等),upstream应用中如果有请求扇出,则继续将此trace_id下发,最终实现请求的链路追踪,我们将链路的追踪信息收集并整理,后期用于评估接口性能、业务监控、流量异常发现、容量规划等。

    如果proxy层发现请求的header中已经包含trace_id,那么我们认为此请求是“链路的一个环节”而不是一个新的请求,此时保留trace_id,并添加到header中继续转发。request_trace_seq默认为0,有upstream负责进行维护seq的值,比如每次下发对其值进行自增,nginx不负责此值的自增的原因是希望有应用程序自己决定seq的顺序。

##trace.setting
set	$request_trace_id $http_x_request_id;
set $request_trace_seq $http_x_request_req;

if ( $request_trace_id = '' ) {
	set	$request_trace_id $pid-$connection-$bytes_sent-$msec;
}
if ( $request_trace_seq = '' ) {
   set	$request_trace_seq 0;
}

 

....
server {
    listen       80;
    server_name  demo.com;
    include trace.setting;
    access_log  /var/log/nginx/demo.log  main;
    proxy_send_timeout      1800s;
    proxy_read_timeout      1800s;    

    location / {
            proxy_pass         http://10.0.0.1:8080;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Request-ID $request_trace_id;
            proxy_set_header   X-Request-Seq $request_trace_seq;
    }
}
....

 

    字段含义(逐一对应):

字段名                          解释
time_local                   日志时间
hostname                 当前机器的hostname(非IP)
remote_addr                  客户端地址
upstream_addr               后端Server的地址
request_time            nginx处理请求的时长,从获取Client请求的首个字节开始到响应数据发送完毕,单位为“秒 + 毫秒”
upstream_response_time      从nginx与upstream建立连接开始到response数据接收完毕。
upstream_connect_time     与upstream建立连接的时间。
status                  nginx响应状态码
upstream_status        upstream返回给nginx的状态码(tomcat或者后继nginx)
bytes_received         nginx接收到Client的请求数据大小,1.11版本才能支持,此处用“-”占位符替代
bytes_sent               nginx返回给Client的数据大小
upstream_bytes_sent      nginx发送给upstream的字节数,1.11版本才支持,此处使用“-”占位符替代
upstream_bytes_received   nginx接收到upstream响应的字节数,1.11版本才支持,此处使用“-”占位符替代
remote_user            基本认证中的user信息
request                   HTTP请求行—首行
http_user_agent         标头中“User-Agent”值
http_referer              标头中“Referer”值
scheme                  请求的Scheme,HTTP或者HTTPS
request_method            HTTP(S)请求的方法名:GET,POST等
request_trace_id        获取标头中“X-Request-ID”值,如果不包含此header,则创建新的Trace_id。
request_trace_seq       获取标头中“X-Request-Seq”值,如果存在,表明此请求是trace link下发的请求。此值用于追踪请求链的层级或者顺序
http_{key}           获取HEADER中指定key的值。
cookie_{key}          获取COOKIE中指定key的值。

 

 2、Tomcat Access log格式规范

    对于JAVA WEB项目,tomcat提供了内置的access日志机制,有点类似于nginx的access日志;在开启时,tomcat会把接收到的请求信息打印在日志中,这对我们分析数据、排查问题、性能检测等有很大帮助。只需要修改server.xml文件即可:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

               prefix="access.log" suffix="" renameOnRotate="true"

pattern="%{yyyy-MM-dd HH:mm:ss}t|%A|%a|%p|%m|%s|%D|

%b|%{begin:msec}t|%{end:msec}t|^_^|

%{X-Request-ID}i|%{X-Request-Seq}i|^_^|

%S|%r|%{Referer}i|%{User-Agent}i" />

 

    基本原则跟nginx一样,分域,第一个域仍然是关于数据分拣、性能检测相关;第二个域是关于请求追踪的,将来对接追踪链系统;第三个域,是开发关注的,通常是打印一些HTTP 参数等。不过比较遗憾的是,tomcat access日志所能提供的字段信息比较少,没有nginx那么丰富。

    此外,为了让access log的文件名称遵循规范要求,我们在prefix和suffix的配置上做了调整。

    为了达成请求追踪的目的,我们在tomcat access log中也打印了request_trace_id和seq的相关信息。

 

3、业务日志格式

    我们的java程序内部也会打印一些日志,这些日志对问题排查、业务监控、数据统计非常重要,但是这些数据的使用者通常是大数据团队、BI部分、架构团队等,因此规范这些日志的格式至关重要;此外格式统一,对于开发工程师跨团队协作也非常有益。

    原则不变:便于数据分拣、分域;不过为了更好的执行,在此之前,我们需要约定日志组件为logback + sl4j;因为我们会使用logback中的MDC机制,来打印更多的运行时信息。

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <pattern>%d{yyyy-MM-dd/HH:mm:ss.SSS}|%X{localIp}|%X{requestId}|%X{requestSeq}|^_^|uid:%X{uid}|^_^|[%t]|%-5level|%logger{50} %line - %m%n</pattern>
</encoder>

 

    整个过程中,我们将request_id从nginx传递到tomcat,在传递到java应用内部,主要是为后期的请求追踪平台做铺垫,同时我们排查问题也将更加容易。需要注意,%X{requestId}和%X{requestSeq}都是经过MDC Filter进行分装后的。

    在第二个域中,允许每个项目自定义各自的日志字段,为K-V模式,比如“uid:10010|orderId:10000”,K-V之间通过“:”分割,此后我们日志分析组件可以将它们解析成map并保存,比如保存在ES中。之所以这么做的原因是,每个业务系统需要打印的自定义字段各有不同,这对后续的数据分析和统计组件有较大的挑战,为了简化后续操作,我们将用户自定义字段部分结构松耦合。

 

    在上文中,我们还提到业务日志的大小问题,这就需要采用一定的rolling策略,我们约定所有项目的logback组件的版本不低于1.1.7,并统一rolling策略:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_HOME}/order-center.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>${LOG_HOME}/order-center.log.%d{yyyy-MM-dd}.%i</fileNamePattern>
        <maxFileSize>256MB</maxFileSize>
        <maxHistory>15</maxHistory>
        <totalSizeCap>32GB</totalSizeCap>
    </rollingPolicy>
….
</appender>

 

4、基础数据平台规划

    1)基于Flume组件,对全网项目的日志文件进行收集,包括历史文件(每天rotate生成的、rolling生成的文件)和实时日志信息(tail);将日志文件统一保存在一个或者多个堡垒机(group server)上,并将日志按照项目、时间进行归类。

    2)业务系统通常是分布式部署,一个project部署在多个机器上,每个机器都会产生新的日志信息,如果遇到线上问题,排查期间需要访问多个机器,为了解决这个问题,我们将每个项目实时产生的日志信息,统一汇总在堡垒机上一个文件中,比如:堡垒机上的/order-center/2017-10-11/access.log.tail,此文件保存了order-center项目中2017-10-11,多个tomcat实时的日志,它们混合在一起。

    3)Flume将实时日志转发到kafka中,其他数据统计、分析系统通过kafka消费数据。此外我们的Flume将采用“多层”架构设计,每个application宿主机器上部署一个Flume agent,同一个项目的agent将数据发给一个Flume collector(也是一个Flume agent),并统一由collector对日志信息进行分类、本地存储、Filter、以及转发给kafka等。

    4)基于storm + kafka对实时日志信息进行分析,并根据规则匹配日志内容,当遇到“业务异常”、“流量异常”等情况是,触发报警,并将相应的信息进行整理,形成traceing link并展示给相关人员。

别再手动看日志了!用Fluent Bit 2.2.2把Nginx和Tomcat日志自动喂给Kafka(附完整配置文件) 本文详细介绍了如何使用Fluent Bit 2.2.2自动化处理Nginx和Tomcat日志,并将其高效传输到Kafka消息队列。通过实战配置示例和性能调优建议,帮助运维工程师摆脱手动查看日志的困扰,实现日志数据的实时结构化处理与高效传输。 阅读详情

相关推荐

内网HTTPS部署指南:私有CA搭建与Nginx/Tomcat/IIS配置实战

HTTPS(超文本传输安全协议)通过TLS/SSL加密层为HTTP通信提供安全保障,其核心原理基于非对称加密与证书信任链机制。这项技术不仅保护数据传输的机密性与完整性,更是现代网络安全架构的基石,对于满足等保合规、防范中间人攻击至关重要。在实际工程中,尤其是在企业内网环境,为Web服务部署HTTPS能够有效保护敏感业务数据,如财务、人事及研发系统信息。通过搭建私有证书颁发机构(CA),运维人员可以为内网域名或IP签发受信证书,从而构建一个可控的加密通信环境。本指南将详细阐述如何利用OpenSSL工具创建私有

weixin_33976072的博客 357

Nginx(三):日志

nginx日志格式

7101

Java中间件等保三级加固实战:Tomcat、Nginx、Redis安全配置清单

在网络安全领域,身份鉴别、访问控制和入侵防范是构建安全计算环境的核心基础。这些技术原理旨在通过验证用户身份、实施最小权限原则和部署防御机制,来保护信息系统免受未授权访问和攻击。其技术价值在于为关键业务系统提供符合等级保护要求的强制性安全基线,确保业务连续性与数据机密性。在金融、能源等关键行业的应用场景中,中间件作为应用系统的运行基础,其安全配置直接决定了上层业务能否满足等保三级要求。本文聚焦于Java技术栈下的Tomcat、Nginx和Redis,针对红队(等保测评机构)提出的典型整改项,提供一套经过验证的

weixin_34406086的博客 429

【Nginx】如何配置Nginx日志?这是最全面的一篇了!!

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

2401_84049061的博客 817

Nginx架构及配置详解

概述 Nginx采用C进行编写,是俄罗斯程序员开发的一款轻量级的可构建Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器的软件, Nginx服务器是一个高性能的HTTP和反向代理web服务器,同时也可提供了IMAP/POP3/SMTP服务。nginx常用作跑静态和做负载反向代理,动态php交给apache处理,因后者比较稳定,jsp交给tomcat、resin或jboss。n......

企业实战系列集 ●●● https://ximenjianxue.blog.youkuaiyun.com 7071

GEO数据挖掘实战:用R语言从GSE42872数据集中找到关键差异基因(附完整代码)

本文详细介绍了使用R语言从GSE42872数据集中挖掘关键差异基因的完整流程,包括数据下载、探针ID转换、差异表达分析和功能富集分析。通过实战代码演示,帮助生信研究者掌握GEO数据挖掘的核心技术,快速识别疾病相关基因并理解其生物学功能。

weixin_42625070的博客 365

Nginx日志设置

Nginx日志设置

承缘丶 1万+

COMSOL电磁仿真案例——感应线圈

COMSOL电磁建模仿真案例——感应线圈

冲击10w 6万+

2、自定义tomcat catalina.out日志格式

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34233618的博客 1197

重磅!AI实时读取总结微信聊天记录,附MCP协议+智能体配置教程!

【摘要】本文介绍了一套AI实时分析微信聊天记录的解决方案,通过Chatlog+Trae+MCP协议实现智能整理群聊信息。Chatlog作为开源工具本地解析微信数据,确保隐私安全;Trae提供AI分析能力,支持自然语言处理。操作步骤包括:1)下载运行Chatlog并启动HTTP服务;2)安装Trae配置MCP协议;3)创建智能体设置提示词。该方案虽需初始配置,但能有效解决群聊信息过载问题,自动提炼关键内容,避免有价值信息被淹没。文中提供了详细教程链接和网盘资源。

puyihuan的博客 1万+

从CTFShow靶场实战,聊聊Node.js原型链污染漏洞的几种利用姿势(附详细复现步骤)

本文深入剖析Node.js原型链污染漏洞的原理与实战利用,通过复现CTFShow靶场题目(web338-web341),详细演示五种高级利用技巧,包括基础污染、多级污染、模板引擎RCE等,并提供防御方案与最佳实践,帮助开发者提升Web应用安全性。

weixin_30791095的博客 446

Nginx--日志(介绍、配置、日志轮转)

nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块的支持,日志格式通过 log_format 命令来定义,日志对于统计和排错是非常有利的,下面总结了 nginx 日志相关的配置 包括 access_log 、 log_format 、open_log_file_cache 、 rewrite_log 、 error_logstatusbodybytessentbodybytessent‘“httpu。

m0_74825466的博客 2534

DDR5内存调优实战:手把手教你搞定Write Leveling Training Mode(附时序图解析)

本文深入解析DDR5内存调优中的Write Leveling Training Mode技术,详细介绍了其核心原理、硬件准备、实战步骤及常见问题解决方案。通过JESD79-5标准定义的反馈机制,帮助硬件工程师精确对齐DQS与CK信号,提升系统稳定性和数据可靠性。附有时序图解析和代码示例,适合DDR5内存系统设计与调试参考。

weixin_29256771的博客 551

基于Linux CentOS 7.9 部署Tomcat 以及 基于tomcat集群实现nginx负载均衡

本文介绍了Tomcat的安装与配置过程,包括JDK环境部署、Tomcat二进制安装、目录结构说明以及通过systemd服务管理Tomcat。同时对比了Resin、Jetty、JBoss等主流Java Web服务器特性,并详细解析了Tomcat的配置文件架构,包括Server、Service等核心节点功能。

2502_94124179的博客 488

零基础基于U-Net网络实战眼底图像血管提取

文章目录1 前言2 血管提取任务概述3 U-Net架构简介4 眼底图像血管分割代码5 结果评估可视化(ROC曲线)6 改进U-Net网络完成眼底图像血管提取任务思路 1 前言 本文基于U-Net架构完成了视网膜血管的提取任务,基于Keras框架更简单的实现分割,网络、工具类、训练和预测的代码一目了然

NJU phd 在读。 5203

华为OD机试真题 新系统 2026-05-13 Python&JS语言 实现【查找能被整除的最大整数】

给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大且能被给定正整数整除的数。

MISAYAONE的博客 226

nginx和tomcat

和Tomcat是两种广泛应用于Web服务领域的软件,它们在功能定位、架构设计以及适用场景上存在显著差异。本文将从多个维度对二者进行详细对比分析,帮助开发者更好地理解如何根据实际需求选择合适的服务器解决方案。

1248

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

机器学习深度学习业余选手 479

Nginx反向代理多Tomcat实例部署实战:从单机多端口到生产环境调优

在Web应用部署架构中,反向代理是实现流量分发、负载均衡和安全隔离的核心技术。其基本原理是通过一个中间服务器接收客户端请求,并根据预设规则将请求转发到后端多个应用服务器,对外隐藏了复杂的内部网络结构。这一技术价值在于显著提升了系统的可扩展性、安全性和资源利用率,是构建高可用服务集群的基础。在实际应用场景中,常与Tomcat等Java应用服务器结合,用于部署多个独立项目。本文聚焦于Nginx反向代理配置与Tomcat多实例部署的工程实践,详细解析了如何通过端口隔离与路径/子域名路由策略,实现单服务器上多个Sp

weixin_34356555的博客 449

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LAMP架构6-nginx+tomcat+memcached服务以及goaccess可视化日志

文章目录前言1、 tomcat介绍2、在server2上的安装Apache-tomcat3、启动tomcat4、对server1进行nginx配置5、测试server2和server3上的test.jsp文件5.1 添加server3(tomcat服务器,和server2配置一样)5.2 开始测试test.jsp文件6、tomcat+memcached6.1 确认php-fpm服务开启并暂时关闭tomcat服务6.2 安装memcached服务(server2与server3一样配置)6.3 测试7、go.

Ghost_0110 334

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Day14】Nginx实战训练营

54 Nginx 架构 - tomcat 55 Nginx 架构 - nginx + keepalived 56 Nginx 运维规范 故障举例

张森纳的博客 342

Tomcat 企业级运维实战系列(三):Tomcat 配置解析与集群化部署

本文是Tomcat企业级运维实战系列的第三篇,重点解析Tomcat核心配置文件server.xml的架构与功能,并介绍集群化部署方案。文章详细拆解了server.xml的7大核心节点:Server作为最外层容器定义关闭端口;Listener实现启动监听任务;GlobalNamingResources配置全局JNDI资源;Service整合Connector和Engine;Connector定义请求接收方式;Engine处理请求并包含认证域Realm;Host配置虚拟主机及访问日志Valve。通过系统解析各节

LinuxSRE、k8s、运维、DBA、大数据 1176

Nginx笔记

Nginx学习笔记

panzhengxiang的博客 882

tomcat中request对象是被创建的_Tomcat & Nginx学习笔记

Apache Tomcat Web应⽤服务器学习笔记浏览器访问服务器的流程http请求的处理过程: 浏览器访问服务器使⽤的是Http协议,Http是应⽤层协议,⽤于定义数据通信的格式,具体的数据传输使⽤的是TCP/IP协议。Tomcat 系统总体架构 Tomcat是⼀个Http服务器(能够接收并且处理http请求,所以tomcat是⼀个http服务器),tomcat是Apache旗下的一个开源S...

weixin_39796652的博客 340

全网最强Nginx教程 | 万字长文爆肝Nginx(一)

学习nginx

qq_45832461的博客 2115
上一篇: JAVA执行Shell命令
下一篇: JAVA正则表达式过滤文件
iteye_19607
博客等级 码龄8年 34粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值