使用logrotate切割nginx日志

logrotate简介

logrotate是nginx自带的日志分割程序。字面意思是日志旋转,或者日志转动。就是隔一段时间生成一个日志小文件,保存的文件数量达了设置的日志保存数上限就把最早的删掉。这样看就是这些日志文件在移动,新的变老的,最老的删掉,就像新陈代谢一样。

使用

像nginx一样,它的主配置文件是/etc/logrotate.conf 在其中可以用include指令指定其他程序具体配置文件位置。
在这里插入图片描述
例如本次创建切割nginx日志的一个配置

/usr/local/nginx/logs/access.log {
	# 每天切分
    daily
	# 如果日志文件不存在,继续下一个而不报错	
    missingok
    #保留30天的日志
    rotate 30
	# 压缩旧日志
    compress
	# 延迟压缩,即下一次切分时压缩上一次的日志
    delaycompress
	# 如果日志为空,不进行切分
    notifempty
    # 使用日期作为后缀
    dateext
    # 旧文件存放路径
    olddir /usr/local/nginx/logs/access/
	# 创建新日志文件的权限和所有者(根据实际情况修改)
    create 0640 root root
    sharedscripts
    postrotate
        # 发送USR1信号给Nginx主进程,让其重新打开日志文件
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
        mv /usr/local/nginx/logs/access/access.log-$(date -d "today" +%Y%m%d) /usr/local/nginx/logs/access/access_$(date -d "yesterday" +%Y%m%d).log
    endscript
}

/usr/local/nginx/logs/access.log用来指定要切分的文件,{}里面是具体配置。
sharedscripts意思是这个配置指定的所有需要切分的文件切分完执行一次下面写的脚本,即 postrotate和endscript之间的脚本,我这里写的脚本的意思是:
1、查看nginx的进程id是否存在,如果存在就向nginx主进程发送USER1信号,让其重新打开日志文件(相当于执行nginx -s reopen)。这样Nginx就会将新日志写入到新的日志文件(即原来的access.logerror.log,而轮转后的旧日志文件会被压缩或保留)。
2、将切出来的日志文件重命名为我希望的名字,我这里配置以dateext,所以切出来的日志会以当前日期结尾,比如access.log-20250604。我将日志文件改名为前一天的日期,例如access_20250603.log,毕竟是在0点切的前一天的日志。

配置文件指令详细解释

compress                                   通过gzip 压缩转储以后的日志
nocompress                                不做gzip压缩处理
copytruncate                              用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate                           备份日志文件不过不截断
create mode owner group             轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate                                    不建立新的日志文件
delaycompress                           和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress                        覆盖 delaycompress 选项,转储同时压缩。
missingok                                 如果日志丢失,不报错继续滚动下一个日志
errors address                           专储时的错误信息发送到指定的Email 地址
ifempty                                    即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty                               当日志文件为空时,不进行轮转
mail address                             把转储的日志文件发送到指定的E-mail 地址
nomail                                     转储时不发送日志文件
olddir directory                         转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir                                   转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts                           运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate                                 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
postrotate                               在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
daily                                       指定转储周期为每天
weekly                                    指定转储周期为每周
monthly                                  指定转储周期为每月
rotate count                            指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
dateext                                  使用当期日期作为命名格式
dateformat .%s                       配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size            当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M

logrotate的切割时间

logrotate的切割时间配置在 /etc/anacrontab 中
在这里插入图片描述
START_HOURS_RANGE 指定切割开始的时间范围,上图是3点到22点
RANDOM_DELAY 指定基于开始时间的最大随机延迟时间。比如3点开始切割,RANDOM_DELAY等于33,那实际切割的时间就是3点22。

修改切割时间

logrotate是Linux的cron定时任务调度的,上述切割时间就是。这个时间往往满需不了需求,我希望0点切割。又不希望影响cron调度的其他定时任务。那我就重新写一个0点执行的定时任务去执行logrotate 并指定配置文件。该配置文件不能放在/etc/logrotate.d/目录下,因为这样会被cron自动调度,具体是通过/etc/cron.daily/logrotate来调度的
在这里插入图片描述
上图/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf 就是执行logrotate的命令

  • /usr/sbin/logrotate: 这是logrotate程序的可执行文件路径。
  • -s /var/lib/logrotate/logrotate.status: 指定logrotate的状态文件路径。状态文件记录了每个日志文件上一次轮转的时间等信息。
  • /etc/logrotate.conf: 这是logrotate的主配置文件,该文件通常包含其他配置文件的引用(如/etc/logrotate.d/目录下的文件)

