热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎样分析Linux日志系统

这篇文章给大家介绍怎样分析Linux日志系统,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.日志概念   

这篇文章给大家介绍怎样分析Linux日志系统,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

1.日志概念

    日志文件详细地记录了系统每天发生的各种各样的事件。用户可以通过日志文件检查错误产生的原因,或者在受到***和******时追踪***者的踪迹。日志的两个比较重要的作用是:审核和监测。  
Linux系统的日志主要分为  两种类型:  
1.进程所属日志  
由用户进程或其他系统服务进程自行生成的日志,比如服务器上的access_log与error_log日志文件。  
2.syslog消息  
系统syslog记录的日志,任何希望记录日志的系统进程或者用户进程都可以给调用syslog来记录日志。  
日志系统可以划分为  三个子系统:  
1.  连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。  
2.  进程统计--由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。  
3.  错误日志--由syslogd(8)执行。各种系统守护进程、用户程序和内核通过syslog(3)向文件/var/log/messages报告值得注意的事件。  
   

2.察看日志文件

    Linux系统所有的日志文件都在/var/log下,且  必须有root权限才能察看。  
  日志文件其实是纯文本的文件,每一行就是一个消息。察看方式有很多。  
1.  cat命令。日志文件总是很大的,因为从第一次启动Linux开始,消息都累积在日志文件中。如果这个文件不只一页,那么就会因为显示滚动得太快看不清文件的内容。  
2.  文本编辑器。最好也不要用文本编辑器打开日志文件,这是因为一方面很耗费内存,另一方面不允许随意改动日志文件。  
3.用more或less那样的分页显示程序。  
4.用grep查找特定的消息。  
每一行表示一个消息,而且都由四个域的固定格式组成:  
n          时间标签(timestamp),表示消息发出的日期和时间  
n          主机名(hostname)(在我们的例子中主机名为escher),表示生成消息的计算机的名字。如果只有一台计算机,主机名就可能没有必要了。但是,如果在网络环境中使用syslog,那么就可能要把不同主机的消息发送到一台服务器上集中处理。  
n          生成消息的子系统的名字。可以是"kernel",表示消息来自内核,或者是进程的名字,表示发出消息的程序的名字。在方括号里的是进程的PID。  
n          消息(message),剩下的部分就是消息的内容。  
 举例:
在[root@localhost root]# 提示符下输入:tail /var/log/messages  
Jan 05 21:55:51 localhost last message repeated 3 times  
Jan 05 21:55:51 localhost kernel: [drm] AGP 0.99 on Intel i810 @ 0xf0000000 128M  
B  
Jan 05 21:55:51 localhost kernel: [drm] Initialized i830 1.3.2 20021108 on minor  
 0  
Jan 05 21:55:51 localhost kernel: mtrr: base(0xf0000000) is not aligned on a siz  
e(0x12c000) boundary  
Jan 05 21:56:35 localhost  1月 28 21:56:35 gdm(pam_unix)[4079]: session opened f  
or user root by (uid=0)  
Jan 05 21:56:39 localhost  1月 28 21:56:39 gconfd (root-4162): 正在启动(版本 2.  
2.0),pid 4162 用户"root"  
Jan 05 21:56:39 localhost  1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re  
adonly:/etc/gconf/gconf.xml.mandatory"指向位于 0 的只读配置源  
Jan 05 21:56:39 localhost  1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re  
adwrite:/root/.gconf"指向位于 1 的可写入配置源  
Jan 05 21:56:39 localhost  1月 28 21:56:39 gconfd (root-4162): 解析的地址"xml:re  
adonly:/etc/gconf/gconf.xml.defaults"指向位于 2 的只读配置源  
Jan 05 21:58:20 localhost kernel: MSDOS FS: IO charset cp936  
     
    值得注意的是,与连接时间日志不同,  进程统计子系统默认不激活,它必须启动。在Linux 系统中启动进程统计使用accton命令,必须用root身份来运行。accton命令的形式为:accton file,file必须事先存在。先使用touch命令创建pacct文件:touch /var/log/pacct,然后运行accton:accton /var/log/pacct。一旦accton被激活,就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的accton命令。  
   

