欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 16_03 _Linux日志系统syslog 有大用

image.png

image.png

linux 日志系统

    syslog   (红帽5)

    syslog-ng  (g genelration 第几代的意思) (ng 下一代) 下一代升级版的日志系统  (红帽6)

            开源版 商业版          

 红帽5 syslog 与 红帽6 syslog-ng本质上差别大,实际上配置起来我们感觉不到差别大

日志系统: syslog 有两个进程


    信息详细程度: 日志级别

    子系统:facility (设施)

    动作:



A:

B:

D:

syslog服务:是一个服务,专门用于提供记录日志的功能,可以为各程序负责记录日志的

可以把每一个程序理解为一个子系统

有两个进程 (两个进程)

    syslogd:系统 (sys system 就是系统),非内核产生的信息

    klogd:内核 (k 就是 kernel 内核),专门负责记录内核产生的日志信息


kernel -->  (bios切换控制后 /sbin/init启动之前 的终端上显示的信息,是在物理终端)

                    (后来/sbin/init之后,比如之后给出让你填账号密码 ,才是虚拟终端)

                    远程登录的叫伪终端


日志需要滚动(日志切割):

messages messages.1 messages.2 (过一段时间(比如一个星期)后,messages重命名为messages.1,再重新开一个新messages  messages.1 是历史信息 ,又过一个星期messages.1 变成了 messages.2,messages 变成了 messages1 再重新开一个新messages )

命令或程序 logrotate 帮助我们完成日志切割 , rotate (滚动旋转)



一般按大小(比如100M)和时间(比如一个星期)滚动一次 (或者两个结合起来用,哪一个先符合,就滚动一下)

/sbin/init之后 由syslogd来记录,因为它是非内核日志

    /var/log/messages: 系统标准错误日志信息

非内核产生的引导信息,各子系统生的信息(不一定都是错误信息,因为不同的日志系统所记录的信息级别不一样,)

它会滚动的以免文件过大

    /var/log/maillog:邮箱系统产生的日志信息 (邮件功能安装完后会自动启动日志的邮件服务功能的)

(将来安装配置邮件服务器的时候,也会涉及到邮件日志的相关内容)

    /var/log/secure:跟安全相关的,它的权限比较独特 (secure 保护,安全)


其它的日志信息,一般情况下也是放在  /var/log 下面,不接受syslog管理的日志文件,也可以放在/var/log 下


syslog:   (它应该是随时运行,服务叫syslog)

    syslogd

    klogd

配置文件在 /etc/syslog.conf

配置文件定义格式为:facility.priority     action

facility,可以理解为日志的来源或设备 目前常用的facility有以下几种

image.png

auth

authpriv 

登录的时候,就是由这两个子系统进行记录

cron #任务计划相关的

daemon # 守护进程,工作在后台的    (比如httpd)

kern # 内核相关的,就是 klogd 记录的

lpr # 打印相关的 ( lpr  Line Print)

mail # 邮件相关的

mark # 标记相关的

news    # 新闻组相关的

security    # 安全相关的,与auth 类似

syslog # 记录syslog自己的

user # 用户相关的

uucp # unix to unix cp 相关的

local0 到 local7 # 用户自定义使用的

*             # 所有的facility (来源,设备,设施)

image.png

priority (log level )日志的级别,一般有以下几种级别(从低到高)

(一般意思上,指定某级别,比它高的级别都会被记录)

debug # 程序或系统的调试信息 (最低级别,级别越低,记录的信息更详细)(一般在排错时用到)

info #  一般信息

notice # 不影响正常功能,需要注意的消息 

warning / warn # 可以影响系统功能,需要提醒用户的重要事件

err/error #错误信息  蓝色警报

crit # ( critical )比较严重的 橙色警报 (黄色警报)

alert # 必须马上处理的  红色警报 (red alert)

emerg / panic # 会导致系统不可用的  (panic 恐慌) ( emerg emergency 紧急事件 ) (系统马上可能会挂掉)

* # 表示所有的日志级别 (写成debug也是类似于 * 吧,因为比debug高的会同时被记录)

none # 跟 * 相反,表示啥也没有



image.png

action(动作)日志记录的位置

系统上的绝对路径 # 普通文件 如: /var/log/xxx

|                               # 管道 通过管道送给其他的命令处理

终端                         # 终端 如: /dev/console    (输出到物理终端上去)