为不影响/etc/logrotate.d/下的其他分割配置,为logrotate创建执行nginx日志分割的单独的配置文件

sudo mkdir /etc/logrotate.d.nginx
sudo vim /etc/logrotate.d.nginx/nginx

内容如下:

/usr/local/nginx/logs/access.log {
	# 每天切分
    daily
	# 如果日志文件不存在,继续下一个而不报错	
    missingok
        #保留30天的日志
    rotate 30
	# 压缩旧日志
    compress
	# 延迟压缩,即下一次切分时压缩上一次的日志
    delaycompress
	# 如果日志为空,不进行切分
    notifempty
        # 使用日期作为后缀
    dateext
        # 旧文件存放路径
    olddir /usr/local/nginx/logs/access/
	# 创建新日志文件的权限和所有者(根据实际情况修改)
    create 0640 root root
    sharedscripts
    postrotate
        # 发送USR1信号给Nginx主进程,让其重新打开日志文件
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
        mv /usr/local/nginx/logs/access/access.log-$(date -d "today" +%Y%m%d) /usr/local/nginx/logs/access/access_$(date -d "yesterday" +%Y%m%d).log
    endscript
}
/usr/local/nginx/logs/error.log {
        # 每天切分
    daily
        # 如果日志文件不存在,继续下一个而不报错
    missingok
        #保留30天的日志
    rotate 30
        # 压缩旧日志
    compress
        # 延迟压缩,即下一次切分时压缩上一次的日志
    delaycompress
        # 如果日志为空,不进行切分
    notifempty
        # 使用日期作为后缀
    dateext
      # 旧文件存放路径
    olddir /usr/local/nginx/logs/error/
        # 创建新日志文件的权限和所有者(根据实际情况修改)
    create 0640 root root
    sharedscripts
    postrotate
        # 发送USR1信号给Nginx主进程,让其重新打开日志文件
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
        mv /usr/local/nginx/logs/error/error.log-$(date -d "today" +%Y%m%d) /usr/local/nginx/logs/error/error_$(date -d "yesterday" +%Y%m%d).log
    endscript
}

创建定时任务

sudo vim /etc/cron.d/logrotate-nginx

填入如下内容

0 0 * * * root /usr/sbin/logrotate -f /etc/logrotate.d.nginx/nginx

重启crond服务

  service crond restart 或 systemctl restart crond.service
