zoukankan      html  css  js  c++  java
  • Syslog linux 日志 规格严格

    http://blog.csdn.net/lzyzuixin/article/details/6915399

    http://blog.itpub.net/category/35701/55237

    基本的一些概念:

    1)syslog的日志为8个等级,从0到7,详细的信息,man syslog就可以了.默认是info.
    2)我们的系统日志在/var/log/下面,像messages,secure等等,这里要说明的,不是你有操作,系统就会将其写入到对映的日志里
    也就是说想写日志信息到里面,只能通过syslog系统函数.
    3)syslog日志系统提供远程日志写入功能,即A机器开放syslog的服务,并开放远程syslog功能,B机器可以将自己的日志信息写入到A机器的日志系统
    4)syslog提供facility使用户自定义的来操纵程序写日志.


    特殊玩法:

    1)如何将消息写入到syslog的日志系统?
    可以用logger命令,syslog日志等级有8个,默认是info,这时你用logger为debug(最低)来写日志,syslog服务是不会写日志的.

    比如:
    cat /etc/syslog.conf
    *.info;mail.none;authpriv.none;cron.none  /var/log/messages


    [root@umail180 etc]# logger -p debug "hello this is a test"

    -p选项来指定优先级,logger的默认优先为是info.指定info或更高的优先级都可以被syslog所接收.
    *.info;mail.none;authpriv.none;cron.none这里的*表示所有的facility,而none表示对映的facility不被接收

    2)如何将命令的执行结果写入到syslog的日志系统?
    可以用initlog命令.例如:
    initlog -c "cat /etc/passwd"

    -c选项后面要指定command
    这时会把cat /etc/passwd的结果写入到/var/log/message.
    其中initlog在sysinit中就有调用,它记录了整个sysinit脚本的启动引导过程,这样我们才会在messages里看到它的引导信息


    3)实现syslog的远程写日志功能.

    服务端:
    这里要打开/etc/sysconfig/syslog文件

    更改SYSLOGD_OPTIONS="-m 0"
    为SYSLOGD_OPTIONS="-m 0 -r "


    重启syslog服务即可,注意更改/etc/sysconfig/syslog和/etc/syslog都要重启syslog服务,因为/etc/init.d/syslog脚本在启动时要加载这两个文件.

    默认是开放514的udp端口
    netstat -anp|grep syslog
    udp        0      0 0.0.0.0:514                 0.0.0.0:*                               3425/syslogd       


    客户端:
    vi /etc/syslog.conf
    增加一条策略,如下:
    *.info       @umail180
    这里的*代表所有的facility,也就是说所有的级别为info的写日志操作都将写入到远程的umail180服务器,这里的umail180是主机名
    有两点要重点说明:
    第一点,写本地syslog,和写远程的syslog是两回事,相互不影响
    例如: 你有两条策略:
    *.info       /var/log/messages
    *.info       @umail180
    它是即写/var/log/messages,又写umail180的syslog


    说明 :系统是先接收到recv请求, 再去写文件,然后调用fsync同步内存到磁盘.最后它调用sendto函数发送到umail180这台服务器的514端口

    这时在服务端会收到请求.并写到syslog指定facility的文件中.

    第二点,syslog的服务端收到请求,会根据facility将信息写到对映的文件中,这样有利于信息的汇集和管理
    例如:
    在其它服务器登录这台客户端

    当然这时本地的syslog会收到请求,会根据syslog.conf文件的facility将信息写入到/var/log/secure中.
    而如果你有也想将信息写入到远程服务器,例如采用下面的配置:
    authpriv.*      /var/log/secure
    *.info       @umail180

    同样远程服务器将收到本地syslog的sendto请求,它将跟据请求的facility,写入的对映的文件中.比如/var/log/secure
    这时在远程的/var/log/secure中也记录了一份登录客户端的日志信息.


    4)想记录那些鸟人在我服务器上的所有操作,可以用syslog实现吗?
    答案是可以的.但要说明白似乎要走些弯弯.
    首先并不是所有的操作都会写入到日志中,即使你把级别调到最高也是如此
    问题就在于,真正涉及到写syslog的日志的操作,只能是调用syslog函数,而调用syslog函数的命令我们刚才见到两个,logger和initlog
    它们各有用处.像ls和cp这种命令是不会调用syslog函数,所以即使你将级别调整到debug,也是无用的.

    那好.如何解决上面的问题,先说initlog,我在不调用initlog的情况下,能用syslog记录它的运行结果吗?

    这样就可以.
    initlog -c /bin/bash

    这时/var/log/message就记录下它操作的结果.如果是rpm -qa,那就会有一大批的信息.
    但遗憾的是,它会丢了PROMPT.就是PS1那一大堆东西.但所有的命令都有效.

    再来说说logger.这里有一点要区分,logger只是写信息到syslog的日志中,它是不执行那些信息的.
    这里要执行命令,也要将命令写到syslog中,再根据syslog的远程功能,发送到远端的syslog服务器.
    在日志中将是这样的结果:
    Jun  2 16:12:52 umail180 bash[24371]: ls --color=tty -l
    Jun  2 16:13:30 umail180 bash[24371]: hacker
    Jun  2 16:13:40 umail180 bash[24371]: ls --color=tty
    Jun  2 16:13:43 umail180 bash[24371]: cd /usr/src/
    Jun  2 16:13:43 umail180 bash[24371]: ls --color=tty
    Jun  2 16:13:46 umail180 bash[24371]: cd redhat/
    Jun  2 16:13:47 umail180 bash[24371]: ls --color=tty
    Jun  2 16:28:11 umail180 bash[24371]: cd SOURCES/
    Jun  2 16:28:11 umail180 bash[24371]: ls --color=tty
    Jun  2 16:28:13 umail180 bash[24371]: ifconfig eth0
    Jun  2 16:28:14 umail180 bash[24371]: ls --color=tty
    Jun  2 16:28:15 umail180 bash[24371]: clear


    这里要改下bash的源程序:
    简单说下bash的运行流程:
    主程序文件是shell.c,它会做一些profile中的设定,包括PS1等等,最后它会运行eval.c中的reader_loop函数,
    这个函数接收这些操作指令.再调用execute_command函数执行之,当然它后面非常复杂,这里只要把
    这些指令接收进来,再调用syslog函数写到syslog服务的日志中就OK了.至于后面怎么执行,那不是我们关心的.

    我改了两个地方:
    eval.c中的reader_loop函数,大概在143行插入了:print_to_syslog(current_command);
    print_to_syslog是我自定义的函数.
    这个函数,我加到了print_cmd.c源程序中.
    如下:
    print_to_syslog(command)
         COMMAND *command;
    {
      command_string_index = 0;
      openlog ("bash", LOG_PID, LOG_LOCAL5);
      syslog (LOG_INFO, "%s\n", make_command_string(command));
      closelog();
    }

    这里的openlog的LOG_LOCAL5是facility,这个是在syslog.conf中自定义的.
    这里的syslog是系统函数,所以要在print_cmd.c文件中加入头文件syslog.h.

    把bash的源程序再./configure;make;make install就行了.
    最后把想要监控的用户的bash指定到新的bash文件就可以了.


    例如在 syslog.conf中添加下面的样子:
    local5.*      @umail180

    在远端的syslog服务器中添加和上面对映的就行了.
    local5.*      /var/log/operator

    呵呵.这样你就可以坐在电脑前看着/var/log/operator,欣赏所有服务器上操作者的表演了.


    有关于概念上的学习,man查看下syslogsyslog.conf,还有 openlog
    这些都是很有用的.

  • 相关阅读:
    『转』VC 工具使用和调试方法
    『轉』WINCE下如何实现发短信
    『转』Fatal error: Call to undefined function curl_init
    『转』WinCE驱动程序的分类
    『轉』Windows CE下的串口通讯类
    『轉』VC 6.0 “fatal error LNK1104: cannot open file "mfc42u.lib"”问题解决
    水晶报表乱码中文乱码问题(收藏)
    水晶报表如何完美导出一个Excel表格(收藏)
    ASP.NET AJAX(开发代号Atlas)重要参考资源大收集
    表格排序
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/2303549.html
Copyright © 2011-2022 走看看