Nginx自定义日志中时间格式

这篇具有很好参考价值的文章主要介绍了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.完整配置示例截图

Nginx自定义日志中时间格式

6.日志打印效果

Nginx自定义日志中时间格式文章来源地址https://www.toymoban.com/news/detail-746422.html

到了这里,关于Nginx自定义日志中时间格式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Nginx map 实现时间格式转换

    哈喽大家好,我是咸鱼 最近我们需要把 Nginx 的日志接入到自研的日志采集平台上,但是这个平台只支持 JSON 格式,所以需要 把 Nginx 日志格式改成 JSON 格式 例如下面这样的效果 刚开始在主配置文件 nginx.conf 中定义了一个名叫 json 的日志格式字段 验证的时候其他内容没啥问题

    2024年02月08日
    浏览(49)
  • 微服务系列文章 之 nginx日志格式分析以及修改

    如何自定义日志格式,就需要修改nginx日志打印格式   日志说明: $remote_addr 客户端IP地址 $remote_user 客户端用户名称,一般为空 [$time_local] 访问时间 “$request” 记录请求HTTP的方式以及URL $status 状态码 $body_bytes_sent 发送给客户端的文件大小 “$http_referer” 记录从哪个页面访问

    2024年02月16日
    浏览(39)
  • tomcat和nginx的日志记录请求时间

            当系统卡顿时候,我们需要分析时间花费在哪个缓解。项目的后端接口可以记录一些时间,此外,在我们的tomcat容器和nginx网关上也可以记录一些有关请求用户,请求时间,响应时间的数据,可以提供更多的信息以便于排查问题。 1.tomcat日志 server.xml 以下列出了一些

    2024年02月14日
    浏览(50)
  • Elasticsearch自定义时间格式

    DateFormat.custom:自定义属性格式; pattern:时间格式 epoch_millis:时间戳   

    2024年02月15日
    浏览(34)
  • vue + element实现el-date-picker的时间格式转换,以及自定义时间格式,修改输入的时间格式

    如果只是需要修改传给后端的值或者格式,可以使用 value-format实现,可以在文档上查看详细的介绍 使用自定义指令,首先需要创建一个自定义指令代码的存放位置,我是/utils/directive/dataForm/dataformat.js这个路径创建的内容 自定义指令内容

    2024年02月15日
    浏览(45)
  • Unity中获取时间戳、日期、时间、毫秒、秒以相互转换、自定义格式时间

    这里附带一个时间戳和时间转换的网址 时间戳就是从1970年1月1日0时0分0秒起到现在的总毫秒数,为什么时1970/1/1/00:00:00,因为第一台计算机发明时间是这个时间,所以时间戳诞生了。 比如说你要做一些时间相关的功能,那么基本都会用到时间戳。而且时间戳是精确的,比如说

    2024年02月05日
    浏览(56)
  • 工作6年了日期时间格式化还在写YYYY疯狂给队友埋雷

    前言 哈喽小伙伴们好久不见,今天来个有意思的雷,看你有没有埋过。 正文 不多说废话,公司最近来了个外地回来的小伙伴,在广州工作过6年,也是一名挺有经验的开发。 他提交的代码被小组长发现有问题,给打回了,原因是里面日期格式化的用法有问题,用的SimpleDate

    2024年02月12日
    浏览(44)
  • 关于小程序中时间格式化解决方法

    小程序格式化时间方法 方法(1): const formatDate = (num, fmt) = { if (num == \\\'\\\') { return \\\'\\\' } const date = new Date(num) let o = { \\\"M+\\\": date.getMonth() + 1, //月份 \\\"d+\\\": date.getDate(), //日 \\\"h+\\\": date.getHours(), //小时 \\\"m+\\\": date.getMinutes(), //分 \\\"s+\\\": date.getSeconds(), //秒 \\\"q+\\\": Math.floor((date.getMonth() + 3) / 3), //季度

    2024年02月13日
    浏览(45)
  • 【运维知识大神篇】超详细的ELFK日志分析教程7(filebeat常用模块+filebeat采集固定格式日志+自定义日志格式写入ES+EFK架构转ELFK架构+两个业务实战练习)

    本篇文章继续给大家介绍ELFK日志分析,详细请见下面目录。 目录 filebeat采集nginx日志 filebeat模块使用 一、Nginx模块 二、tomcat模块 三、filebeat写数据到ES集群自定义索引 四、filebeat自定义字段之nginx写入ES 五、filebeat自定义字段之tomcat写入ES 六、indices模块实现多个input写入不同

    2024年02月05日
    浏览(44)
  • vue前端如何去掉后端接口返回的一个字段中时间里面的时分秒 只需要年月日

    在 Vue 前端中,可以使用 JavaScript 中的 Date 对象来处理日期。对于从后端接口返回的日期字符串,可以先将其转换为 Date 对象,然后再使用 getFullYear()、getMonth()、getDate() 等方法获取年月日等信息 。 以下是一个示例函数,它接受一个日期字符串作为参数,并返回 YYYY-MM-DD 格式

    2024年02月14日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包