<think>好的,用户现在用的是瑞芯微的RV1126硬件平台,想要开发摄像头驱动和ISP驱动。首先,我需要回忆一下RV1126的相关资料。RV1126是一款针对视觉处理的芯片,通常用于摄像头、智能安防等领域,所以摄像头驱动和ISP确实是关键部分。 用户可能有一定的嵌入式开发经验,但可能对RV1126的具体开发流程不太熟悉。需要先确定他们的开发环境是否已经搭建好了,比如SDK、交叉编译工具链等。如果用户已经完成了这些基础工作,接下来就是具体的驱动开发步骤。 摄像头驱动方面,RV1126通常支持MIPI CSI-2接口的摄像头模块。需要确认用户使用的摄像头型号是否兼容,或者是否需要自己适配。可能需要修改设备树(Device Tree)来配置MIPI接口参数,比如时钟频率、数据通道数等。还有I2C通信,用于配置摄像头传感器的寄存器,这部分可能需要编写或调整驱动代码。 然后是ISP驱动,RV1126内置了ISP模块,处理图像数据如降噪、HDR等。用户可能需要配置ISP的参数,或者根据具体需求调整图像处理流程。瑞芯微的SDK里可能有相关的文档和示例代码,需要引导用户参考这些资料,比如如何通过mediactl或v4l2工具进行配置。 另外,用户可能会遇到调试问题,比如图像不显示、颜色异常等。这时候可能需要检查设备树配置是否正确,时钟信号是否稳定,或者I2C通信是否正常。还有可能是电源管理的问题,摄像头模块的供电是否充足。 用户可能还不太清楚如何测试驱动是否正常工作,可能需要指导他们使用工具如v4l2-ctl来捕获图像,或者使用瑞芯微提供的调试工具。另外,ISP的调试可能需要通过参数调整来优化图像质量,这部分可能需要反复试验。 需要提醒用户注意内核版本和SDK的兼容性,不同版本的SDK可能在驱动支持上有差异。如果用户遇到编译错误或驱动加载失败,建议检查内核配置和驱动模块的依赖关系。 最后,考虑到用户的具体需求,可能需要推荐他们查阅RV1126的官方文档,加入开发者社区或论坛,获取更多的支持和案例分享。如果有具体的错误信息或日志,分析起来会更有效率。</think>开发摄像头驱动和ISP驱动在RV1126平台上的实现可以分为以下几个关键步骤,以下是基于瑞芯微平台的开发要点总结: --- ### **一、RV1126视觉开发基础** 1. **硬件特性认知** - 双核NPU(2Tops算力)支持INT8/INT16量化 - 内置第三代ISP(支持HDR、3DNR等图像增强算法) - 支持MIPI CSI-2/DVP等摄像头接口 2. **开发环境搭建** ```bash # 官方推荐工具链(需联系瑞芯微获取) tar xvf rv1126_toolchain.tar.gz export PATH=$PATH:/opt/rv1126/gcc-arm-8.3-2019.11-x86_64-arm-linux-gnueabihf/bin ``` --- ### **二、摄像头驱动开发流程** #### **1. 设备树配置** ```dts // kernel/arch/arm/boot/dts/rv1126-ipc.dtsi &i2c1 { status = "okay"; camera0: camera-module@10 { compatible = "sony,imx415"; // 替换实际传感器型号 reg = <0x10>; clocks = <&cru CLK_MIPICSI_OUT>; clock-names = "xvclk"; port { camera_out: endpoint { remote-endpoint = <&mipi_in_ucam0>; data-lanes = <1 2 3 4>; // MIPI通道配置 link-frequencies = /bits/ 64 <594000000>; }; }; }; }; &mipi_csi2 { status = "okay"; ports { port@0 { mipi_in_ucam0: endpoint@1 { remote-endpoint = <&camera_out>; data-lanes = <1 2 3 4>; }; }; }; }; ``` #### **2. V4L2驱动框架适配** - 实现`struct v4l2_subdev_ops`操作集 - 注册I2C驱动: ```c static struct i2c_driver imx415_i2c_driver = { .driver = { .name = "imx415", .of_match_table = imx415_of_match, }, .probe = imx415_probe, .remove = imx415_remove, }; module_i2c_driver(imx415_i2c_driver); ``` --- ### **三、ISP驱动开发要点** #### **1. ISP管线配置** 通过`media-ctl`工具验证数据流: ```bash media-ctl -p -d /dev/media0 # 预期输出应包含实体链路: # "imx415 1-0010" -> "rkisp1_isp" ``` #### **2. 图像调优参数设置** 通过`v4l2-ctl`调整ISP参数: ```bash v4l2-ctl -d /dev/v4l-subdev0 \ --set-ctrl brightness=128 \ --set-ctrl contrast=90 \ --set-ctrl saturation=100 ``` #### **3. HDR模式启用(以IMX415为例)** ```c // 通过I2C发送传感器配置命令 static int imx415_set_hdr(struct i2c_client *client, u32 mode) { u8 reg_val[3]; reg_val[0] = 0x30; // HDR控制寄存器地址 reg_val[1] = (mode & 0x0F) << 4; i2c_master_send(client, reg_val, 2); return 0; } ``` --- ### **四、典型问题排查** 1. **图像无输出** - 检查供电:`cat /sys/class/regulator/regulator.9/voltage` - 验证时钟信号:示波器测量XCLK引脚(正常应输出24MHz) 2. **颜色异常** ```bash # 确认Bayer格式匹配 v4l2-ctl --get-fmt-video # 输出应为:'RG10' (对于IMX415) ``` 3. **ISP超时错误** ```dmesg [ 256.390241] rkisp1: timeout waiting for isp config lock! ``` 需检查时钟频率配置: ```dts &cru { assigned-clocks = <&cru CLK_MIPICSIOUT_RX>; assigned-clock-rates = <594000000>; // 需与传感器输出匹配 }; ``` --- ### **五、开发资源推荐** 1. **官方文档** - 《RV1126 TRM》第12章ISP子系统 - 《Rockchip_Developer_Guide_ISP3.x_CN》 2. **调试工具** ```bash # ISP3D调试工具(需配套SDK) isp_demo --sensor=imx415 --action=test ``` 建议通过瑞芯微官方GitHub获取最新内核补丁(注意分支选择): ``` git clone -b rv1126_linux_release https://github.com/rockchip-linux/kernel.git ``` 开发过程中若遇到具体硬件兼容性问题,建议直接联系瑞芯微FAE获取传感器适配支持包(Sensor Driver Adaptation Kit)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值