3.日志系统工作原理及配置

3.1 syslog

    它同  closelog, openlog共同给system logger发送消息。  
    Linux内核由很多子系统组成,包括网络、文件访问、内存管理等。子系统需要给用户传送一些消息,这些消息内容包括消息的来源及其重要性等。所有的子系统都要把消息送到一个可以维护的公用消息区。于是,就有了一个叫Syslog的程序。  
    这个程序负责接收消息(比如:系统核心和许多系统程序产生的错误信息、警告信息和其他信息,每个信息都包括重要级),并把消息分发到合适的地方。通常情况下,所有的消息都被记录到特定的文件——日志文件中(通常是/var/adm或/var/log目录下的messages文件),特别重要的消息也会在用户终端窗口上显示出来。  
     syslog工具有两个重要文件:syslogd和syslog.Conf
     它能接受访问系统的日志信息并且根据 "/etc/syslog.conf" 配置文件中的指令处理这些信息。守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。
   

3.2 syslogd守护进程

  就象其它复杂的操作系统那样,Linux也是由很多不同的子系统组成的。有些叫做daemon的程序一直在后台运行(daemon:守护神之意。也就是说,他们"默默无闻",不需要和用户交互),处理一些象打印、发送邮件、建立Internet连接,等等日常工作。每一个子系统发出日志消息的时候都会给消息指定一个类型。  一个消息分成两个部分:  "  设备(facility  "  "  级别(level)"    "设备  "标识发出消息的子系统,可以把同一类型的消息组合在一起,  "级别  "表示消息的重要性,其范围从  debug(最不重要)到  emerg(最重要),  facility和  level组合起来称为  priority。(详细解释参照  5.3)  
 /usr/include/sys/syslog.h  中对此有相关的定义。  
    用户看不到daemon程序,因为它们没有窗口和用户界面。但是,这些程序有时候也要给用户传递一些信息。为了实现这个目的,就需要一个特殊的机制。syslogd就是daemon的一个很好的例子,它在后台运行并且把消息从日志区转移到日志文件中去。  
 函数接口  
#include  
void openlog( char * <程序的名字>, int <选项>, int )  
其中,<选项>可以是以下值的OR组合:  
    LOG_CONS : 如果消息无法送到syslogd,直接输出到系统console。  
    LOG_NDELAY : 立即打开到syslogd的连接,默认连接是在第一次写入讯息时才打开的。  
    LOG_PERROR : 将消息也同时送到stderr 上  
    LOG_PID : 将PID记录到每个消息中  
void syslog( int , char * )  
其中,是facility和level的OR组合  
void closelog( void )  
一般只需要用syslog()函数,其他函数可以不用。  
   

3.3 syslog.conf

    这是一个非常重要的文件。位于"/etc/"目录下。通知 syslogd 如何根据设备和信息重要级别来报告信息。
 该文件使用下面的形式:
 

facility.level    action
syslog.conf 的第一列facility.level用来指定日志功能和日志级别,中间用.隔开,可以使用*来匹配
所有的日志功能和日志级别。第二列action是消息的分发目标。

 空白行和以#开头的行是注释,可以忽略。
 Facility.level 字段也被称做选择域(seletor)。
n          facility 指定 syslog 功能,主要包括以下这些:
 

