切割 Nginx 日志

news2024/12/23 4:30:52

目录

方式一:自定义脚本 

方式二:logrotate

crontab 讲解

centos 容器安装 crontab

centos 容器 systemctl 命令执行异常 


 

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

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

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

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

方式一:自定义脚本 

1. 编写脚本 

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

注释:在 Docker CentOS 容器中,‌nginx 的 PID 文件通常位于 /var/run/nginx.pid。‌

        这个文件的位置是基于 Linux 系统的标准目录结构。‌/var/run 目录用于存储系统启动以来的实时数据,‌包括进程标识(‌PID)‌文件。‌按照命名惯例,‌每个服务都有自己的 PID 文件,‌并且命名规则为 <program-name>.pid。‌因此,‌nginx 服务的 PID 文件名为 /var/run/nginx.pid,‌其中存放的是 nginx master 进程的进程号。‌这个文件对于 nginx 服务的正常运行至关重要,‌因为它允许系统或其他服务跟踪 nginx 的进程状态。‌

        如果在 CentOS 容器中遇到 nginx 服务相关的问题,‌检查 /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"`

2. 定时执行该shell   

crontab -e # 编辑contab命令
* * * * * /usr/crontab_shell/splitNginxLog.sh >> /usr/crontab_shell/log_cron_output.log 2>&1

注释:

        * * * * *:指定执行时间,代表每分钟。

        tail -f /usr/crontab_shell/log_cron_output.log  # 监控输出日志

3. 参考链接

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

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

方式二:logrotate

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

