深入了解nginx日志级别

一、nginx日志级别介绍

nginx作为一款高效、稳定、灵活的Web服务器和反向代理服务器,在应用和运维中广泛使用。在nginx的运维中,日志文件是非常重要的组成部分,它能够记录nginx的基本信息、请求信息、错误信息等。nginx的日志级别主要有以下几种:

  • alert – 系统级别紧急信息
  • critical – 关键错误信息
  • error – 一般性错误信息
  • warn – 警告信息
  • notice – 一些特殊信息
  • info – 一般信息
  • debug – 调试信息

二、日志级别的设置

nginx的日志级别可以在nginx.conf配置文件中设置:

  error_log /var/log/nginx/error.log warn;

此处我们设置为warn级别,意味着只有警告信息和以上级别的信息会记录在日志文件中。如果要记录更详细的信息,可以将级别设置为debug。

三、日志文件的分类

按照日志文件类型和记录格式,我们可以将日志文件分成两类:访问日志和错误日志。

1. 访问日志

访问日志用来记录每个请求的基本信息,以下是一些典型的访问日志格式:

  • combined – 以Apache的combined日志格式为模板
  • main – 简单的nginx默认格式
  • json – 以JSON格式记录
  • grpc – 以gRPC格式记录

以下是以combined格式为例的访问日志配置,该格式可以同时记录请求信息和响应码:

  access_log /var/log/nginx/access.log combined;

2. 错误日志

错误日志用来记录任何nginx处理请求时发生的错误信息。

以下是一个用于记录所有错误级别的基本配置:

  error_log /var/log/nginx/error.log;

此处未设置级别,表示记录所有调试信息、消息、警告和错误信息。

四、注意事项

1. 周期性日志文件切割

由于nginx的日志文件很容易变得非常大,而且记录时间跨度较长,因此需要对日志文件进行切割。切割日志文件的方式有很多,可以使用logrotate、crontab等工具进行周期性的日志文件切割。具体操作如下:

  sudo vim /etc/crontab

添加一行在每天凌晨1点钟执行切割任务的计划:

  0 1 * * * root /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1

2. 日志防护措施

nginx日志记录了一些敏感信息,如请求地址、参数、cookie等等,泄露这些信息会对系统造成安全威胁。因此需要采取措施保护这些日志文件。常见的保护措施有:

  • 文件权限设置
  • 加密存储
  • 开启访问日志压缩

以下是设置压缩访问日志的配置:

  gzip on;
  gzip_comp_level 2;
  gzip_min_length 1024;
  gzip_types text/plain text/css text/javascript application/json application/javascript application/xml;
  gzip_disable “MSIE [1-6]\.”;

3. 日志分析工具

nginx的日志文件内容很难直接阅读,需要使用日志分析工具将其可视化。目前市面上比较常用的日志分析工具有ELK、Fluentd、Logstash、Splunk等等。以下是使用ELK进行nginx日志分析的简单配置:

  access_log /var/log/nginx/access.log combined_json;
  # Additional logs for ELK
  log_format json escaped_json '{ "@timestamp": "$time_iso8601", '
                                '"host": "$server_addr", '
                                '"client_ip": "$remote_addr", '
                                '"size": $body_bytes_sent, '
                                '"response_time": $request_time, '
                                '"upstream_response_time": $upstream_response_time, '
                                '"upstream_connect_time": $upstream_connect_time, '
                                '"upstream_status": $upstream_status, '
                                '"request_method": "$request_method", '
                                '"url": "$uri", '
                                '"request": "$request", '
                                '"http_referrer": "$http_referer", '
                                '"http_x_forwarded_for": "$http_x_forwarded_for", '
                                '"http_user_agent": "$http_user_agent" }';
  error_log /var/log/nginx/error.log debug;

  # ELK Integration
  if ($request_uri = /healthz) { return 200; }
  location /nginx_logs {
    access_log off;

    tcp_nodelay on;
    proxy_http_version      1.1;
    proxy_connect_timeout   10s;
    proxy_request_buffering off;
    proxy_buffering         off;
    proxy_pass              http://localhost:5000/;

    # Send JSON logs
    log_format escaped_json '{ "@timestamp": "$time_iso8601", '
                                '"host": "$server_addr", '
                                '"client_ip": "$remote_addr", '
                                '"size": $body_bytes_sent, '
                                '"response_time": $request_time, '
                                '"upstream_response_time": $upstream_response_time, '
                                '"upstream_connect_time": $upstream_connect_time, '
                                '"upstream_status": $upstream_status, '
                                '"request_method": "$request_method", '
                                '"url": "$uri", '
                                '"request": "$request", '
                                '"http_referrer": "$http_referer", '
                                '"http_x_forwarded_for": "$http_x_forwarded_for", '
                                '"http_user_agent": "$http_user_agent" }';
   access_log syslog:server=logs.mysite.com:60223,facility=local7,tag=mynamespace,severity=informational escaped_json;
  }

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/236025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 11:57
下一篇 2024-12-12 11:57

相关推荐

  • Cron执行日志用法介绍

    本文将从多个方面对cron执行日志进行详细阐述,包括cron执行日志的定义、cron执行日志的产生原因、cron执行日志的格式以及如何解读cron执行日志。 一、定义 Cron是一…

    编程 2025-04-29
  • Hibernate日志打印sql参数

    本文将从多个方面介绍如何在Hibernate中打印SQL参数。Hibernate作为一种ORM框架,可以通过打印SQL参数方便开发者调试和优化Hibernate应用。 一、通过配置…

    编程 2025-04-29
  • Python如何区分代码块的级别

    Python是一种动态语言,其程序在运行前需由解释器进行解析。在Python语言中,代码块的级别是非常重要的,对于代码块的排列顺序、执行顺序及错误检测都有着重要的影响。Python…

    编程 2025-04-29
  • 使用Snare服务收集日志:完整教程

    本教程将介绍如何使用Snare服务收集Windows服务器上的日志,并将其发送到远程服务器进行集中管理。 一、安装和配置Snare 1、下载Snare安装程序并安装。 https:…

    编程 2025-04-29
  • Log4j日志打印到Systemout.log

    Log4j是Apache的一个强大的日志组件,可以帮助开发者更好地管理日志。在Java应用程序中,很多开发者都会选择使用Log4j来实现日志输出。本文将介绍如何使用Log4j将日志…

    编程 2025-04-28
  • 图像与信号处理期刊级别

    本文将从多个方面介绍图像与信号处理期刊级别的相关知识,包括图像压缩、人脸识别、关键点匹配等等。 一、图像压缩 图像在传输和存储中占据了大量的空间,因此图像压缩成为了很重要的技术。常…

    编程 2025-04-28
  • Java如何从Nginx下载文件

    本文将从以下几个方面详细介绍如何使用Java从Nginx下载文件。 一、准备工作 在Java中下载文件需要使用到Apache HttpClient库,这个库是一个基于Java的HT…

    编程 2025-04-27
  • 如何将Linux系统日志发送到日志服务器

    本文将介绍如何将Linux系统日志发送到日志服务器,以方便管理和监控系统状态。 一、安装rsyslog软件包 rsyslog是Linux系统上默认的系统日志软件,用于收集系统事件和…

    编程 2025-04-27
  • SpringBoot如何设置不输出Info日志

    本篇文章将带您了解如何在SpringBoot项目中关闭Info级别日志输出。 一、为什么要关闭Info日志 在开发中,我们经常会使用Log4j、Logback等框架来输出日志信息,…

    编程 2025-04-27
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25

发表回复

登录后才能评论