@HOST                   # 远程主机 如 @10.0.0.1    (主机名或ip)把产生的日志通通发送给其它主机

用户                         # 系统用户 如:  root  产生的信息都发给某个用户了

*                              # 登录到系统上的所有用户,一般emerg级别的日志是这样定义的 (告诉别人要挂了,该保存的就保存一下)


把几台的服务器所有日志信息发送给同一台主机(它想接收别的服务器的日志,要修改某些参数),当某黑客攻破一台服务器时,日志信息还在,

这样就加强了安全性

image.png

image.png

定义格式例子:

mail.info /var/log/mail.log  # 表示将mail相关的级别为info及

                                                info以上级别的信息记录到/var/log/mail.log  文件中

auth.=info @10.0..0.1              #  这里 .= 表示精确只记录 info级别的  表示将auth相关的

                                                    基本为info的信息记录到 10.0..0.1  主机上去

user.!=error                              # 表示记录user相关的, 除了error级别以外的其它的信息都记录

user.!error                                 # 表示与user.error相反

*.info                                         # 表示记录所有的日志信息的info级别及以上级别

mail.*                                         # 表示记录mail子系统相关的 (mail子系统所产生的) 所有级别的信息

*.*                                              #  所有信息

cron.info;mail.info                     # 多个日志来源,可以使用分号 ; 隔开            

cron,mail.info                            # 与 cron.info;mail.info  同一个意思 (facility 可以使用逗号分隔)

mail.*;mail.!=info                       #  记录mail的所有级别,但是除了info级别 (表示记录mail相关的所有级别的信息,

                                                     但是不包括info级别的)

                  








物理终端( /dev/console )

开机很快显示的信息 (/sbin/init启动之前),记录在 /var/log/dmesg (内核日志)当中

可以cat 查看

或者 # dmesg  (专门打开这个文件 /var/log/dmesg,并显示出来)

dmesg = diagnostic message   diagnostic (诊断的,判断的;特征的) 

[root@localhost ~]# dmesg

    下图一直到最后的信息 ,都在启动 /sbin/init 之前产生的信息

image.png


[root@localhost ~]# cat /var/log/dmesg         (也可以使用它来查看,与 dmesg 命令的结果,可能并不完全一样)

image.png



[root@localhost ~]# man logrotate

image.png



[root@localhost ~]# ls /etc/cron.daily/

00webalizer  0logwatch  cups       makewhatis.cron  prelink  rpm

0anacron     certwatch  logrotate  mlocate.cron     rhsmd    tmpwatch

[root@localhost ~]#

[root@localhost ~]# vim /etc/cron.daily/logrotate  (里面的意思 大约就是判断有没有达到logrotate的条件,达到了 就log rotate 一下)

#!/bin/sh


/usr/sbin/logrotate /etc/logrotate.conf

EXITVALUE=$?

if [ $EXITVALUE != 0 ]; then

    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"

fi

exit 0

~


[root@localhost cron.d]# vim /etc/logrotate.conf

# see "man logrotate" for details

# rotate log files weekly

weekly    #每周滚动一次


# keep 4 weeks worth of backlogs

rotate 4    #保存几个历史版本,把超出的全部给它删了


# 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     #它还包含进来 /etc/logrotate.d 这个文件夹里面的所有文件


# no packages own wtmp -- we'll rotate them here

/var/log/wtmp {

    monthly # 按月滚动

    minsize 1M # 最小1M

    create 0664 root utmp  #creat 一个文件 权限 属主 文件名

    rotate 1  # 保留几个历史版本

}


# 可以在这里添加自定义,也可以在 /etc/logrotate.d 创建一个文件

/var/log/btmp {

    missingok # 此前没有的话也没关系

    monthly # 按月滚动

    minsize 1M # 最小1M

    create 0664 root utmp  #creat 一个文件 权限 属主 文件名

    rotate 1  # 保留几个历史版本

}


[root@localhost ~]# cd /etc/logrotate.d

[root@localhost logrotate.d]# ls    (每一个文件定义每一个子系统的日志的)

acpid   httpd        ppp     setroubleshoot        syslog   wpa_supplicant

conman  iscsiuiolog  psacct  squid                 tux      yum

cups    mgetty       rpm     subscription-manager  up2date

[root@localhost logrotate.d]#