/var/log/nginx/*.log {
    daily
    missingok
    rotate 60
    compress
    delaycompress
    notifempty
    create 0640 nginx adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

解释:

  • daily:日志文件将每天轮换一次。

  • missingok:如果日志文件不存在,不要报错。

  • rotate 60:保留60个旧日志文件。

  • compress:用gzip压缩旧日志文件。

  • delaycompress:压缩操作将推迟到下一次轮换。

  • notifempty:如果日志文件为空,就不进行轮换。

  • create 0640 nginx adm:轮换后创建新的日志文件,设定权限和所有者。

  • sharedscripts:多个日志文件轮换后执行一次脚本。

  • postrotateendscript:在日志轮换后运行的脚本,这里是发送USR1信号给Nginx,让其重新打开日志文件。

确保 logrotate 的 cron 任务被激活,通常在 /etc/crontab 或 /etc/cron.d/logrotate中。如果你的系统使用的是 systemd,logrotate 的 cron 任务可能需要手动启用。

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

crontab 讲解

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

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

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

这表示在每天的6点0分执行位于 /path/to/script.sh 的脚本。‌

        此外,‌用户还可以通过 crontab -l 命令查看当前用户的定时任务列表,‌而 crontab -r 命令则用于删除当前用户的定时任务列表。‌

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

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

* * * * * /path/to/command > /path/to/logfile.log 2>&1

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

centos 容器安装 crontab

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

sudo yum install cronie

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

sudo systemctl start crond

sudo systemctl enable crond

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

crontab -e

        这将打开你的默认编辑器来编辑 crontab 文件。例如,要每天早上 6 点运行脚本 /home/user/daily_backup.sh,你的 crontab 文件可能会包含以下内容:

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

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

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

crontab -l

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

chmod +x /home/user/daily_backup.sh

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

centos 容器 systemctl 命令执行异常 

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

ps -p 1

2. 确保容器安装了 systemd,找一下 systemd 的初始化文件在哪:

sh-5.0# find / -name init
…………
…………
/usr/sbin/init
sh-5.0# 

3. 看一下哪个是可执行文件,并且和 systemd 有关系:

# 判断第一个
[sh-5.0]# ls -l /etc/init
total 4
-rw-r--r-- 1 root root 720 Nov 14  2022 kpatch.conf

# 判断第二个
[sh-5.0]# ls -l /usr/sbin/init
lrwxrwxrwx 1 root root 22 Apr 23 16:30 /usr/sbin/init -> ../lib/systemd/systemd

        可以看到,这个 /usr/sbin/init 是个软连接(可执行),并且和 systemd 有关系,那么基本就是这个了,记住这个文件路径.

4. 创建容器:

docker run -itd --privileged --name container_name --network xx_network image:tag /usr/sbin/init

5. 进入容器:

docker exec -it container_name /bin/sh

6. 再次验证 什么 作为初始化系统:

7. 参考链接

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博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1988398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于QCustomPlot实现色条(ColorBar)

一、简介 通过QCustomPlot实现ColorBar&#xff0c;直观显示各个位置的异常情况。实现效果如下&#xff0c; 二、源码 CPColorBar.hpp // CPColorBar.hpp #pragma once #include "qcustomplot.h"#include <QHash>class QCP_LIB_DECL CPColorBarData { pub…

使用 MRI 构建的大脑连接网络预测帕金森病萎缩进展模式| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Brain Connectivity Networks Constructed Using MRI for Predicting Patterns of Atrophy Progression in Parkinson Disease 使用 MRI 构建的大脑连接网络预测帕金森病萎缩进展模式 Background 背景 Whether connectome mapping of structural and across …

全志T527-TP9930-Camera

一、简介 1、TP9930 TP9930 驱动模块主要实现将 4 路的 Camera 的数据转换为 BT656/BT1120 数据&#xff0c;从而实现在 T527 端来对数据进行处理和送显。 2、BT656/BT1120简介 BT656主要是针对PAL/NTSC等标清视频。随着高清视频的发展需要&#xff0c;又推出了BT1120标准&…

AI + Coding:可以有多少种玩法?

在当今快速发展的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;和编程已经成为不可分割的两大领域。AI赋予了计算机更多的智能&#xff0c;使其能够处理复杂的数据、执行高级任务&#xff0c;而编程是实现这一切的基础。当AI与编程结合在一起时&#xff0c;会带来无…

图片懒加载与预加载(原生)

1、懒加载。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head>…

【开端】JAVA Mono<Void>向前端返回没有登陆或登录超时 暂无权限访问信息组装

一、绪论 JAVA接口返回信息ServerHttpResponse response 等登录接口token过期时需要给前端返回相关状态码和状态信息 二、Mono<Void>向前端返回没有登陆或登录超时 暂无权限访问信息组装 返回Mono对象 public abstract class Mono<T> implements CorePublisher…

2024最新Mysql事务原理与优化最佳实践

概述 我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题&…

在java中通过subString方法来截取字符串中的文本

1、subString&#xff08;&#xff09;常规用法可以通过下标来进行获取&#xff0c;在java中是从0开始&#xff0c;前包括后不包括。 String str “Hello Java World!”; 用法一: substring(int beginIndex) 返回从起始位置&#xff08;beginIndex&#xff09;至字符串末尾…

供应链库存管理面临什么问题?全面解析安全库存和周转库存!

在当今这个快速变化的商业世界中&#xff0c;供应链管理已成为企业获取竞争优势的核心领域。库存管理&#xff0c;作为供应链中的关键环节&#xff0c;直接关系到企业的成本控制、客户服务水平以及市场响应速度。然而&#xff0c;面对市场竞争的加剧和客户需求的多变&#xff0…

事务性邮件调用接口如何配置灵活调用策略?

事务性邮件调用接口性能怎么优化&#xff1f;如何使用接口调用&#xff1f; 如何配置灵活调用策略&#xff0c;不仅可以提升邮件发送的效率和可靠性&#xff0c;还能增强用户体验。AokSend将详细介绍事务性邮件调用接口的配置方法和策略&#xff0c;以便企业在实际应用中取得最…

深度学习读书笔记(1)--机器学习、人工智能、深度学习的关系

声明&#xff1a;本文章是根据网上资料&#xff0c;加上自己整理和理解而成&#xff0c;仅为记录自己学习的点点滴滴。可能有错误&#xff0c;欢迎大家指正。 阅读的书籍主要为《UnderstandingDeepLearning》《动手学深度学习》 1956 年提出 AI 概念&#xff0c;短短3年后&…

【初阶数据结构题目】14.随机链表的复制

随机链表的复制 点击链接做题 思路&#xff1a; 浅拷贝&#xff1a;拷贝值 深拷贝&#xff1a;拷贝空间 在原链表的基础上继续复制链表置random指针复制链表和原链表断开 代码&#xff1a; /*** Definition for a Node.* struct Node {* int val;* struct Node *next…

【开发踩坑】windows查看jvm gc信息

windows查看jvm gc信息 EZ 找出java进程PID 控制面板----搜索任务管理器---- 任务管理器----搜索 java----详细信息 这里PID是4856 cmd jstat gc面板 reference&#xff1a; jstat命令

【Redis】缓存三大问题与缓存一致性问题

缓存三大问题 缓存穿透 缓存穿透是指用户查询的数据在缓存和数据库中都不存在&#xff0c;导致每次请求都会直接落到数据库上&#xff0c;增加数据库负载。 解决方案 1&#xff09;参数校验 一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于…

【letcod-c++】128.最长连续序列

一、题目 二、分析 第一想法是像“242字母异位词”那样用哈希数组&#xff0c;但是这个数组元素的范围比较广&#xff0c;元素又比较分散&#xff0c;用数组太浪费空间&#xff0c;不合适。 于是考虑用哈希set(unordered_set),这个时候忽然想到前几天学习到set它能自动排序且自…

MySQL笔记(九):存储引擎

一、介绍 二、演示 Memory的使用场景&#xff1a; 例如网吧&#xff0c;用户再次上线时会更新状态 #表类型和存储引擎-- 查看所有的存储引擎SHOW ENGINES; -- 1、innodb 支持事务&#xff0c;外键&#xff0c;行级锁-- 2、myisam CREATE TABLE t31(id INT,name VARCHAR(32)) …

十二、享元模式

文章目录 1 基本介绍2 案例2.1 Digit 接口2.2 Color 枚举2.3 BigDigit 类2.4 DigitFactory 类2.5 Client 类2.6 Client 类的测试结果2.7 总结 3 各角色之间的关系3.1 角色3.1.1 Flyweight ( 抽象享元 )3.1.2 ConcreteFlyweight ( 具体享元 )3.1.3 UnsharedFlyweight ( 非享元 )…

2023/8/7 英语每日一段

There is unintended usefulness in this gentle enforcement of empathy. A mere news story makes it easy to deploy the defensive mechanism social scientists call “othering” which dismisses the victim, freak or dupe. But if it’s someone you have watched or …

文件上传绕过最新版安全狗

本文来源无问社区&#xff0c;更多实战内容&#xff0c;渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/9960.html http分块传输绕过 http分块传输⼀直是⼀个很经典的绕过⽅式&#xff0c;只是在近⼏年分块传输⼀直被卡的很死&#xff0c;很多waf都开始加 …

数据科学 - 数据可视化(持续更新)

1. 前言​​​​​​​ 数据可视化能够将复杂的数据集转化为易于理解的图形、图表或图像。这种直观的表现形式使得人们能够更快地理解数据的分布、趋势、异常值以及数据之间的关系&#xff0c;从而更深入地洞察数据背后的信息。 数据可视化在数据分析和决策制定过程中具有不可…