auth  由 pam_pwdb 报告的认证活动。
authpriv 包括特权信息如用户名在内的认证活动
cron  与 cron 和 at 有关的信息。
daemon 与 inetd 守护进程有关的信息。
kern  内核信息,首先通过 klogd 传递。
lpr   与打印服务有关的信息。
mail  与电子邮件有关的信息
mark  syslog 内部功能用于生成时间戳
news  来自新闻服务器的信息
syslog  由 syslog 生成的信息
user   由用户程序生成的信息
uucp   由 uucp 生成的信息
local0----local7   与自定义程序使用,例如使用 local5 做为 ssh 功能
*   通配符代表除了 mark 以外的所有功能

 level   级别,决定讯息的重要性。
  与每个功能对应的优先级是按一定顺序排列的,emerg 是最高级,其次是 alert,依次类推。缺省时,在 /etc/syslog.conf 记录中指定的级别为该级别和更高级别。如果希望使用确定的级别可以使用两个运算符号!(不等)和=。
 例如:user.=info  表示告知 syslog 接受所有在 info 级别上的 user 功能信息。  
n          以下的等级重要性逐次递减  
emerg           该系统不可用
 

alert            需要立即被修改的条件
crit             阻止某些工具或子系统功能实现的错误条件
err              阻止工具或某些子系统部分功能实现的错误条件
warning          预警信息
notice           具有重要性的普通条件
info             提供信息的消息
debug            不包含函数条件或问题的其他信息
none             没有重要级,通常用于排错
*                所有级别,除了none

n          action 字段为动作域,所表示的活动具有许多灵活性,特别是,可以使用名称管道的作用是可以使 syslogd 生成后处理信息。
 syslog 主要支持以下活动:
 

file                      将消息追加到指定的文件尾
terminal 或 print         完全的串行或并行设备标志符
@host                     远程的日志服务器
username                  将消息写到指定的用户
named pipe                指定使用 mkfifo 命令来创建的 FIFO 文件的绝对路径。
*                         将消息写到所有的用户

     选择域指明消息的类型和优先级;动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。比如如果指明"crit",则所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到什么地方。  
 以下是一个实际站点的配置(syslog.conf)文件:
# Store critical stuff in critical
#
*.=crit;kern.none            /var/adm/critical
这个将把所有信息以优先权的crit保存在/var/adm/critical文件中,除了一些内核信息
# Kernel messages are first, stored in the kernel
# file, critical messages and higher ones also go
# to another host and to the console
#
kern.*                       /var/adm/kernel
kern.crit                    @finlandia
kern.crit                    /dev/console
kern.info;kern.!err          /var/adm/kernel-info
第一条代码指引一些内核设备访问文件/var/adm/kernel的信息。
第二条代码直接引导所有拥有crit和更高优先权的内核信息访问远程主机。如果它们也存储在远程主机上,仍旧可以试着找到毁坏的原因。
第四行说明syslogd 保存了所有拥有info 到warning优先级的内核信息在/var/adm/kernel-info文件夹下。所有err和更高优先级的被排除在外。
# The tcp wrapper loggs with mail.info, we display
# all the connections on tty12
#
mail.=info                   /dev/tty12
这个引导所有使用mail.info (in source LOG_MAIL | LOG_INFO)的信息到/dev/tty12下,第12
个控制台。例如tcpwrapper tcpd(8)载缺省时使用这个                     
# Store all mail concerning stuff in a file
mail.*;mail.!=info           /var/adm/mail
模式匹配了所有具有mail功能的信息,除了拥有info优先级的。他们将被保存在文件/var/adm/mail
# Log all mail.info and news.info messages to info
#
mail,news.=info              /var/adm/info
提取所有具有mail.info 或news.info 功能优先级的信息存储在文件/var/adm/info
# Log info and notice messages to messages file
#
*.=info;*.=notice;\
        mail.none  /var/log/messages
使所有syslogd日志中具有info 或notice功能的信息存储在文件/var/log/messages中,除了所有mail功能的信息
# Log info messages to messages file
#
*.=info;\
        mail,news.none       /var/log/messages
