0


切割 Nginx 日志

切割理由:假设一个网站访问量特别大,每天 access_log 文件有 2 个 G,如果想从文件中查找一下信息,光打开就很慢了,做日志切割的话,便于维护。

需求描述:每分钟一个文件放入到相应的文件夹中。任务会每分钟读取对应路径下的日志文件,然后分析入库。

日志文件格式需为:nginxLogFilePath/YYYYMM/DD/HH/mm.log。

例子:/var/log/nginx/201904/18/20/28.log。

方式一:自定义脚本

  1. 编写脚本
  1. #这里是每分钟切割一次日志的shell脚本
  2. #!/bin/bash
  3. base_path='/var/log/nginx' #定义log基本路径变量
  4. mm=$(date -d "1 minute ago" +"%M" ) #分钟定义(格式为:05)
  5. modify_file_name="$mm.log" #修改的log文件名
  6. HH=$(date -d today +"%H" ) #小时定义(格式为:02)
  7. dd=$(date -d today +"%d" ) #日期定义(格式为:06)
  8. YYYYMM=$(date -d today +"%Y%m" ) #年月定义(格式为:202408)
  9. YYYYMM_folder="$base_path/$YYYYMM"; #年月的文件夹
  10. YYYYMM_DD_folder="$base_path/$YYYYMM/$dd"; #年月日的文件夹
  11. YYYYMM_DD_HH_folder="$base_path/$YYYYMM/$dd/$HH"; #年月日时的文件夹
  12. #如果年月的文件夹不存在,则重新创建一个
  13. if [ ! -d "$YYYYMM_folder" ];
  14. then
  15. mkdir $YYYYMM_folder
  16. fi
  17. if [ ! -d "$YYYYMM_DD_folder" ];
  18. then
  19. mkdir $YYYYMM_DD_folder
  20. fi
  21. if [ ! -d "$YYYYMM_DD_HH_folder" ];
  22. then
  23. mkdir $YYYYMM_DD_HH_folder
  24. fi
  25. mv $base_path/access.log $YYYYMM_DD_HH_folder/$modify_file_name #修改名字
  26. kill -USR1 `cat /run/nginx.pid` #平滑关闭nginx,方便日志切割

**注释:在 Docker CentOS 容器中,‌nginx 的 PID 文件通常位于

  1. /var/run/nginx.pid

。‌**

  1. 这个文件的位置是基于 Linux 系统的标准目录结构。‌
  1. /var/run

目录用于存储系统启动以来的实时数据,‌包括进程标识(‌PID)‌文件。‌按照命名惯例,‌每个服务都有自己的 PID 文件,‌并且命名规则为

  1. <program-name>.pid

。‌因此,‌nginx 服务的 PID 文件名为

  1. /var/run/nginx.pid

,‌其中存放的是 nginx master 进程的进程号。‌这个文件对于 nginx 服务的正常运行至关重要,‌因为它允许系统或其他服务跟踪 nginx 的进程状态。‌

  1. 如果在 CentOS 容器中遇到 nginx 服务相关的问题,‌检查
  1. /var/run/nginx.pid

文件是一个常见的排查步骤,‌以确保 nginx 服务正在运行,‌并且可以获取到正确的进程 ID。‌如果该文件不存在或无法访问,‌可能需要重新启动 nginx 服务或检查 nginx 的配置和运行状态。

**注释: **shell 脚本获取时间

#获取当前时间

time=date +"%Y-%m-%d %H:%M:%S"

#获取一分钟之前

time=date -d "1 minute ago" +"%Y-%m-%d %H:%M:%S"

#获取一小时之前

time=date -d "1 hour ago" +"%Y-%m-%d %H:%M:%S"

#获取一天前时间

time=date -d "1 day ago" +"%Y-%m-%d %H:%M:%S"

  1. 定时执行该shell
  1. crontab -e # 编辑contab命令
  1. * * * * * /usr/crontab_shell/splitNginxLog.sh >> /usr/crontab_shell/log_cron_output.log 2>&1

注释:

  1. * * * * *:指定执行时间,代表每分钟。
  2. tail -f /usr/crontab_shell/log_cron_output.log # 监控输出日志
  1. 参考链接

(4)nginx:日志以及定时切割日志小例子_nginx 日志切割 自动-CSDN博客

https://blog.51cto.com/u_13171517/10537017

方式二:logrotate

  1. 为了实现 Nginx 日志每段时间分割成一个文件,你需要使用 logrotate 工具来管理日志文件。以下是一个基本的 logrotate 配置示例,你可以将其保存为
  1. /etc/logrotate.d/nginx

