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/::: + 还是选择年月日时分秒看起来舒服一点
随机推荐
- pandas: dataframe转字典,并设置key
解决方案 res = df_by_monthly.set_index('recruit_resign_month').T.to_dict('list') print(res) 上述代码是转为列表形式 ...
- Unity的BuildPlayerProcessor:深入解析与实用案例
Unity BuildPlayerProcessor Unity BuildPlayerProcessor是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目时自动执行一些操作.这个功能可 ...
- Druid未授权访问漏洞小记
某一次在对某网站做渗透测试时,无意中发现了这个漏洞,在此做个记录 Druid未授权访问漏洞: Druid是阿里巴巴数据库出品的,为监控而生的数据库连接池,并且Druid提供的监控功能,监控SQL的执行 ...
- jsp+servlet实战项目
第一步:新建maven项目,项目中添加dao,entity,service,servlet,util包第二步:导入依赖 第三步:数据库建表 第四步:entity实体包(疯转) 第五步:在util工具包 ...
- Unity UGUI的Slider(滑动条)件组的介绍及使用
Unity UGUI的Slider(滑动条)件组的介绍及使用 1. 什么是Slider组件? Slider(滑动条)是Unity UGUI中的一种常用UI组件用,于在用户界面中实现滑动选择的功能.通过 ...
- 《SQL与数据库基础》19. 日志
目录 日志 错误日志 二进制日志 日志格式 日志查看 日志删除 查询日志 慢查询日志 本文以 MySQL 为例 日志 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysql 启动 ...
- Elasticsearch之常用术语
一. 数据库和ES简单类比 关系型数据库 表(Table) 行(Row) 列(Cloumn) Schema SQL Elasticsearch 索引(Index) 文档(Document) 字段(Fi ...
- ssm框架的事物控制
事物控制统一在逻辑层的实现类中以注解的形式添加,例如:对UserServiceImpl中的addUser方法需要进行事物控制,操作如下: 1.此方法必须为public2.在方法名上边加入@Transa ...
- Go语言中JSON的反序列化规则
Unmarshal 解析 func Unmarshal(data []byte, v any) error Unmarshal 解析 JSON 编码的数据,并将结果存储在 v 指向的值中.如果 v 为 ...
- 一文给你讲清楚BeanFactory 和 FactoryBean 的关联与区别
本文分享自华为云社区 <BeanFactory 和 FactoryBean 的关联与区别>,作者:战斧. 一.概括性的回答 两者其实都是Spring提供的接口,如下 public inte ...