这个声明使syslogd日志中所有具有info优先权的信息存储在/var/log/messages文件中。但是一些有mail 或news功能的信息不能被存储。
# Emergency messages will be displayed using wall
#
*.=emerg                     *
这行代码告诉syslogd写所有紧急信息到所有当前登陆用户日志中。这个将被实现
# Messages of the priority alert will be directed
# to the operator
#
*.alert                      root,joey
*.*                          @finlandia
这个代码指引所有具有alert 或更高级权限的信息到终端操作。
第二行代码引导所有信息到叫做finlandia的远程主机。这个代码非常有用,特别是在所有syslog信息将被保存到一台机器上的群集计算机。
   

3.4 klogd 守护进程

klog是一个从UNIX内核接受消息的设备 
klogd 守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd 传来的所有信息。也就是说,klogd会读取内核信息,并转发到syslogd进程。然而,如果调用带有 -f filename 变量的 klogd 时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd 就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用 syslogd 的好处在于可以查找大量错误。
 

日志管理及日志保护

    logrotate程序用来帮助用户管理日志文件,它以自己的守护进程工作。logrotate周期性地旋转日志文件,可以周期性地把每个日志文件重命名成一个备份名字,然后让它的守护进程开始使用一个日志文件的新的拷贝。在/var/log/下产生如maillog、maillog.1、 maillog.2、boot.log.1、boot.log.2之类的文件。它由一个配置文件驱动,该文件是 /etc/logroatate.conf。
以下是logroatate.conf文件例子:
# see "man logrotate" for details
# rotate log files weekly
weekly
#以7天为一个周期
# keep 4 weeks worth of backlogs
rotate 4
#每隔4周备份日志文件
# send errors to root
errors root
#发生错误向root报告
# create new (empty) log files after rotating old ones
create
#转完旧的日志文件就创建新的日志文件
# uncomment this if you want your log files compressed
#compress
#指定是否压缩日志文件
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own lastlog or wtmp -- we&#39;ll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
}
# system-specific logs may be configured here
 

    在网络应用中,有一种保护日志的方式,在网络中设定一台秘密的syslog主机,把这台主机的网卡设为混杂模式,用来监听子网内所有的syslog包,这样把所有需要传送日志的主机配置为向一台不存在的主机发送日志即可。这样即使***攻陷了目标主机,也无法通过syslog.conf文件找到备份日志的主机,那只是一个不存在的主机。实际操作中还可以辅以交换机的配置,以确保syslog包可以被备份日志主机上的syslog进程接受到。比如把 syslog.conf中的传送日志主机设为 @192.168.0.13,但实际网络中不存在这个日志主机,实际可能是192.168.0.250或者其他主机正在接受syslog包。  

undefined

关于怎样分析Linux日志系统就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


推荐阅读
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 【原创】《Linux设备驱动程序》学习之循序渐进---调试技术第四章---调试技术内核编程带有它自己的,独特的调试挑战性.内核代码无法轻易地在一个调试器下运行,也无法轻易的被跟踪,因为 ... [详细]
  • UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
    一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • 本文探讨了在 macOS Retina 显示屏上使用 OpenJDK 11 开发代码编辑器时遇到的等宽字体渲染问题,并提供了详细的分析和可能的解决方案。 ... [详细]
  • 本文介绍了编程语言的基本分类,包括机器语言、汇编语言和高级语言的特点及其优缺点。随后详细讲解了Python解释器的安装与配置方法,并探讨了Python变量的定义、使用及内存管理机制。 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Panabit应用层流量管理解决方案
    Panabit是一款国内领先的应用层流量管理解决方案,提供高度开放且免费的专业服务,尤其擅长P2P应用的精准识别与高效控制。截至2009年3月25日,该系统已实现对多种网络应用的全面支持,有效提升了网络资源的利用效率和安全性。 ... [详细]
  • 官网的log格式配置文档如下:https:www.rsyslog.comdocv8-stableconfigurationtemplates.html定制一个仅包含l ... [详细]
author-avatar
乌鸦晕倒_767
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有