(假设你的 Nginx 日志位于

  1. /var/log/nginx

目录下):

  1. /var/log/nginx/*.log {
  2. daily
  3. missingok
  4. rotate 60
  5. compress
  6. delaycompress
  7. notifempty
  8. create 0640 nginx adm
  9. sharedscripts
  10. postrotate
  11. [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
  12. endscript
  13. }

解释:

  • daily:日志文件将每天轮换一次。
  • missingok:如果日志文件不存在,不要报错。
  • rotate 60:保留60个旧日志文件。
  • compress:用gzip压缩旧日志文件。
  • delaycompress:压缩操作将推迟到下一次轮换。
  • notifempty:如果日志文件为空,就不进行轮换。
  • create 0640 nginx adm:轮换后创建新的日志文件,设定权限和所有者。
  • sharedscripts:多个日志文件轮换后执行一次脚本。
  • postrotateendscript:在日志轮换后运行的脚本,这里是发送USR1信号给Nginx,让其重新打开日志文件。

确保 logrotate 的 cron 任务被激活,通常在

  1. /etc/crontab

  1. /etc/cron.d/logrotate

中。如果你的系统使用的是 systemd,logrotate 的 cron 任务可能需要手动启用。

请根据你的实际 Nginx 配置和 logrotate 版本调整上述配置。

crontab 讲解

** crontab 命令**是 Linux 系统中用于设置周期性被执行的任务的工具,‌它可以让用户在固定间隔时间执行指定的系统指令或shell脚本。‌这个命令非常适合进行周期性的日志分析或数据备份等工作。‌使用 crontab 命令,‌用户可以定义任务的执行时间,‌这个时间可以是分钟、‌小时、‌日、‌月、‌周及以上的任意组合。‌

  1. 首先,‌用户可以通过执行
  1. crontab -e

命令来编辑自己的定时任务列表。‌在这个列表中,‌用户可以定义任务的执行时间以及要执行的命令或脚本。‌每个任务的定义包括六个字段,‌分别是分钟、‌小时、‌日期、‌月份、‌星期及要执行的命令。‌例如,‌如果用户想要每天早上6点执行某个脚本,‌可以这样定义:‌

  1. 0 6 * * * /path/to/script.sh

这表示在每天的6点0分执行位于

  1. /path/to/script.sh

的脚本。‌

  1. 此外,‌用户还可以通过
  1. crontab -l

命令查看当前用户的定时任务列表,‌而

  1. crontab -r

命令则用于删除当前用户的定时任务列表。‌

  1. 系统级的 cron 配置通常位于
  1. /etc/crontab

文件或

  1. /etc/cron.d/

目录下的文件中。‌这些文件有一个额外的字段用于指定任务运行的用户。‌例如,‌如果用户想要以特定用户的身份运行任务,‌可以在系统级配置中指定该用户,‌并确保该用户有足够的权限来执行指定的命令或脚本。‌

  1. crontab 任务运行时,‌其标准输入通常是空的,‌因为 cron 是后台运行的服务,‌并不是在一个交互式的终端环境中。‌标准输出(stdout)和标准错误输出(stderr)默认情况下会被 cron 守护进程捕获,‌并通过邮件发送给任务设置者的用户。‌如果邮件服务没有在系统上配置,‌输出可能会丢失。‌用户可以通过重定向操作符将输出重定向到文件,‌例如:‌
  1. * * * * * /path/to/command > /path/to/logfile.log 2>&1

这会将标准输出和标准错误都重定向到同一个日志文件。‌

centos 容器安装 crontab

  1. CentOS 使用 crontab 的方法非常简单。首先,你需要确认 crontabs 是否已经安装。在 CentOS 中,crontabs 通常预装,但如果没有,你可以使用以下命令安装:
  1. sudo yum install cronie

安装完成后,你可以启动 crond 服务并设置为开机启动:

  1. sudo systemctl start crond
  2. sudo systemctl enable crond

要编辑当前用户的 crontab 文件,使用以下命令:

  1. crontab -e
  1. 这将打开你的默认编辑器来编辑 crontab 文件。例如,要每天早上 6 点运行脚本
  1. /home/user/daily_backup.sh

,你的 crontab 文件可能会包含以下内容:

  1. 0 6 * * * /home/user/daily_backup.sh

保存并退出编辑器后,crontab 条目将被安装并计划任务将自动开始按计划运行。

要查看当前用户的 crontab 条目,使用:

  1. crontab -l

确保你的脚本文件有执行权限:

  1. chmod +x /home/user/daily_backup.sh

这就是在 CentOS 上安装和设置 crontab 的基本步骤。

centos 容器 systemctl 命令执行异常

  1. 确认 什么 作为初始化系统:
  1. ps -p 1

  1. 确保容器安装了 systemd,找一下
    1. systemd
    的初始化文件在哪:
  1. sh-5.0# find / -name init
  2. …………
  3. …………
  4. /usr/sbin/init
  5. sh-5.0#
  1. 看一下哪个是可执行文件,并且和
    1. systemd
    有关系:
  1. # 判断第一个
  2. [sh-5.0]# ls -l /etc/init
  3. total 4
  4. -rw-r--r-- 1 root root 720 Nov 14 2022 kpatch.conf
  5. # 判断第二个
  6. [sh-5.0]# ls -l /usr/sbin/init
  7. lrwxrwxrwx 1 root root 22 Apr 23 16:30 /usr/sbin/init -> ../lib/systemd/systemd
  1. 可以看到,这个
  1. /usr/sbin/init

是个软连接(可执行),并且和

  1. systemd

有关系,那么基本就是这个了,记住这个文件路径.

  1. 创建容器:
  1. docker run -itd --privileged --name container_name --network xx_network image:tag /usr/sbin/init
  1. 进入容器:
  1. docker exec -it container_name /bin/sh
  1. 再次验证 什么 作为初始化系统:

  1. 参考链接

Docker:System has not been booted with systemd as init system (PID 1). Can‘t operate. Failed to conn_docker system has not been booted with systemd as -CSDN博客

标签: nginx 服务器 linux

本文转载自: https://blog.csdn.net/lambert00001/article/details/140967884
版权归原作者 chengbo_eva 所有, 如有侵权,请联系我们删除。

“切割 Nginx 日志”的评论:

还没有评论