[root@localhost logrotate.d]# cat cups

/var/log/cups/*_log {

    missingok

    notifempty  # 如果为空的话,不需要通知? 不懂

    sharedscripts  # 这是一个共享脚本

}

[root@localhost logrotate.d]#


[root@localhost cron.d]# ll /var/log/secure        (600权限)

(登录的信息,登录的用户名,密码是否输错了,输错了几次,尝试了几次,这里都有记录的)

-rw------- 1 root root 3423 12-11 03:23 /var/log/secure

[root@localhost cron.d]#



[root@localhost cron.d]# chkconfig --list syslog            (注意不是  syslogd,因为syslogd是进程)

syslog          0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

[root@localhost cron.d]#


[root@localhost cron.d]# service syslog status  (看到了吗? syslogd 是一个进程)

syslogd (pid  3299) 正在运行...

klogd (pid  3302) 正在运行...

[root@localhost cron.d]#

[root@localhost cron.d]# cat /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.*                                                 /dev/console


# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none                /var/log/messages # (除了mail authpriv cron 的所有设备的info及info以上的信息都放在/var/log/messages 里面)


# The authpriv file has restricted access.

authpriv.*                                              /var/log/secure  # 跟用户权限相关的所有级别都放到  /var/log/secure 里面


# Log all the mail messages in one place.

mail.*                                                  -/var/log/maillog # 跟mail相关的所有级别都放到 /var/log/maillog 前面加个中短横线表示异步写入



# Log cron stuff

cron.*                                                  /var/log/cron


# Everybody gets emergency messages

*.emerg                                                 *         # 产生emerg 信息,立即通知每一个用户


# Save news errors of level crit and higher in a special file.

uucp,news.crit                                          /var/log/spooler  # uucp和news的 crit 级别放入 /var/log/spooler 里面


# Save boot messages also to boot.log

local7.*                                                /var/log/boot.log  # 这里定义了跟引导相关的信息 放在 /var/log/boot.log 里面

You have new mail in /var/spool/mail/root

[root@localhost cron.d]#


local0 到 local7 是用户自定义的 ,我们这里并没有定义谁往local7里面写,所以我们还需要在其它当中用于专门说明这个日志信息要发到local7上去,它才会记录到 /var/log/boot.log 里面去 所以这里尽管定义了,但是它的意义并不大

[root@localhost ~]# cat /var/log/boot.log

Nov 10 15:02:32 localhost NET[4378]: /sbin/dhclient-script : updated /etc/resolv.conf

[root@localhost ~]#



[root@localhost ~]# vim /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.*                                                 /dev/console


# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none                /var/log/messages


# The authpriv file has restricted access.

authpriv.*                                              /var/log/secure


# Log all the mail messages in one place.

mail.*                                                  -/var/log/maillog



# Log cron stuff

cron.info                                                /var/log/cron  # 假如这里可以改成info,但是不会立即生效

#要想立即生效 执行 service syslog restart


# Everybody gets emergency messages

*.emerg                                                 *


# Save news errors of level crit and higher in a special file.

uucp,news.crit                                          /var/log/spooler



[root@localhost ~]#  service syslog restart         (可能会中断当前正在写的日志,所以建议 reload 不建议 restart)

关闭内核日志记录器:                                       [确定]

关闭系统日志记录器:                                       [确定]

启动系统日志记录器:                                       [确定]

启动内核日志记录器:                                       [确定]

[root@localhost ~]#  service syslog reload   (reload 让一个服务不用重启就能够读取配置文件并能够重新生效的 )

( 表示向对方发送第1号信号 SIGHUP ) (大多数程序都支持  reload ) (只不过标准四个 start stop restart status)

Reloading syslogd...                                       [确定]

Reloading klogd...                                         [确定]

[root@localhost ~]#


我们是通过 service 来调用这个脚本的

[root@localhost ~]# vim /etc/rc.d/init.d/syslog

#!/bin/bash

#

# syslog        Starts syslogd/klogd.

#

#

# chkconfig: 2345 12 88

# description: Syslog is the facility by which many daemons use to log \

# messages to various system log files.  It is a good idea to always \

# run syslog.

### BEGIN INIT INFO

# Provides: $syslog

### END INIT INFO


# Source function library.

. /etc/init.d/functions   # 包含这个文件


RETVAL=0


start() {

        [ -x /sbin/syslogd ] || exit 5

        [ -x /sbin/klogd ] || exit 5


        # Source config

        if [ -f /etc/sysconfig/syslog ] ; then

                . /etc/sysconfig/syslog   # 包含这个配置文件吧

        else

                SYSLOGD_OPTIONS="-m 0"

                KLOGD_OPTIONS="-2"

        fi


        if [ -z "$SYSLOG_UMASK" ] ; then

              SYSLOG_UMASK=077;

        fi

        umask $SYSLOG_UMASK


        echo -n $"Starting system logger: "

        daemon syslogd $SYSLOGD_OPTIONS

        RETVAL=$?

        echo

        echo -n $"Starting kernel logger: "

        daemon klogd $KLOGD_OPTIONS

        echo

        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog

        return $RETVAL

}

stop() {

        echo -n $"Shutting down kernel logger: "

        killproc klogd

        echo

        echo -n $"Shutting down system logger: "

        killproc syslogd

        RETVAL=$?

        echo

        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/syslog

        return $RETVAL

}

rhstatus() {

        status syslogd

        status klogd

}

restart() {

        stop

        start

}

reload()  {

    RETVAL=1

    syslog=`cat /var/run/syslogd.pid 2>/dev/null`

    echo -n "Reloading syslogd..."

    if [ -n "${syslog}" ] && [ -e /proc/"${syslog}" ]; then

        kill -HUP "$syslog";

        RETVAL=$?

    fi

    if [ $RETVAL -ne 0 ]; then

        failure

    else

        success

    fi

    echo

    RETVAL=1

    echo -n "Reloading klogd..."

    klog=`cat /var/run/klogd.pid 2>/dev/null`

    if [ -n "${klog}" ] && [ -e /proc/"${klog}" ]; then

        kill -USR2 "$klog";

        RETVAL=$?

    fi

    if [ $RETVAL -ne 0 ]; then

        failure

    else

        success

    fi

    echo

    return $RETVAL

}

case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  status)

        rhstatus

        ;;

  restart)

        restart

        ;;

  reload)

        reload

        ;;

  condrestart)

        [ -f /var/lock/subsys/syslog ] && restart || :

        ;;

  *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart}"

        exit 2

esac


exit $?





[root@localhost ~]# vim /etc/sysconfig/syslog

# Options to syslogd

# -m 0 disables 'MARK' messages.

# -r enables logging from remote machines

# -x disables DNS lookups on messages recieved with -r

# See syslogd(8) for more details

SYSLOGD_OPTIONS="-m 0"  # 改成 "-r -m 0" 即 加上 -r ( 意思是 recieved )选项 (-m 是不是make的意思) 它就能够作为日志服务器了  

# 能够接受其它主机发来的信息,记录到本机上  当然 我们还要重启下 日志服务 (service syslog restart)

# Options to klogd

# -2 prints all kernel oops messages twice; once for klogd to decode, and

#    once for processing with 'ksymoops'

# -x disables all klogd processing of oops messages entirely

# See klogd(8) for more details

KLOGD_OPTIONS="-x"

#

SYSLOG_UMASK=077

# set this to a umask value to use for all log files as in umask(1).

# By default, all permissions are removed for "group" and "other".

~

~

~

image.png




[root@localhost ~]# vim /etc/syslog.conf

# Log all kernel messages to the console.

# Logging much else clutters up the screen.

#kern.*                                                 /dev/console


# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none                /var/log/messages


# The authpriv file has restricted access.

authpriv.*                                              /var/log/secure


# Log all the mail messages in one place.

mail.*                                                  @172.16.100.1 # 把所有的mail信息都发送到 172.16.100.1  这台主机,只要这台主机能够 接受 mail这个 facility产生的信息,它都能够进行记录的



# Log cron stuff

cron.info                                                       /var/log/cron


# Everybody gets emergency messages

*.emerg                                                 *


# Save news errors of level crit and higher in a special file.

uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log

local7.*                                                /var/log/boot.log



红帽6上用 syslog-ng 但是风格差不多



[root@localhost ~]# cd busybox-1.20.2/_install/

[root@localhost _install]# pwd

/root/busybox-1.20.2/_install

[root@localhost _install]# ls sbin            (busybox里面可以看到syslogd 和 klogd)

acpid       freeramdisk  init      mke2fs       reboot             sysctl

adjtimex    fsck         insmod    mkfs.ext2    rmmod              syslogd

arp         fsck.minix   klogd     mkfs.minix   route              tunctl

blkid       getty        loadkmap  mkfs.vfat    runlevel           udhcpc

blockdev    halt         logread   mkswap       setconsole         vconfig

bootchartd  hdparm       losetup   modinfo      slattach           watchdog

depmod      hwclock      lsmod     modprobe     start-stop-daemon  zcip

devmem      ifconfig     makedevs  nameif       sulogin

fbsplash    ifdown       man       pivot_root   swapoff

fdisk       ifenslave    mdev      poweroff     swapon

findfs      ifup         mkdosfs   raidautorun  switch_root

[root@localhost _install]#

我们可以在小linux中使用syslog ( 即使用 syslogd 和klogd )

在 etc/rc.d/rc.sysinit 中  直接启动  syslogd 和klogd

(我们当然也可以直接写个服务脚本,让它 start 起来 )

image.png

使用了 syslogd 和 klogd 我们需要提供配置文件

image.png


[root@localhost sysroot]# cd /mnt/sysroot

[root@localhost sysroot]# vim etc/rc.d/rc.sysinit

#!/bin/sh

#

echo -e "\tWelcome to \033[34mMageEdu Tiny\033[0m Linux"


echo "Set the hostname"

[ -f /etc/hostname ] && . /etc/hostname

[ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost

hostname $HOSTNAME



echo "mount proc and sys ..."

mount -t proc proc /proc

mount -t sysfs sysfs /sys


echo "Remount the rooffs..."

mount -t ext3 -o remount,rw /dev/hdb2 /


echo "Detect and export hardware infomation ..."

mdev -s


echo "Mount the other filesystem..."

mount -a


echo "Start syslog..."

syslogd

klogd


echo "Load ethernet card module ..."

insmod /lib/modules/mii.ko

insmod /lib/modules/pcnet32.ko


ifconfig eth0 192.168.1.47/24

ifconfig lo 127.0.0.1/8


此时再编辑 syslog的配置文件

[root@localhost sysroot]# vim etc/syslog.conf

*.info           /var/log/messages

~

可以看到 var/log 目录

[root@localhost sysroot]# ls var/

lock  log  run

[root@localhost sysroot]#

[root@localhost sysroot]# cd

[root@localhost ~]# sync

[root@localhost ~]# sync

[root@localhost ~]# sync


马哥挂载失败,我执行的是对的,下面是马哥的图

image.png

马哥已换成了新的linux内核

image.png

我的是源生的linux内核

image.png


马哥的 己装不装载mii.ko了

# vim etc/rc.d/rc.sysinit

image.png

# 马哥的 initrd里面的  init 即 #  vim /tmp/initrd/init   ( # vim init ) (马哥 已经没有引入 jbd.ko 和 ext3.ko 模块了)

image.png

马哥 做了一个别名 # vim ~/.bashrc

要 source ~/.bashrc 一下,才能生效的哦

image.png

image.png

通过mkram 就直接生成了 initrd.gz文件

# mkram /mnt/boot/initrd.gz

image.png

# vim init

# blkid /dev/hda2

image.png

# blkid /dev/hda2

马哥的变成了 ext2 了 

image.png

我的是 ext3

image.png


马哥现在改成 ext3 

tune2fs - adjust tunable (可调谐的 可调的) filesystem parameters on ext2/ext3 filesystems


# tune2fs -j /dev/hda2

image.png

# blkid /dev/hda2

image.png


image.png

马哥说已经启动了 切换到第二个控制台  ctrl+alt+f2

下面是马哥的 

image.png

下面是马哥的  可以看到日志信息

image.png

上面 可以看到登录信息 也被记录了 应该把登录信息 记入 secure ,并且secure 为 600 权限

关闭小linux 恢复源linux

# cd /mnt/sysroot

image.png

# vim etc/syslog.conf

image.png

*.info;auth.none                 /var/log/messages

auth.*                           /var/log/secure

~

image.png

建一下 secure文件  # touch var/log/secure 

建一个权限为 600   # chmod 600 var/log/secure

image.png

image.png

再复新启动下 应该就没有问题了


上面的功能是 在我们的小系统上 使用 syslog的功能, (这里小系统上的 syslog 的功能 并没有使用服务(service) )

普通分类: