Nginx自定义日志中时间格式
背景
工作需要对接内部的日志中台,对日志打印有固定的格式要求,为了使Nginx的access日志也能被采集,需要对日志格式进行自定义,要求日志格式为:
yyyy-MM-dd HH:mm:ss.SSS LOG_LEVEL LOG_MSG ---> 时间格式+打印级别+业务日志
如:
23-11-18 17:34:23.738 DEBUG monitor-7 org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug:137: xxxxx
但目前我们Nginx按照默认格式配置,大致如下:
192.23.4.5 -- [18/Nov/2023L18:58:52 +0800] "GET /api/cluster HTTP/1.1" 200 155 "https://xxx.xx.xx.x"
时间格式无法不符合要求,并且未区分日志级别,因此,需要对日志打印格式进行自定义
自定义日志格式配置
1.重新定义日志格式
点击查看代码
# 原日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "http_referer" "$http_user_agent" "$http_x_forwarded_for";
# 修改后日志格式
log_format main '$time_zh_ms $log_level - $remote_addr - $remote_user "$request" $status $body_bytes_sent "http_referer" "$http_user_agent" "$http_x_forwarded_for";
# 对比修改前后差异,其实就是
1.自定义了$time_zh_ms,在下面的配置中,将其设置为yyyy-MM-dd HH:mm:ss.SSS格式
2.自定义了$log_level,为日志打印级别,下面的配置中,将按照请求响应码来判断为何种日志打印级别
以上只是为了满足日志采集需要,其他字段可按实际情况变动
2.定义时间格式的转换
Nginx默认支持的时间格式为iso8601,此处我们需要通过获取到内置时间变量$time_iso8601和$msec,具体配置如下:
点击查看代码
# 将iso8601格式时间转换为yyyy-MM-dd HH:mm:ss格式
# 按照正则将时间字符串分割为6部分,分别为年月日时分秒,再拼接到$time_zh自定义变量中
if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") {
set $year $1;
set $month $2;
set $day $3;
set $hour $4;
set $minutes $5;
set $seconds $6;
set $time_zh "$1-$2-$3 $4:$5:$6";
}
# 获取毫秒时间戳,并拼接到$time_zh之后
if ($msec ~ "(\d+)\.(\d+)") {
set $time_zh_ms $time_zh.$2
}
# 注意:$time_zh_ms其实就是在log_format中定义的日志格式第一个字段
3.根据响应码定义日志级别
Nginx的access日志默认是没有日志级别这一说法的,此处可视为我们为了适配业务而做的规则,在我们的使用场景中,将返回码为4或5的请求,视为错误,打印为ERROR级别,其他请求为INFO级别
点击查看代码
# 如果http返回码为4或5开头,则设置log_level为ERROR,否则为INFO
map $status $log_level {
~^[45] ERROR;
default INFO;
}
# 此处$status为Nginx内置变量,代表请求的响应码,log_level为自定义变量
4.设置日志使用具体格式并打印到文件
点击查看代码
access_log /dev/stdout main;
access_log /etc/nginx/logs/access.log main;
error_log /dev/stdout;
error_log /etc/nginx/logs/error.log;
5.完整配置示例截图

6.日志打印效果

