技术好文共享::Linux系统日志管理日志转储

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 技术好文共享::Linux系统日志管理日志转储

本文目录Linux日志服务器设置 Linux日志轮替(日志转储)logrotate配置文件把自己的日志加入日志轮替logrotate命令:进行日志转储(轮替)


回到顶部Linux日志服务器设置


使用“@IP:端口”或“@@IP:端口”的格式可以把日志发送到远程主机上。


假设需要管理几十台服务器,每天的重要工作就是查看这些服务器的日志,可是每台服务器单独登录,并且查看日志非常烦琐,此时可以把几十台服务器的日志集中到一台日志服务器上吗?这样每天只要登录这台日志服务器,就可以查看所有服务器的日志,。


设置过程


假设服务器端的服务器 IP 地址是 192.168.0.210,主机名是 localhost.localdomain;客户端的服务器 IP 地址是 192.168.0.211,主机名是 www1。我们现在要做的是把 192.168.0.211 的日志保存在 192.168.0.210 这台服务器上。实验过程如下:


#服务器端设定(192.168.0.210):


【root@localhost ~】# vi /etc/rsyslog.conf


…省略部分输出…


# Provides TCP syslog reception


$ModLoad imtcp


$InputTCPServerRun 514


#取消这两句话的注释,允许服务器使用TCP 514端口接收日志


…省略部分输出…


【root@localhost ~】# service rsyslog restart


#重启rsyslog日志服务


【root@localhost ~】# netstat -tlun | grep 514


tcp 0 0 0.0.0.0:514 0.0.0.0: LISTEN


#查看514端口已经打开


#客户端设置(192.168.0.211):


【root@www1 ~】# vi /etc/rsyslog.conf


#修改日志服务配置文件


. @@192.168.0.210:514


#把所有日志采用TCP协议发送到192.168.0.210的514端口上


【root@www1 ~】# service rsyslog restart


#重启日志服务


这样日志服务器和客户端就搭建完成了,以后 192.168.0.211 这台客户机上所产生的所有日志都会记录到 192.168.0.210 上。比如:


#在客户机上(192.168.0.211)


【root@wwwl ~】# useradd zhangsan


#添加zhansan用户提示符的主机名是www1)


#在限务器(192.168.0.210)上


【root@localhost ~】# vi /var/log/secure


#査看服务器的secure日志(注意:主机名是localhost)


Aug 8 23:00:57 wwwl sshd【1408】: Server listening on 0.0.0.0 port 22.


Aug 8 23:00:57 wwwl sshd【1408】: Server listening on :: port 22.


Aug 8 23:01:58 wwwl sshd【1630】: Accepted password for root from 192.168.0.101 port 7036 ssh2


Aug 8 23:01:58 wwwl sshd【1630】: pam_unix(sshd:session): session opened for user root by (uid=0)


Aug 8 23:03:03 wwwl useradd【1654】: new group: name=zhangsan, GID-505


Aug 8 23:03:03 wwwl useradd【1654】: new user: name=zhangsan, UXD=505, GID=505,


home=/home/zhangsan, shell=/bin/bash


Aug 8 23:03:09 wwwl passwd: pam_unix(passwd:chauthtok): password changed for zhangsan


#注意:查看到的日志内容的主机名是www1,说明我们虽然查//代码效果参考:http://hnjlyzjd.com/hw/wz_25140.html

看的是服务器的日志文件,但是在其中可以看到客户机的日志内容

需要注意的是,日志服务是通过主机名来区别不同的服务器的。所以,如果配置了日志服务,则需要给所有的服务器分配不同的主机名。


回到顶部Linux日志轮替(日志转储)


日志记录和保存了系统中所有的重要事件。但是日志文件也需要进行定期的维护,因为日志文件是不断增长的,如果完全不进行日志维护,而任由其随意递增,那么用不了多久硬盘就会被写满。


日志维护的最主要的工作就是把旧的日志文件删除,从而腾出空间保存新的日志文件。 Linux 系统使用logrotate 来进行日志轮替(也叫日志转储)的,也就是把旧的日志文件移动并改名,同时创建一个新的空日志文件用来记录新日志,当旧日志文件超出保存的范围时就删除。


日志文件的命名规则


日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围时就删除。那么,旧的日志文件改名之后,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中的“dateext”参数。


如果配置文件中有“dateext”参数,那么日志会用日期来作为日志文件的后缀,如“secure-20130605”。这样日志文件名不会重叠,也就不需要对日志文件进行改名,只需要保存指定的日志个数,删除多余的日志文件即可。


如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志,用来保存新的日志;当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”,当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志;以此类推。


回到顶部logrotate配置文件


我们来查看一下 logrotate 的配置文件 /etc/logrotate.conf 的默认内容。


【root@localhost ~】# vi /etc/logrotate.conf


#see "man logrotate" for details


#rotate log files weekly


weekly


#每周对日志文件进行一次轮替


#keep 4 weeks worth of backlogs rotate 4


#保存4个日志文件,也就是说,如果进行了5次日志轮替,就会删除第一个备份曰志


#create new (empty) log files after rotating old ones create


#在日志轮替时,自动创建新的日志文件


#use date as a suffix of the rotated file dateext


#使用日期作为日志轮替文件的后缀


#uncomment this if you want your log files compressed #compress


#日志文件是否压缩。如果取消注释,则日志会在转储的同时进行压缩


#以上日志配置为默认配置,如果需要轮替的日志没有设定独立的参数,那么都会遵循以上参数


#如果轮替曰志配置了独立参数,那么独立参数的优先级更高


#RPM packages drop log rotation information into this directory include /etc/logrotate.d


#包含/etc/logrotate.d/目录中所有的子配置文件。也就是说,会把这个目录中所有的子配置文件读取进来,进行日志轮替


#no packages own wtmp and btmp -- we'11 rotate them here


#以下两个轮替曰志有自己的独立参数,如果和默认的参数冲突,则独立参数生效