Nginx自定义日志中时间格式的更多相关文章
- IIS7日志中时间与系统时间不一致的原因
最近在分析web日志,发现IIS7日志中时间与系统时间不一致,即本该上班时间才产生的产并发访问日志,全部发生在凌晨至上班前. 本以为是系统时间设置错误,检查后一切正常.后查询资料,原来是这个原因: 日 ...
- 使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页
使用python找出nginx访问日志中访问次数最多的10个ip排序生成网页 方法1:linux下使用awk命令 # cat access1.log | awk '{print $1" &q ...
- 解决IIS7、IIS7.5中时间格式显示的问题
今天在用IIS7的时候发现一个关于时间格式的问题,当我在ASP中使用now()时间函数的时候,日期是以"/"来分隔,而不是以"-"来分隔的,使得我在运行程序的时 ...
- .NET 自定义Json序列化时间格式
.NET 自定义Json序列化时间格式 Intro 和 JAVA 项目组对接,他们的接口返回的数据是一个json字符串,里面的时间有的是Unix时间戳,有的是string类型,有的还是空,默认序列化规 ...
- JSON.Net 自定义Json序列化时间格式
JSON.Net 自定义Json序列化时间格式 Intro 和 JAVA 项目组对接,他们的接口返回的数据是一个json字符串,里面的时间有的是Unix时间戳,有的是string类型,有的还是空,默认 ...
- 修改springfox-swagger源码,使example中时间格式默认为“yyyy-MM-dd HH:mm:ss”
修改swagger源码,使example中时间格式默认为"yyyy-MM-dd HH:mm:ss" 前言 简单点说,在swagger中,怎么能针对以下vo中的java.util.D ...
- oracle中时间格式时候的大于号是大于和等于的意思
oracle中时间格式时候的大于号是大于和等于的意思
- nginx访问日志中的时间格式修改
1.说明 默认的时间格式是:[08/Mar/2013:09:30:58 +0800],由$time_local变量表示. 我想要改成如下格式:2013-03-08 12:21:03. 2.需要修改的文 ...
- ELK收集Nginx自定义日志格式输出
1.ELK收集日志的有两种常用的方式: 1.1:不修改源日志格式,简单的说就是在logstash中转通过 grok方式进行过滤处理,将原始无规则的日志转换为规则日志(Logstash自定义日志格式) ...
- nginx日志修改时间格式为年月日时分秒
先解除这段注释,使用自定义日志格式 $time_iso8601 生成格式:--20T09::+: $time_local 生成格式: /Apr/::: + 还是选择年月日时分秒看起来舒服一点
随机推荐
- return true 与 return false的妙用——jQuery
var arr = [1, 3, 5,7,9]; jQuery.each(arr, function(key, value){ if(key === 2){ return true; } consol ...
- Bootstrap使用方法
中文文档:https://www.bootcss.com/ 使用方式: 1.选择对应的文档: 2.网站会自动跳转,一般选择Bootstrap3中文文档: 3.点击入门,下拉找到基础模板,复制代码到 ...
- Parallel 与 ConcurrentBag<T> 这对儿黄金搭档(C#)【并发编程系列】
〇.前言 日常开发中经常会遇到数据统计,特别是关于报表的项目.数据处理的效率和准确度当然是首要关注点. 本文主要介绍,如何通过 Parallel 来并行处理数据,并组合 ConcurrentBag&l ...
- 使用 Habana Gaudi2 加速视觉语言模型 BridgeTower
在对最先进的视觉语言模型 BridgeTower 进行微调时,使用 Optimum Habana v1.6, Habana Gaudi2 可以达到 近 3 倍于 A100 的速度.硬件加速的数据加载以 ...
- 发布关于PostGIS对于USD格式的拓展
我们非常高兴的发布为了一年一度的SIGGRAPH 2023发布关于为PostGIS支持USD格式的新拓展. 新添加了3个函数 ST_AsUSDA(geom geometry, usd_root_nam ...
- nlp入门(三)基于贝叶斯算法的拼写错误检测器
源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com) 数据来源:norvig.com/big.txt 贝叶斯原理可看这里:机器学习算法学习笔记 - 过客匆匆,沉沉浮浮 ...
- 可实现自动驾驶的飞机大战(C++)
PS:觉得可以的uu帮忙点个star啦,最近在找工作,希望star多一点能写到简历上 B站演示视频: 基于C++实现的可自动驾驶的飞机大战_单机游戏热门视频 (bilibili.com) Github ...
- nflsoj 5924 选排列
与全排列略微有些不同,只需要将退出条件需要改成 u==r #include <iostream> using namespace std; const int N = 15; int r, ...
- vue3探索——组件通信之事件总线
Vue2.x使用EventBus进行组件通信,而Vue3.x推荐使用mitt.js. 比起Vue实例上的EventBus,mitt.js好在哪里呢?首先它足够小,仅有200bytes,其次支持全部事件 ...
- influxdb 函数 non_negative_derivative 使用
转载请注明出处: 在InfluxDB中,non_negative_derivative()函数用于计算指定字段的非负导数.它可以用来计算时间序列数据的速率或增长率. 该函数的语法如下: non_neg ...