/var/log/wtmp {


#以下参数仅对此目录有效


monthly


#每月对日志文件进行一次轮替


create 0664 root utmp


#建立的新日志文件,权限是0664,所有者是root,所属组是utmp组


minsize 1M


#日志文件最小轮替大小是1MB。也就是日志一定要超过1MB才会轮替,否则就算时间达到一个月,也不进行曰志轮替


rotate 1


#仅保留一个曰志备份。也就是只保留wtmp和wtmp.1曰志)


/var/log/btmp {


#以下参数只对/var/log/btmp生效


missingok


#如果日志不存在,则忽略该日志的警告信患


monthly


create 0600 root utmp


rotate 1


}


# system-specific logs may be also be configured here.


在这个配置文件中,主要分为三部分:


第一部分是默认设置,如果需要转储的日志文件没有特殊配置,则遵循默认设置的参数;


第二部分是读取 /etc/logrotate.d/ 目录中的日志轮替的子配置文件,也就是说,在 /etc/logrotate.d/ 目录中的所有符合语法规则的子配置文件也会进行日志轮替;


第三部分是对 wtmp 和 btmp 日志文件的轮替进行设定,如果此设定和默认参数冲突,则当前设定生效(如 wtmp 的当前参数设定的轮替时间是每月,而默认参数的轮替时间是每周,则对 wtmp 这个日志文件来说,轮替时间是每月,当前的设定参数生效)。


logrotate 配置文件的主要参数如表 1 所示。


参 致参数说明


daily


日志的轮替周期是毎天


weekly


日志的轮替周期是每周


monthly


日志的轮控周期是每月


rotate数宇


保留的日志文件的个数。0指没有备份


compress


当进行日志轮替时,对旧的日志进行压缩


create mode owner group


建立新日志,同时指定新日志的权限与所有者和所属组.如create 0600 root utmp


mail address


当进行日志轮替时.输出内存通过邮件发送到指定的邮件地址


missingok


如果日志不存在,则忽略该日志的警告信息


nolifempty


如果曰志为空文件,則不进行日志轮替


minsize 大小


日志轮替的最小值。也就是日志一定要达到这个最小值才会进行轮持,否则就算时间达到也不进行轮替


size大小


日志只有大于指定大小才进行日志轮替,而不是按照时间轮替,如size 100k


dateext


使用日期作为日志轮替文件的后缀,如secure-20130605


sharedscripts


在此关键宇之后的脚本只执行一次


prerotate/cndscript


在曰志轮替之前执行脚本命令。endscript标识prerotate脚本结束


postrolaie/endscripl


在日志轮替之后执行脚本命令。endscripi标识postrotate脚本结束


这些参数中较为难理解的应该是 prerotate/endscript 和 postrotate/endscript,我们利用“man logrotate”中的例子来解释一下这两个参数。例如:


"/var/log/httpd/access.log" /var/log/httpd/error.log {


#日志轮替的是/var/log/httpd/中RPM包默认安装的apache正确访问日志和错误日志


rotate 5


#轮替5次


mail www@my.org


#把信息发送到指定邮箱


size 100k


#日志大于100KB时才进行日志轮替,不再按照时间轮替


sharedscripts


#以下脚本只执行一次


postrotate


#在日志轮替结束之后,执行以下脚本


/usr/bin/killall -HUP httpd


#重启apache 服务


endscript


#脚本结束


}


prerotate 和 postrotate 主要用于在日志轮替的同时执行指定的脚本,一般用于日志轮替之后重启服务。这里强调一下,如果你的日志是写入 rsyslog 服务的配置文件的,那么把新日志加入 logrotate 后,一定要重启 rsyslog 服务,否则你会发现,虽然新日志建立了,但数据还是写入了旧的日志当中。那是因为虽然 logrotate 知道日志轮替了,但是 rsyslog 服务并不知道。


同理,如果采用源码包安装了 apache、Nginx 等服务,则需要重启 apache 或 Nginx 服务,同时还要重启 rsyslog 服务,否则日志也不能正常轮替。


不过,这里有一个典型应用就是给予特定的日志加入 chattr 的 a 属性。如果系统文件加入了 a 属性,那么这个文件就只能增加数据,而不能删除和修改已有的数据,root 用户也不例外。


因此,我们会给重要的日志文件加入 a 属性,这样就可以保护日志文件不被恶意修改。不过,一旦加入了 a 属性,那么在进行日志轮替时,这个日志文件是不能被改名的,当然也就不能进行日志轮替了。我们可以利用 prerotate 和 postrotate 参数来修改日志文件的 chattr 的 a 属性。


回到顶部把自己的日志加入日志轮替


如果有些日志默认没有加入日志轮替(比如源码包安装的服务的日志,或者自己添加的日志),那么这些日志默认是不会进行日志轮替的,这样当然不符合我们对日志的管理要求。如果需要把这些日志也加入日志轮替,那该如何操作呢?


这里有两种方法:


第一种方法是直接在 /etc/logrotate.conf 配置文件中写入该日志的轮替策略,从而把日志加入轮替;


第二种方法是在 /etc/logrotate.d/ 目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被包含到主配置文件中,所以也可以把日志加入轮替。


推荐第二种方法,因为系统中需要轮替的日志非常多,如果全部直接写入 /etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。


说起来很复杂,我们举个例子。还记得我们自己生成的 /var/log/alert.log 日志吗?这个日志不是系统默认日志,而是我们通过 /etc/rsyslog.conf 配置文件自己生成的日志,所以默认这个日志是不会进行轮替的。如果我们需要把这个日志加入日志轮替策略,那该怎么实现呢?我们采用第二种方法,也就是在 /etc/logrotate.d/ 目录中建立此日志的轮替文件。


具体步骤如下:


【root@localhost ~】# chattr +a /var/log/alert.log #先给日志文件赋予chattr的a属性,保证日志的安全


【root@localhost ~】# vi /etc/logrotate.d/alter


#创建alter轮替文件,把/var/log/alert.log加入轮替


/var/log/alert.log {


weekly


#每周轮替一次


rotate 6


#保留6个轮替曰志


sharedscripts


#以下命令只执行一次


prerotate


#在日志轮替之前执行


/usr/bin/chattr -a /var/log/alert.log


#在日志轮替之前取消a属性,以便让日志可以轮替


endscript


#脚本结朿


sharedscripts


postrotate


#在日志轮替之后执行


/usr/bin/chattr +a /var/log/alert.log


#在日志轮替之后,重新加入a属性


endscript


sharedscripts


postrotate


/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2

endscript


#重启rsyslog服务,保证日志轮替正常进行


}


这样我们自己生成的日志 /var/log/alert.log 也就可以进行日志轮替了,当然这些配置信息也是可以直接写入 /etc/logrotate.conf 这个配置文件的。


回到顶部logrotate命令:进行日志转储(轮替)


日志轮替之所以可以在指定的时间备份日志,是因为其依赖系统定时任务。如果大家还记得 /etc/cron.daily/ 目录,就会发现这个目录中是有 logrotate 文件的,查看一下这个文件,命令如下:


【root@localhost ~】# vi /etc/cron.daily/logrotate


#!/bin/sh


/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2

#最主要的就是执行了logrotate命令


EXITVALUE=$?


if 【 $EXITVALUE!= 0 】; then


/usr/bin/logger -t logrotate "ALERT exited abnormally with 【$EXITVALUE】"


fi


exit 0


系统每天都会执行 /etc/cron.daily/logrotate 文件,运行这个文件中的“/usr/sbin/logrotate/etc/logrotate.conf>/dev/null 2>&1”命令。logrotate 命令会依据 /etc/logrotate.conf 配置文件的配置,来判断配置文件中的日志是否符合日志轮替的条件(比如,日志备份时间已经满一周),如果符合,日志就会进行轮替。所以说,日志轮替还是由 crond 服务发起的。


logrotate 命令的格式:


【root@localhost ~】# logrotate 【选项】 配置文件名


【选项】:


如果此命令没有选项,则会按照配置文件中的条件进行日志轮替


-v:显示日志轮替过程。加入了-v选项,会显示日志的轮替过程


-f: 强制进行日志轮替。不管日志轮替的条件是否符合,强制配置文件中所有的日志进行轮替


执行 logrotate 命令,并查看一下执行过程。


【root@localhost ~】# logrotate -v /etc/logrotate.conf


#查看日志轮替的流程


…省略部分输出…


rotating pattern:/var/log/alert.log weekly (6 rotations)


#这就是我们自己加入轮替的alert.log日志


empty log files are rotated, old logs are removed


considering log /var/log/alert.log


log does not need rotating


#时间不够一周,所以不进行日志轮替


…省略部分输出…


此时 /var/log/alert.log 加入了日志轮替,已经被 logrotate 识别并调用了,只是时间没有达到轮替的标准,所以没有进行轮替。那我们强制进行一次日志轮替,看看会有什么结果。


【root@localhost ~】# logrotate -vf /etc/logrotate.conf


#强制进行日志轮替,不管是否符合轮替条件


…省略部分输出…


rotating pattern:/var/log/alert.log forced from command line (6 rotations)


empty log files are rotated, old logs are removed


considering log /var/log/alert.log


log needs rotating


#日志需要轮替


rotating log /var/log/alert.log,log->rotateCount is 6


dateext suffix '-20130607'


#提取日期参数


glob pattern '-【0-9】【0-9】【0-9】【0-9】【0-9】【0-9】【0-9】【0-9】'


glob finding old rotated logs failed


running prerotate script


fscreate context set to unconfined_u:object_r:var_log_t:s0


renaming /var/log/alert.log to /var/log/alert.log-20130607


#旧的日志被重命名


creating new /var/log/alert.log mode = 0600 uid = 0 gid = 0


#创建新日志文件,同时指定权限、所有者和属组


running postrotate script


…省略部分输出…


我们发现,alert.log 日志已经完成了日志轮替。查看一下新生成的日志和旧日志,如下:


【root@localhost ~】# ll /var/log/alert.log


-rw-------.1 root root 0 6月 7 10:07 /var/log/alert.log


-rw-------.1 root root 237 6月 7 09:58 /var/log/alert.log-20130607


#旧的日志文件已经轮替


新的日志文件被自动加入了chattr的a属性


【root@localhost ~】# lsattr /var/log/alert.log


-----a-------e- /var/log/alert.log


logrotate 命令在使用“-f”选项之后,就会不管日志是否符合轮替条件,而强制把所有的日志都进行轮替。

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
3天前
|
安全 Linux
Linux通配符及其在文件搜索和管理中的应用
Linux通配符及其在文件搜索和管理中的应用
|
3天前
|
Java 测试技术 Apache
《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
【7月更文挑战第4天】Apache Log4j 是一个广泛使用的 Java 日志框架,它允许开发者控制日志信息的输出目的地、格式和级别。Log4j 包含三个主要组件:Loggers(记录器)负责生成日志信息,Appenders(输出源)确定日志输出的位置(如控制台、文件、数据库等),而 Layouts(布局)则控制日志信息的格式。通过配置 Log4j,可以灵活地定制日志记录行为。
18 4
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
支付系统40------定时查单-订单未创建,支付宝登陆前在支付宝端创建还是没有创建,不知道,之所以打印警告日志,是因为创建的时候更容易看到它
|
2天前
|
SQL 自然语言处理 网络协议
【Linux开发实战指南】基于TCP、进程数据结构与SQL数据库:构建在线云词典系统(含注册、登录、查询、历史记录管理功能及源码分享)
TCP(Transmission Control Protocol)连接是互联网上最常用的一种面向连接、可靠的、基于字节流的传输层通信协议。建立TCP连接需要经过著名的“三次握手”过程: 1. SYN(同步序列编号):客户端发送一个SYN包给服务器,并进入SYN_SEND状态,等待服务器确认。 2. SYN-ACK:服务器收到SYN包后,回应一个SYN-ACK(SYN+ACKnowledgment)包,告诉客户端其接收到了请求,并同意建立连接,此时服务器进入SYN_RECV状态。 3. ACK(确认字符):客户端收到服务器的SYN-ACK包后,发送一个ACK包给服务器,确认收到了服务器的确
|
4天前
|
运维 Java Apache
Java中的日志框架:Log4j与SLF4J详解
Java中的日志框架:Log4j与SLF4J详解
|
5天前
|
监控 安全 Unix
探索Linux命令repo-rss:管理仓库更新的新视角
`repo-rss`是一个设想中的Linux工具,用于通过RSS订阅跟踪软件仓库更新。它能订阅仓库、检测更新、生成RSS feed并发送通知。主要特点包括实时性、灵活性、自动化和可扩展性。用户可定制订阅、时间间隔及输出格式。示例用法包括订阅Debian仓库、将更新输出为RSS文件或发送至邮箱。使用时需注意安全、资源消耗和隐私,最佳实践包括定期评估、自动化处理、多源订阅和备份。此工具展示了RSS在软件管理中的创新应用。
|
8天前
|
Linux 网络安全 开发工具
Linux 管理远程会话 screen:掌握终端的多任务操作
`Linux screen` 命令让多任务管理变得更简单,尤其在SSH连接远程服务器时。创建新会话如`screen -S backup`,查看会话`screen -ls`,退出`exit`。高级功能包括直接在会话中运行命令,如`screen vim memo.txt`,会话共享以协同工作,以及通过`screen -r`或`-D -r`重新连接或强制恢复断开的会话。提高效率,确保任务不间断运行。
7 1
|
1天前
|
JSON 应用服务中间件 开发工具
Ngnix的http块自定义服务日志,access.log和error.log,log_format指定日志输出格式设置
Ngnix的http块自定义服务日志,access.log和error.log,log_format指定日志输出格式设置
|
2天前
|
XML Java 测试技术
《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-Log4j 2实现日志输出-上篇(详解教程)
【7月更文挑战第5天】Apache Log4j 2是一个日志框架,它是Log4j的升级版,提供了显著的性能提升,借鉴并改进了Logback的功能,同时修复了Logback架构中的问题。Log4j2的特点包括API与实现的分离,支持SLF4J,自动重新加载配置,以及高级过滤选项。它还引入了基于lambda表达式的延迟评估,低延迟的异步记录器和无垃圾模式。配置文件通常使用XML,但也可以是JSON或YAML,其中定义了日志级别、输出目的地(Appender)和布局(Layout)。
|
2天前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法