精华内容
下载资源
问答
  • 系统日志

    千次阅读 2018-04-14 09:04:43
    【Linux日志】系统日志及分析Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 /etc/...

    【Linux日志】系统日志及分析

    Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息。


    大部分Linux发行版默认的日志守护进程为 syslog,位于 /etc/syslog 或 /etc/syslogd 或/etc/rsyslog.d,默认配置文件为 /etc/syslog.conf 或 rsyslog.conf,任何希望生成日志的程序都可以向 syslog 发送信息。

     

    Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。

    完成这个过程的程序就是syslog。syslog可以根据日志的类别和优先级将日志保存到不同的文件中。

    例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。默认配置下,日志文件通常都保存在“/var/log”目录下。

    日志类型

    下面是常见的日志类型,但并不是所有的Linux发行版都包含这些类型:

     

    类型说明
    auth用户认证时产生的日志,如login命令、su命令。
    authpriv与 auth 类似,但是只能被特定用户查看。
    console针对系统控制台的消息。
    cron系统定期执行计划任务时产生的日志。
    daemon某些守护进程产生的日志。
    ftpFTP服务。
    kern系统内核消息。
    local0.local7由自定义程序使用。
    lpr与打印机活动有关。
    mail邮件日志。
    mark产生时间戳。系统每隔一段时间向日志文件中输出当前时间,每行的格式类似于 May 26 11:17:09 rs2 -- MARK --,可以由此推断系统发生故障的大概时间。
    news网络新闻传输协议(nntp)产生的消息。
    ntp网络时间协议(ntp)产生的消息。
    user用户进程。
    uucpUUCP子系统。

     

    日志优先级

    常见的日志优先级请见下标:

     

    优先级说明
    emerg紧急情况,系统不可用(例如系统崩溃),一般会通知所有用户。
    alert需要立即修复,例如系统数据库损坏。
    crit危险情况,例如硬盘错误,可能会阻碍程序的部分功能。
    err一般错误消息。
    warning警告。
    notice不是错误,但是可能需要处理。
    info通用性消息,一般用来提供有用信息。
    debug调试程序产生的信息。
    none没有优先级,不记录任何日志消息。

    常用日志文件

    系统日志是由一个名为syslog的服务管理的,如以下日志文件都是由syslog日志服务驱动的:

    /var/log/boot.log:录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息

    /var/log/lastlog :记录最后一次用户成功登陆的时间、登陆IP等信息

    /var/log/messages :记录Linux操作系统常见的系统和服务错误信息

    /var/log/secure :Linux系统安全日志,记录用户和工作组变坏情况、用户登陆认证情况

    /var/log/btmp :记录Linux登陆失败的用户、时间以及远程IP地址

    /var/log/syslog:只记录警告信息,常常是系统出问题的信息,使用lastlog查看

    /var/log/wtmp:该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,使用last命令查看

    /var/run/utmp:该日志文件记录有关当前登录的每个用户的信息。如 who、w、users、finger等就需要访问这个文件

     

    /var/log/syslog 或 /var/log/messages 存储所有的全局系统活动数据,包括开机信息。基于 Debian 的系统如 Ubuntu 在 /var/log/syslog 中存储它们,而基于 RedHat 的系统如 RHEL 或 CentOS 则在 /var/log/messages 中存储它们。
    /var/log/auth.log 或 /var/log/secure 存储来自可插拔认证模块(PAM)的日志,包括成功的登录,失败的登录尝试和认证方式。Ubuntu 和 Debian 在 /var/log/auth.log 中存储认证信息,而 RedHat 和 CentOS 则在 /var/log/secure 中存储该信息。

    日志文件详细介绍:

    /var/log/boot.log

    该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息,如图1所示:

     

     

    /var/log/syslog

    默认Centos,Fedora不生成该日志文件,但可以配置/etc/syslog.conf让系统生成该日志文件。

    它和/etc/log/messages日志文件不同,它只记录警告信息,常常是系统出问题的信息,所以更应该关注该文件。

    要让系统生成该日志文件,在/etc/syslog.conf文件中加上:*.warning /var/log/syslog 该日志文件能记录当用户登录时login记录下的错误口令、Sendmail的问题、su命令执行失败等信息。

    该日志文件记录最近成功登录的事件和最后一次不成功的登录事件,由login生成。在每次用户登录时被查询,该文件是二进制文件,需要使用lastlog命令查看,根据UID排序显示登录名、端口号和上次登录时间。如果某用户从来没有登录过,就显示为"**Never logged in**"。该命令只能以root权限执行。简单地输入lastlog命令后就会看到类似图4的信息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    [root@TestStation etc]# lastlog
    Username         Port     From             Latest
    root             pts/0    110.87.109.232   Wed Nov  2 10:34:20 +0800 2016
    bin                                        **Never logged in**
    daemon                                     **Never logged in**
    adm                                        **Never logged in**
    lp                                         **Never logged in**
    sync                                       **Never logged in**
    shutdown                                   **Never logged in**
    halt                                       **Never logged in**
    mail                                       **Never logged in**
    uucp                                       **Never logged in**
    operator                                   **Never logged in**
    games                                      **Never logged in**
    gopher                                     **Never logged in**
    ftp                                        **Never logged in**
    nobody                                     **Never logged in**
    vcsa                                       **Never logged in**
    saslauth                                   **Never logged in**
    postfix                                    **Never logged in**
    sshd                                       **Never logged in**
    ntp                                        **Never logged in**
    suda             pts/2    222.79.79.120    Tue Oct 25 16:00:01 +0800 2016

     

    /var/log/wtmp

    该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端tty或时间显示相应的记录。

    /var/run/utmp

    该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。

    以上提及的3个文件(/var/log/wtmp、/var/run/utmp、/var/log/lastlog)是日志子系统的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的,故不能用less、cat之类的命令直接查看这些文件,而是需要使用相关命令通过这些文件而查看。其中,utmp和wtmp文件的数据结构是一样的,而lastlog文件则使用另外的数据结构,关于它们的具体的数据结构可以使用man命令查询。

    每次有一个用户登录时,login程序在文件lastlog中查看用户的UID。如果存在,则把用户上次登录、注销时间和主机名写到标准输出中,然后login程序在lastlog中记录新的登录时间,打开utmp文件并插入用户的utmp记录。该记录一直用到用户登录退出时删除。utmp文件被各种命令使用,包括who、w、users和finger。

    
    

    下一步,login程序打开文件wtmp附加用户的utmp记录。当用户登录退出时,具有更新时间戳的同一utmp记录附加到文件中。wtmp文件被程序last使用。


    配置日志文件:


    消息:

    Jan 7 15:31:37 pandora2 ssshd[16367]: Accepted password for craigz from 192.168.1.2222 port 5242 ssh2

    格式: Date time hostname process[pid]: action:version


    日志记录器:

    logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。

    编辑syslog.conf,

    #vi /etc/syslog.conf

    在第一行加入local3.none,使得设备local3的日志不记录在messages文件里,

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

    # Don't log private authentication messages!

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

    将设备local3的所有级别的信息都记录在userlog文件里,

    #user log

    local3.* /var/log/userlog

    重新加载syslog服务的配置文件,

    $ service syslog reload

    2、测试:

    测试机器的环境:

    OS:Red Hat Enterprise Linux 5 update 3

    Network: 192.168.0.100/24 Gateway:192.168.0.1

    ping 192.168.0.1 | logger -it logger_test -p local3.notice &

    命令logger -it logger_test -p local3.notice中的参数含义:

    -i 在每行都记录进程ID

    -t logger_test 每行记录都加上“logger_test”这个标签

    -p local3.notice 设置记录的设备和级别

    ping命令的输出成功输出到/var/log/userlog文件中,实验成功。

     

    3、logger命令默认的日志保存在 /var/log/messages中,例如:

    命令:logger -p local7.info -t test_logger_message "test_message"

    输出:tail -f /var/log/messages

    Mar 17 22:41:54 localhost log_test[8673]: test_message


    日志回卷

    系统时时刻刻都在产生日志,如果不及时清理,很快就会灌满硬盘,但如果要手工清理,又很麻烦。这种情况下,logrotate 这个程序很好的完成这个任务。

    logrotate 用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过一个叫做crond的守护进程来执行,logrotate 还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

    实验描述:

    (1)用Cron执行logrotate命令,每分钟检查一次目标日志文件是否满足回卷限制。(2)配置/etc/logrotate.conf 或者建立一个自定义的/etc/logrotate.d /userlog

    (3)编辑/etc/syslog.conf 使得记录的日志信息可以写入到/var/log/userlog中。

    $ crontab -e

    * * * * * /usr/sbin/logrotate /etc/logrotate.conf //写入这条命令

    $ vi /etc/logrotate.conf

    ***省略***

    /var/log/userlog {

    daily

    size 10k 在这里单位大小写敏感应,应为 k or M

    create 0664 root root

    rotate 3

    prerotate

    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null

    /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null

    endscript

    }

    在这里一定要加prerotate这段脚本,这样可以使syslog程序重新读取配置文件,这样做的作用是让syslog程序释放对userlog文件持有的文件描述符,否则即使日志文件回滚,syslog也不会向新产生的日志文件写数据。举个例子,如果不加这段脚本,即使logrotate程序将userlog文件截断并重命名为userlog.1,但是syslog程序仍然会向原userlog文件即userlog.1中写入数据。

    $ vi /etc/syslog.conf

    *****省略*****

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

    #user log

    local3.* /var/log/userlog

    重新加载配置文件

    $ service syslog reload

    重启crond服务

    $ service crond restart

    需要注意的是,当达到限制条件时,logrotate程序会将目标日志文件userlog截断,并命名为userlog.1,将原userlog.1改名为userlog.2,以此类推,syslog程序始终向userlog文件中写数据。


    监控系统日志:

    logwatch介绍:
    1)logwatch是一款用Perl 语言编写的开源日志解析分析器。它能对原始的日志文件进行解析并转换成结构化格式的文档,也能根据您的使用情况和需求来定制报告。logwatch的主要目的是生成更易于使用的日志摘要,并不是用来对日志进行实时的处理和监控的。正因为如此,logwatch通常被设定好时间和频率的自动定时任务来调度运行或者是有需要日志处理的时候从命令行里手动运行。一旦日志报告生成,logwatch 可以通过电子邮件把这报告发送给您,您可以把它保存成文件或者直接显示在屏幕上。
    2)Logwatch报告的详细程度和报告覆盖范围是完全可定制化的。Logwatch 的日志处理引擎也是可扩展的,从某种意义上来说,如果您想在一个新的应用程序中使用 logwatch 功能的话,只需要为这个应用程序的日志文件编写一个日志处理脚本(使用 Perl 语言),然后挂接到 logwatch 上就行。
    3)logwatch的缺点就在于:在它生成的报告中没有详细的时间戳信息,而原来的日志文件中是存在的。只能知道被记录下来的一段时间之内的特定事件,如果想要知道精确的时间点的信息,就不得不去查看原日志文件了。

    logwatch安装
    Logwatch能够对Linux 日志文件进行分析,并自动发送mail给相关处理人员,可定制需求。Logwatch的mail功能是借助宿主系统自带的mail server发邮件的,所以系统需安装mail server(如sendmail,postfix等)

    apt-get install logwatch
    

    1)直接命令行手动监控

    1
    2
    [root@xqsj-beta ~]# logwatch --detail 10 --mailto wangshibo@huanqiu.cn --range all --service all --output mail
    [root@xqsj-beta ~]#

    上面命令中采用的是邮箱格式的报告输出,如下:

    下面采用html格式的报告输出,通常情况下,我都会使用这个格式:

    1
    2
    3
    4
    5
    6
    [root@xqsj-beta ~]# logwatch --detail 10 --mailto wangshibo@huanqiu.cn --range all --service all --output html
    [root@xqsj-beta ~]#
     
    若是想发送给多个邮箱,中间需要用逗号隔开
    [root@xqsj-beta ~]# logwatch --detail 10 --mailto wangshibo@huanqiu.cn,wang_shibo***@163.com --range all --service all --output html
    [root@xqsj-beta ~]#

    收到的邮件中的监控报告如下:

    注意一个细节:
    如上在邮箱里发现报告里的内容太多,有一些无关紧要的服务的监控结果不想打印在报告里,那么就可以在监控时过滤掉这些服务项。
    可以对比邮件里出现的监控列表里的服务去过滤,服务名最后以/etc/logwatch/scripts/services下的名称为准,服务名不正确,会报错说不识别。如下:

    1
    2
    [root@xqsj-beta services]# logwatch --detail 10 --mailto wangshibo@huanqiu.cn --range all --service  All --service -XNTPD --service -Kernel --service -http --service -Postfix --service -pam_unix --service -XNTPD --output html
    [root@xqsj-beta services]#

    再次查看邮件,发现被过滤掉的服务的监控结果就不会出现在报告里了

    这种方式不需要logwatch的配置文件,比较简单,可以将执行命令放到shell脚本中,结合crontab每天定时执行!

    ----------------------------------------------------------------------------------------------
    发送邮件的时候报错如下:
    You have old files in your logwatch tmpdir (/var/cache/logwatch):
    logwatch.A3V8WQ6_
    The directories listed above were most likely created by a
    logwatch run that failed to complete successfully. If so, you
    may delete these directories.

    解决办法:
    # rm -rf /var/cache/logwatch/*
    -------------------------------------------------------------------------------------------

    2)采用配置文件的方式
    需要编辑的文件是/etc/logwatch/conf/logwatch.conf,以下是对配置选项的解释:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    1)LogDir = /var/log     
    定义的日志文件存放路径
     
    2)TmpDir = /var/cache/logwatch
    定义的缓存路径
     
    3)Save = /tmp/logwatch
    开启此项, 会将处理结果保存到本地文件里,如/tmp/logwatch文件, 不会邮寄或显示输出。一般会注释掉此行或不配置此行
     
    4)MailTo = your@mail.com
    发送监控报告的收件人地址,发送给多个邮箱,需要在多个邮箱地址之间用逗号隔开。但是需要在logwatch运行的服务器上配置好本地邮件传输代理(MTA)如sendmail、 Postfix等,这个配置指令项才能起作用。
     
    5)MailFrom = Logwatch
    当你收到邮件时, 显示是谁发给你的。默认是Logwatch
     
    6)Range = <Yesterday|Today|All>
    处理什么时候的日志 , 可选项 All , Yesterday , Today , 即所有, 昨天的 , 今天的。
     
    7)Detail = High
    日志详细度, 可选项 Low , Med , High , 或是 0-10数字
     
    8)Print = No
    可选项, Yes会被打印到系统标准输出, 并且不会以邮件的形式发送到MailTo设定的邮箱里 , No选项则会发到邮箱中。
     
    9)Server = All
    监控的服务项,all表示所有的服务。这个可以到/etc/logwatch/scripts/services/下面去找要监控的服务名称,默认是空的,可以从/usr/share/logwatch/scripts/services下面将服务监控脚本拷贝过来。
    Service选项指定想要监控的一个或多个服务。在 /usr/share/logwatch/scripts/services 目录下列出的服务都能被监控,它们已经涵盖了重要的系统服务(例如:pam,secure,iptables,syslogd 等),也涵盖了一些像 sudo、sshd、http、fail2ban、samba等主流的应用服务。如果您想添加新的服务到列表中,得编写一个相应的日志处理 Perl 脚本,并把它放在这个目录中。
    如果这个选项要用来选择特定的服务话,您需要把文件中的 "Service = All " 这一行注释掉。
     
    另外注意一点:
    可以在不监控的服务前面加 "-" , 如"-httpd"即表示不监控httpd服务,可以写多条。
    一般我们建议的配置是:先监控所有服务,然后在排除不需要监控的服务,比如:
    Service = All
    Service = "-zz-network"
    Service = "-zz-sys"
    Service = "-eximstats"
     
    10)output = <html|mail>
    配置指令定义了一份 logwatch 报告的格式。有mail邮箱格式和html格式。

    下面是自己线上服务器上使用过的一个配置示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    [root@xqsj-beta ~]# cat /etc/logwatch/conf/logwatch.conf
    # Local configuration options go here (defaults are in /usr/share/logwatch/default.conf/logwatch.conf)
    LogDir = /var/log     
    TmpDir = /var/cache/logwatch
     
    #Save = /tmp/logwatch
     
    MailTo = wangshibo@huanqiu.cn,wang_shibo1987@163.com
    MailFrom = Logwatch
     
    Range = Yesterday
     
    Detail = High
     
    Print = No
     
    Service = All
    Service = "-XNTPD"
    Service = "-Kernel"
    Service = "-http"
    Service = "-Postfix"
    Service = "-pam_unix"
    Service = "-XNTPD"
     
    output = html
     
    然后手动执行下命令:
    [root@xqsj-beta ~]# /usr/sbin/logwatch
    [root@xqsj-beta ~]#
     
    然后去对应的邮箱里查看,发现已有报告邮件。

    另外注意:
    logwatch的工作不是监控日志异常后及时报警的工具,并不具有及时性,logwatch默认每天定时发送一封整合的邮件:
    logwatch默认在crontab定时任务设定目录下存在/etc/cron.daily/0logwatch脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [root@xqsj-beta ~]# cat /etc/cron.daily/0logwatch
    #!/bin/bash
     
    DailyReport=`grep -e "^[[:space:]]*DailyReport[[:space:]]*=[[:space:]]*" /usr/share/logwatch/default.conf/logwatch.conf | head -n1 | sed -e "s|^\s*DailyReport\s*=\s*||"`
     
    if [ "$DailyReport" != "No" ] && [ "$DailyReport" != "no" ]
    then
        logwatch
    fi

    正是因为这个默认的定时脚本,所以只要如上配置好logwatch.conf文件后,每天都会自动收取一封整合的报告邮件

    如果在logwatch.conf中显式设置了选项DailyReport = No,则会取消logwatch每日执行任务。
    如果要修改logwatch在cron.daily的执行时间,可以删掉/etc/cron.daily/0logwatch这个文件,然后添加到/etc/crontab里去定义执行时间。即:

    1
    2
    3
    4
    5
    [root@xqsj-beta ~]# mv /etc/cron.daily/0logwatch /root/logwatch.sh
     
    比如设定每天早上5点发送邮件
    [root@xqsj-beta ~]# crontab -e
    0 5 * * * /bin/bash -x /root/logwatch.sh

    又或者是删除/etc/cron.daily/0logwatch文件,然后自己在crontab里自定义发送

    1
    2
    3
    每周1-5的早上8点发送邮件
    [root@xqsj-beta ~]# crontab -e
    0 8 * * 1,2,3,4,5 /usr/sbin/logwatch

    一些常用命令

    last

    -a 把从何处登入系统的主机名称或ip地址,显示在最后一行。
    -d 指定记录文件。指定记录文件。将IP地址转换成主机名称。
    -f <记录文件>  指定记录文件。
    -n <显示列数>或-<显示列数>  设置列出名单的显示列数。
    -R 不显示登入系统的主机名称或IP地址。
    -x 显示系统关机,重新开机,以及执行等级的改变等信息

    以下看所有的重启、关机记录

    last | grep reboot
    last | grep shutdown

    history

    列出所有的历史记录:

    [zzs@Linux] # history

    只列出最近10条记录:

    [zzs@linux] # history 10 (注,history和10中间有空格)

    使用命令记录号码执行命令,执行历史清单中的第99条命令

    [zzs@linux] #!99 (!和99中间没有空格)

    重复执行上一个命令

    [zzs@linux] #!!

    执行最后一次以rpm开头的命令(!? ?代表的是字符串,这个String可以随便输,Shell会从最后一条历史命令向前搜索,最先匹配的一条命令将会得到执行。)

    [zzs@linux] #!rpm

    逐屏列出所有的历史记录:

    [zzs@linux]# history | more

    立即清空history当前所有历史命令的记录

    [zzs@linux] #history -c

    cat, tailwatch

    系统所有的日志都在 /var/log 下面自己看(具体用途可以自己查,附录列出一些常用的日志)

    cat /var/log/syslog 等
    cat /var/log/*.log

    tail -f

    如果日志在更新,如何实时查看 tail -f /var/log/messages

    还可以使用 watch -d -n 1 cat /var/log/messages

    -d表示高亮不同的地方,-n表示多少秒刷新一次。

    该指令,不会直接返回命令行,而是实时打印日志文件中新增加的内容,
    这一特性,对于查看日志是非常有效的。如果想终止输出,按 Ctrl+C 即可。



    展开全文
  • Java系统日志管理

    万次阅读 2018-07-06 15:24:06
    在一个系统中日志管理是一个很重要的部分,因为当系统发布到线网后出了问题只能看系统日志了,这个时候系统日志起到了一个错误排查功能,同时也可以通过系统日志统计用户吞吐量等等,总之系统日志是系统管理一个重点...
    在一个系统中日志管理是一个很重要的部分,因为当系统发布到线网后出了问题只能看系统日志了,这个时候系统日志起到了一个错误排查功能,同时也可以通过系统日志统计用户吞吐量等等,总之系统日志是系统管理一个重点。
    本系统架构为SpringMVC,myBatis,Shrio等等。

    1.SpringMVC异常处理
    SpringMVC负责接收用户请求并进行处理然后将结果返回给用户,那么为了不让异常抛给用户,我们一般在Controller类下每个方法都加上一个try{}catch(Exception e){},实例代码如下:
    /**
    	 * pengweikang 20170220 用户登陆
    	 * 
    	 * @param cgbUser
    	 *            用户信息
    	 * @param session
    	 * @return
    	 */
    	@RequestMapping(value = "/login", method = RequestMethod.POST)
    	public @ResponseBody String userLogin(HttpServletRequest request) {
    		try {
    		     .....	 //Service方法调用
    		} catch (Exception e) {
    		     .....      //异常处理
    		} 
    		return null;
    	}

    该方法的缺点是代码冗余,不利于维护,一看就不想是一个专业的软件工程师应该写的,优化办法如下:

    其实SpringMVC给我们提供了一个控制器增强标签,名称为@ControllerAdvice,通过这个标签就可以统一实现异常处理,代码如下:
    创建统一的异常处理类CGBExceptionHandler.java

    import javax.servlet.http.HttpServletRequest;
    import org.apache.commons.lang.exception.ExceptionUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    
    import ch.qos.logback.classic.Level;
    import net.sf.json.JSONObject;
    
    /**
    *@author		create by pengweikang
    *@date		2018年6月27日--下午12:49:23
    *@problem
    *@answer
    *@action
    */
    @ControllerAdvice
    public class CGBExceptionHandler {
    	ch.qos.logback.classic.Logger loggerback = (ch.qos.logback.classic.Logger)LoggerFactory.getLogger("error");
    	{
    		loggerback.setLevel(Level.ERROR);
    	}
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public Object handleException(Exception e,HttpServletRequest rquest) {
        	loggerback.error("错误日志记录");
        	Map dataMap  = rquest.getParameterMap();
            Set<String> keySet = 	dataMap.keySet();
            for(String key : keySet) {
                String [] datas = (String[])dataMap.get(key);
                String value = new String();
                for(String data : datas) {
        	        value +=data+",";
                }
        	    loggerback.error("Param:"+key+" = "+ value.substring(0, value.length() - 1));//将请求参数保存在日志中
            }
        	loggerback.error(ExceptionUtils.getFullStackTrace(e));  // 记录错误信息
            String msg = e.getMessage();
            if (msg == null || msg.equals("")) {
                msg = "服务器出错";
            }
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("message", msg);
            jsonObject.put("state", 0);
            return jsonObject.toString();
        }
    }

    这个时候你的Controller就不用在添加try-catch异常捕获了, 一但方法出了异常就会跳转到CGBExceptionHandler.java这个类的handleException方法。

    2.logback日志管理

    在这个方法中我们将方法调用的的错误消息都记录在日志中,并且将方法调用的参数也报错在错误日志中,logback配置内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
        debug="false" scan="true" scanPeriod="30 second">
    
        <property name="PROJECT" value="recognizeSystem" /> 
        <property name="ROOT" value="/opt/apache-tomcat-7.0.82/logs/${PROJECT}/" />
        <property name="FILESIZE" value="50MB" />
        <property name="MAXHISTORY" value="100" />
        <timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss" />
        <!-- 控制台打印 -->
         <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         	
         	<filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
         
            <encoder charset="utf-8">
                <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
                </pattern>
            </encoder>
        </appender>
        <!-- ERROR 输入到文件,按日期和文件大小 -->
        <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder charset="utf-8">
                <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
                </pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${ROOT}%d/error.%i.log</fileNamePattern>
                <maxHistory>${MAXHISTORY}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${FILESIZE}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
        </appender>
        
        <!-- WARN 输入到文件,按日期和文件大小 -->
        <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder charset="utf-8">
                <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
                </pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${ROOT}%d/warn.%i.log</fileNamePattern>
                <maxHistory>${MAXHISTORY}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${FILESIZE}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
        </appender>
        
        <!-- INFO 输入到文件,按日期和文件大小 -->
        <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder charset="utf-8">
                <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
                </pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${ROOT}%d/info.%i.log</fileNamePattern>
                <maxHistory>${MAXHISTORY}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${FILESIZE}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
        </appender>
        <!-- DEBUG 输入到文件,按日期和文件大小 -->
        <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder charset="utf-8">
                <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
                </pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>DEBUG</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${ROOT}%d/debug.%i.log</fileNamePattern>
                <maxHistory>${MAXHISTORY}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${FILESIZE}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
        </appender>
        <!-- TRACE 输入到文件,按日期和文件大小 -->
        <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder charset="utf-8">
                <pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
                </pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>TRACE</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${ROOT}%d/trace.%i.log</fileNamePattern>
                <maxHistory>${MAXHISTORY}</maxHistory>
                <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>${FILESIZE}</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
            </rollingPolicy>
        </appender>
        
        <!-- SQL相关日志输出-->
        <logger name="org.apache.ibatis" level="INFO" additivity="false" />
        <logger name="org.mybatis.spring" level="INFO" additivity="false" />
        <logger name="com.github.miemiedev.mybatis.paginator" level="INFO" additivity="false" />
        
        <!-- Logger 根目录 -->
        <root level="DEBUG">
             <appender-ref ref="STDOUT" />
             <appender-ref ref="DEBUG" /> 
            <appender-ref ref="ERROR" />
            <appender-ref ref="WARN" />
            <appender-ref ref="INFO" /> 
            <appender-ref ref="TRACE" />
        </root>
    </configuration>

    该配置文件内容为将不同类型的日志按不同文件进行报错,并且每天记录不同的日志,文件夹按日期进行命名,儿控制台只打印错误日志。

    3.测试

    测试代码如下:

    @Controller
    @RequestMapping(value="/test")
    public class TestController {
    @RequestMapping(value="/exception")
    	public @ResponseBody String throwexcep(int data) throws Exception {
    		int a = data/0;// 一定会抛出 java.lang.ArithmeticException: / by zero		
    		return null;
    	}
    }
    请求 http://localhost:8080/logSystem/test/exception?data=100

    首先看tomcat的log文件夹如下图所示:



    error.0.log日志记录如下:

    [ERROR] 2018-07-06 15:05:39 [http-bio-8080-exec-3] error - 错误日志记录
    [ERROR] 2018-07-06 15:09:30 [http-bio-8080-exec-2] error - 错误日志记录
    [ERROR] 2018-07-06 15:09:30 [http-bio-8080-exec-2] error - Param:data = 100
    [ERROR] 2018-07-06 15:09:30 [http-bio-8080-exec-2] error - ParameterMap:org.apache.catalina.util.ParameterMap@c7832d1
    [ERROR] 2018-07-06 15:09:30 [http-bio-8080-exec-2] error - java.lang.ArithmeticException: / by zero
    	at com.goldenbridge.recognizesystem.controller.ActivitiController.throwexcep(ActivitiController.java:137)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
    	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
    	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
    	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
    	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    	at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    	at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    	at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
    	at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
    	at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    	at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    	at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
    	at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
    	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
    	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    	at com.goldenbridge.recognizesystem.utils.SimpleCORSFilter.doFilter(SimpleCORSFilter.java:34)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
    	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
    	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.lang.Thread.run(Thread.java:748)
    
    

    到此系统日志管理配置完成!


    展开全文
  • 本发明实施例提供的一种系统日志的处理方法包括:访问生成系统日志的设备,从该设备采集系统日志;将采集到的系统日志的格式与指定的设备模板进行匹配,确认各系统日志对应的设备类型;根据各系统日志的设备类型,...
    摘要

    本发明公开了一种系统日志的处理方法和系统日志的处理平台。本发明实施例提供的一种系统日志的处理方法包括:访问生成系统日志的设备,从该设备采集系统日志;将采集到的系统日志的格式与指定的设备模板进行匹配,确认各系统日志对应的设备类型;根据各系统日志的设备类型,利用指定的关键字模板对系统日志进行过滤;将过滤结果发送至服务器侧,由服务器侧对系统日志进行报警处理。

    说明
    系统日志的处理方法和系统日志的处理平台

    技术领域

    [0001] 本发明涉及互联网通信技术领域,特别涉及一种系统日志的处理方法和系统日志 的处理平台。

    背景技术

    [0002] 在现代运维体系中,规模化的应用系统与网络设备需要自动化的监管系统进行管 理,对系统日志(syslog)信息的监管就是其中重要一环。然而在实际中,由于不同的应用 系统、网络设备对应的日志格式各不相同,这给标准化的syslog分析带来了巨大难度。

    [0003] 现有系统日志的处理方案主要是将各种设备的系统日志集中存储到一个指定服 务器,通过系统的看门狗(watchdog)服务过滤和抓取日志,并对满足看门狗服务设定条件 的记录进行报警。

    [0004] 然而,看门狗服务仅能实现一些比较简单的操作,使用的过滤条件较单一,无法全 面准确地区分出危险的日志,过滤效果差;并且,看门狗服务将各种类型的日志混杂在一起 进行处理,各条日志存储的格式和内容差异较大,导致后续操作中对系统日志的利用和开 发难度较大,资源利用率较低。目前亟待一种针对日志挖掘、分析和监控报警等于一体的综 合服务平台。

    发明内容

    [0005] 鉴于上述问题,本发明实施例提供了一种系统日志的处理方法和系统日志的处理 平台。

    [0006] 为达到上述目的,本发明实施例采用了如下技术方案:

    [0007] 本发明一个实施例提供了一种系统日志的处理方法,该方法包括:

    [0008] 访问生成系统日志的设备,从设备采集系统日志;

    [0009] 将采集到的系统日志的格式与指定的设备模板进行匹配,确认各系统日志对应的 设备类型;

    [0010] 根据各系统日志的设备类型,利用指定的关键字模板对系统日志进行过滤;

    [0011] 将过滤结果发送至服务器侧,由服务器侧对系统日志进行报警处理;

    [0012] 其中,每种设备类型的所述设备模板由能够匹配该设备类型下的所有系统日志格 式的条件表达式生成;

    [0013] 每种设备类型的所述关键字模板由该设备类型下系统日志中允许包括的关键字 或者禁止包括的关键字生成。

    [0014] 本发明又一个实施例提供了一种系统日志的处理方法,包括:接收客户端侧上报 的系统日志的过滤结果并按照预定的统一格式将过滤结果存储至数据库,该过滤结果包括 系统日志和该系统日志对应的标志位,该标志位包括第一标志位、第二标志位和第三标志 位,该方法还包括:

    [0015] 当根据过滤结果获知系统日志具有第一标志位时,采用短信方式和邮件方式发送 报警消息;

    [0016] 当根据过滤结果获知系统日志具有第二标志位时,不执行报警操作;

    [0017] 当根据过滤结果获知系统日志具有第三标志位时,采用邮件方式发送报警消息。

    [0018] 本发明又一个实施例提供了一种系统日志的处理平台,该平台包括系统日志采集 系统和系统日志管理系统,

    [0019] 系统日志采集系统包括消息队列模块、模板选择器、关键字过滤器以及守护任务 和调度器DTS ;

    [0020] 消息队列模块,用于访问生成系统日志的设备,从设备采集系统日志;

    [0021] 模板选择器,用于将采集到的系统日志的格式与指定的设备模板进行匹配,确认 各系统日志对应的设备类型;

    [0022] 关键字过滤器,用于根据各系统日志的设备类型,利用指定的关键字模板对系统 日志进行过滤,并将过滤结果发送至系统日志管理系统;

    [0023] DTS,用于对消息队列模块、模板选择器和关键字过滤器进行预定与调度;

    [0024] 系统日志管理系统包括数据库、数据生成器、报警模块和数据访问和控制中心 DACC ;

    [0025] 数据库,用于存储平台中的数据;

    [0026] 数据生成器,用于接收来自系统日志采集系统的过滤结果,并按照预定的统一格 式将过滤结果存储至数据库;

    [0027] 报警模块,用于根据数据生成器中的数据进行报警;

    [0028] DACC,用于对数据库、数据生成器和报警模块进行管理;

    [0029] 其中,每种设备类型的所述设备模板由能够匹配该设备类型下的所有系统日志格 式的条件表达式生成;

    [0030] 每种设备类型的所述关键字模板由该设备类型下系统日志中允许包括的关键字 或者禁止包括的关键字生成。

    [0031] 本发明实施例通过将系统日志与所建立的设备模板相匹配的技术手段,能够区分 出不同设备的系统日志,对不同设备的系统日志进行不同处理,以及通过设备类型结合指 定的关键字模板对系统日志进行过滤的手段,提高了过滤方式的灵活性,能够全面、准确地 对日志进行过滤。

    [0032] 由上,本发明实施例提供的系统日志处理方案,不但能够对不同类型的系统日志 进行区分处理和存储,极大便利了后续对系统日志的利用,满足对系统日志二次开发的需 求,提高资源利用率;而且能够提高日志过滤的精准度和灵活性,实现问题的精准定位、精 确报警和问题预警,提高系统的运维质量。

    附图说明

    [0033] 图1为根据本发明一个实施例的一种系统日志的处理平台结构示意图;

    [0034] 图2为根据本发明一个实施例的系统日志采集系统的工作流程示意图;

    [0035] 图3为根据本发明一个实施例的另一种系统日志的处理平台的结构示意图;

    [0036] 图4为根据本发明又一个实施例的系统日志的处理方法流程示意图;

    [0037] 图5为根据本发明又一个实施例的系统日志的处理方法流程示意图。





    具体实施方式

    [0038] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方 式作进一步地详细描述。

    [0039] 本发明实施例实现了一种集中分析、精准定位、实时报警、面向多用户、便于查询 与深入分析的系统日志的处理平台,既可以满足不同应用、不同设备的日志分析需求,又是 一套完整的监控与报警综合服务平台。

    [0040] 本发明一个实施例提供的一种系统日志的处理平台,参见图1,该平台包括系统 日志采集系统和系统日志管理系统。本实施例不对平台及其各器件的名称进行严格限定, 如系统日志的处理平台可以称之为系统日志信息采集与管理系统(Syslog Information Collection And Management System,SICMS),SICMS 包括系统日志采集系统 100 和系统日 志管理系统200。

    [0041] 系统日志米集系统100包括守护任务和调度器(Daemon Task and Scheduler, DTS)、系统日志信息采集(Syslog Information Collection, SIC)功能和系统日志信息 管理(Syslog Information Analyse,SIA)功能。SIC 中包括消息队列(Message Queue) 模块112和心跳检测(Heartbeat Monitor)模块113 ;SIA中包括模板选择器(Template Selector) 114 和关键字过滤器(Keywords Filter) 115。

    [0042] 系统日志管理系统200包括数据库(Data Center) 214、数据生成器212、报警模块 213、数据访问和控制中心(Data Access&Control Centre,DACC)211。其中报警模块213可 以设置在监控中心(Monitor Center)中,并且系统日志管理系统200中还可以设置有控制 中心(Logzilia Expand) 〇

    [0043] 其中,SIC功能主要用于对syslog进行检查与索引,并生成消息队列输送给SIA。

    [0044] 消息队列模块112隶属于SIC,用于生成实时消息队列。

    [0045] 心跳检测模块113隶属于SIC,用于检测报警那些不能正常投递日志的被采集设 备。

    [0046] SIA功能主要用于处理消息队列并生成所需数据。

    [0047] 模板选择器114隶属于SIA,使用相对应的设备模板对来自被米集设备的系统日 志进行匹配。

    [0048] 关键字过滤器115隶属于SIA,通过多级过滤条件(如多级关键字模板)过滤数 据。

    [0049] DTS111负责系统日志采集系统100中SIC和SIA功能的运行与调度。

    [0050] DACC211主要对系统日志管理系统200中的器件进行管理,其功能包括等级关键 字的设置、数据库及其管理、统计与检索、监控报警等。

    [0051] 数据库214隶属于DACC,用于记录格式化后的syslog、配置信息与管理日志等。

    [0052] 控制中心隶属于DACC,是DACC的网络(web)控制台。

    [0053] 监控中心隶属于DACC,由分级报警模块213和平台展现模块两部分组成。

    [0054] 下面结合附图分别对上述各功能和单元进行具体说明。

    [0055] 参见图2,显示了本发明一个实施例的系统日志采集系统的工作流程示意图。

    [0056] 在开始执行对系统日志的处理操作时,消息队列模块112访问生成系统日志的设 备,从设备采集系统日志。这些设备主要为一些可能产生系统日志的进程,如防火墙设备、 路由器设备、交换机设备和负载均衡设备中的一种或多种等。

    [0057] 具体地,消息队列模块112利用日志工具logtail访问需要执行日志采集的设备, 当该设备中存在系统日志时,采集该系统日志并生成消息队列形式的系统日志消息流,然 后将消息流送入模板选择器114。即本实施例采用消息队列的数据形式,以便于对系统日志 进行处理。logtail工具是部署在客户端侧(如syslog-ng日志工具)上的一个客户端脚 本,它为每个日志文件设置检测点(checkpoint),以向SIC提供最新的syslog记录,是消息 队列模块112所使用的获取数据流的工具。本方案将系统日志采集系统设置在客户端侧, 进行系统日志的采集、过滤等操作,将系统日志管理系统设置在服务器侧,进行系统日志的 报警、二次开发等操作。

    [0058] 当消息队列模块112没有从设备中采集到系统日志时,DTS111调度心跳检测模块 113向设备发送心跳消息,即心跳检测模块113会根据DTS111的调度向设备发送心跳消息, 从而触发该设备发送任意系统日志,以确定该设备的存活状态,即该设备是否处于正常工 作状态。当心跳检测模块113接收到该设备根据心跳消息返回系统日志时,将该系统日志 发送至模板选择器114,由模板选择器114进行处理。

    [0059] 当心跳检测模块113接收到该设备根据心跳消息返回指示发生故障的应答,则将 该设备的信息发送至DTS111并记录,由DTS111将该设备的信息发送至系统日志管理系统 进行报警。当心跳检测模块113接收到该设备根据心跳消息返回指示正常的应答时,即该 设备正常工作但该设备不生成系统日志,则结束对该设备的操作。

    [0060] DTS111对消息队列模块、模板选择器和关键字过滤器进行运行与调度。

    [0061] 模板选择器114将采集到的系统日志与指定的设备模板进行匹配,确认各系统日 志对应的设备类型。系统日志经过消息队列模块112的处理后形成系统日志消息流,模板 选择器114将设备模板与消息流进行匹配。设备类型可以指示生成系统日志的设备的名 称、设备的型号等。在执行匹配操作时,模板选择器114会遍历各设备模板,将各设备模板 逐一对消息流中的系统日志(如系统日志的格式)进行匹配,当出现匹配成功的设备模板 时,终止匹配操作,将与系统日志匹配成功的设备模板对应的设备类型作为该系统日志的 设备类型。

    [0062] 模板选择器114可以从系统日志管理系统获取使用的设备模板,例如,由系统日 志采集系统中的DTS向系统日志管理系统中的DACC发送请求获取设备模板的请求,DTS接 收DACC根据该请求下发的设备模板,DTS将该设备模板发送至模板选择器114。

    [0063] 本实施例中,对每一种设备类型,将能够匹配该设备类型下的所有系统日志格式 的条件表达式选取为该设备类型的设备模板,则在进行设备模板与系统日志的匹配操作 时,将采集到的系统日志的格式与下述指定的设备模板进行匹配。本实施例通过对各设备 的系统日志的统计和分析,提供的指定的设备模板的示例如下:

    [0064] 防火墙(FireWall)的设备模板为:

    [0065] (·*? )\s ? (\w+(-\w+) {1,4}) ? \s ? \ %? \ %? (\w+[- V ] ([0-7])

    [-V ]\w+(\(\w+\)) ? ): ? \s ? (. *)

    [0066] 路由器与交换机(Switch and Router)的设备模板为:

    [0067] (·*? )\s ? (\w+(-\w+) {1,4}) ? \s ? \ %? \ %? (\w+[- V ] ([0-7])

    [-V ]\w+(\(\w+\)) ? ): ? \s ? (. *)

    [0068] F5负载均衡设备的设备模板为:

    [0069] (. * ? ) \s ? \w+(-\w+) {1,4} \s+(. * ? ):\s+(. *)

    [0070] A10负载均衡设备的设备模板为:

    [0071] (· * ? ) \s ? (alOlogd:\s+\ [\w+\])〈( [0-7]) >\s+(· *)

    [0072] Alteon负载均衡设备的设备模板为:

    [0073] (\w+) \s+ (AlteonOS\s+〈\w+>) : \s+ (· *)

    [0074] Juniper防火墙或路由器设备的设备模板为:

    [0075] (· * ? ) \s ? [Jnpr I Juniper: ]\s+(· *)

    [0076] 由上,本实施例不同设备的系统日志格式,制定的与之相符合的条件表达式,作为 设备模板。设备模板由DTS进行调度,用于在系统日志采集系统中与消息流进行匹配比对, 来确定日志来源属于何种设备,以及解析各字段含义,为后续数据生成器的格式标准化输 出所用。

    [0077] 关键字过滤器115根据各系统日志的设备类型,利用指定的关键字模板对系统日 志进行过滤,并将过滤结果发送至系统日志管理系统。关键字过滤器115对系统日志的过 滤操作主要起到了将系统日志进行分类的作用,本实施例中过滤后的系统日志被分为三大 类,一类为危险的系统日志(可为其设置第一标志位),再一类为安全的系统日志(可为其 设置第二标志位),又一类为未知的系统日志(可为其设置第三标志位),按照类别将系统 日志的相关信息上报至服务器侧(如系统日志管理系统),从而使系统日志管理系统能够 对不同类别的系统日志进行不同的操作。

    [0078] 图2所示的实施例中关键字过滤器115包括一级关键字过滤器和二级关键字过滤 器。关键字过滤器115使用的关键字模板包括一级关键字模板和二级关键字模板,不同设 备类型的系统日志对应的二级关键字模板不同,而所有设备类型的系统日志都可以使用相 同的一级关键字模板。

    [0079] 关键字过滤器115可以从系统日志管理系统获取使用的关键字模板,例如,由系 统日志采集系统中的DTS向系统日志管理系统中的DACC发送请求获取关键字模板的请求, DTS接收DACC根据该请求下发的关键字模板,DTS将该关键字模板发送至关键字过滤器 115。

    [0080] 关键字过滤器115中的一级关键字过滤器利用一级关键字模板对所有设备类型 的系统日志进行匹配,为一级关键字模板匹配成功的系统日志设置第一标志位,将匹配成 功的系统日志、该系统日志的第一标志位及设备类型上报至系统日志管理系统。本实施例 中设置的标志位为一种报警级别标记,如第一标志位可以设置为1,表示报警级别为一级。 对第一标志位的系统日志,认定为危险日志,需要报警。

    [0081] 对一级关键字模板匹配失败的系统日志,二级关键字过滤器利用该系统日志的设 备类型对应的二级关键字模板对该系统日志进行匹配,为二级关键字模板匹配成功的系统 日志设置第二标志位,将匹配成功的系统日志、该系统日志的设备类型上报至系统日志管 理系统。如第二标志位可以设置为2,表示报警级别为二级。对第二标志位的系统日志,认 定为排除对象,即该类型系统日志为安全日志,不需要报警。

    [0082] 关键字过滤器115为一级关键字模板和二级关键字模板都匹配失败的系统日志 设置第三标志位,将该系统日志、该系统日志的第三标志位及设备类型上报至系统日志管 理系统。如第三标志位可以设置为-1,表示未定义。通过第三标志位的系统日志可以发现 过滤条件之外未被发掘的、具有潜在价值的日志,增强系统的发现与学习能力。

    [0083] 由上,考虑到具有第二标志位的系统日志不需要报警,本实施例中采用仅将设置 的第一标志位、第三标志位上报至服务器侧,而不将设置的第二标志位上报至服务器侧的 处理方式,则在服务器侧将具有第一标志位或第三标志位之外的系统日志视为具有第二标 志为的系统日志。

    [0084] 又一种方式下,客户端可以将设置的第一标志位、第二标志位和第三标志位都上 报至服务器侧,便于服务器侧对不同的系统日志进行区分和操作。

    [0085] 本实施例使用的一级关键字模板,参见下表1 :

    [0086] 表 1

    [0087]

    Figure CN104144071AD00101

    Figure CN104144071AD00111

    [0088] 上述表1中的每个框格表示一个一级关键字,当一条系统日志与上述的至少一个 一级关键字相匹配时,表明该系统日志与一级关键字模板匹配成功。上述符号"\b,\s,□" 为正则表达式语法,符号"\b"表示就近匹配,符号"\s "表示空格,符号"[]"表示其中的字 符为可选。

    [0089] 本实施例对不同设备使用的二级关键字模板不同,二级关键字模板的示例表示如 下:

    [0090] A10负载均衡设备对应的二级关键字模板如下:

    [0091] (" NTP" [Uu]ser〃 ," Session" Service tcp" SLB server");

    [0092] F5负载均衡设备对应的二级关键字模板如下:

    [0093] (" ssl_" NTP" [Uu] ser" Session" HTTP" mysqlsys log-ng/7 , " crond" , " httpd" , " sshd〃 , " anacron" , " mcpd〃 , " Limiting" );

    [0094] Alteon负载均衡设备对应的二级关键字模板如下:

    [0095] (" mgmt");

    [0096] 防火墙设备对应的二级关键字模板如下:

    [0097] (" [Dd]enied〃," Deny" Invalid" [Pp]ower〃," [Cc]onfigur〃 );

    [0098] 路由器与交换机设备对应的二级关键字模板如下:

    [0099] (" [Cc]onfigur〃," SHELL"," CMD"," SSH"," SNMP"," TELNET"," VTY ","Trap" , " 0ID" , " admin");

    [0100] Nokia防火墙设备对应的二级关键字模板如下:

    [0101] (" BACKUP_REST0RE_C0NFIG"," snmpd"," r印eated"," telnetd"," syslo gd" , " CONFIG" ," ntpdate" , " cron:" , " ipsctl get error" ," login" ," passwd");

    [0102] juniper防火墙设备对应的二级关键字模板如下:

    [0103] (" SNMP"," INFO",,System\(\)\[\],," Syslog 3835"," Unable to resolve" , " Unable to open" )〇

    [0104] 进一步的,本实施例中当模板选择器114中没有与采集到的系统日志相匹配的设 备模板时,将该系统日志的设备类型设置为未定义(undefined)设备类型;则关键字过滤 器115仅利用一级关键字模板对该系统日志进行匹配,将匹配成功的系统日志、该系统日 志的第一标志位及设备类型上报至服务器侧,将匹配失败的系统日志记录在临时文件中备 案。

    [0105] 由上,本实施例采用两级的关键字结构,一级关键字模板作为报警特征使用,二级 关键字模板作为排除特征使用,即每种设备类型的一级关键字模板由该设备类型下系统日 志中禁止包括的关键字生成,而每种设备类型的二级关键字模板由该设备类型下系统日志 中允许包括的关键字生成。

    [0106] 一级关键字模板作用于所有类型的设备,二级关键字模板作用于不同类型的设 备。根据关键字模板过滤出一级、二级和未定义级别的系统日志。对于标志位为1的系统 日志(认定为危险),将其设备类型连同标志位直接传递给系统日志管理系统,如先发送至 系统日志管理系统中的数据生成器,再由数据生成器对该系统日志的格式进行处理后,发 送至报警模块并存储在数据库模块中;对标志位为2的系统日志(认定为排除对象),将其 设备类型、关键字计数结果等信息提交给数据库模块;对于标志位为-1的系统日志(认定 为未定义),将其设备类型连同标志位也直接传递给系统日志管理系统。

    [0107] 本实施例提供的系统日志采集系统能够依据设备型号,过滤掉不重要的垃圾信 息,同时又可以自动发现未被发掘的有价值的日志信息,实现问题的精准定位、精确报警和 问题预警,为运维人员的快速响应提供有力保障,提高运维质量。

    [0108] 参见图3,显示了本发明一个实施例的另一种系统日志的处理平台的结构示意图。 该平台包括位于客户端侧(如syslog-ng日志工具)的系统日志采集系统100,以及位于服 务器侧的(如syslog-ng日志工具服务器)的系统日志管理系统200。

    [0109] 系统日志采集系统100中包括DTS、关键字过滤器(包括一级关键字过滤器和二级 关键字过滤器)、消息队列模块、模板选择器和心跳检测模块,这些器件的具体工作方式可 以参见图1和图2示出的实施例中的相关内容。本实施例主要对系统日志管理系统200的 结构及运行方式进行说明。

    [0110] 系统日志管理系统200包括数据库214、数据生成器212、报警模块213和 DACC211。DACC211对数据库、数据生成器和报警模块进行管理。

    [0111] 数据库214存储平台中的数据。数据库214可以采用mysql数据库,其存储平台 的业务数据、配置信息和系统日志等,并为数据生成器212和DACC211所调用。

    [0112] 数据生成器212接收来自系统日志采集系统100的过滤结果,并按照预定的统一 格式将过滤结果存储至数据库。数据生成器212将各条系统日志及其相关信息整理成统一 的标准格式,即对接收到的数据进行格式化,如将每条系统日志的相关数据整理为按照主 机名称-IP地址-设备类型-标志位-系统日志的次序的格式。数据生成器212将统一格 式后的系统日志存储至数据库214中。

    [0113] 当进行二次开发或数据统计等,需要从数据库214中提取系统日志时,DACC接收 来自外部的日志处理指令,根据该指令按照预定的统一格式从数据库214中提取出指定设 备类型的系统日志,并按照日志处理指令进行处理,如数据统计、或者筛选未定义的有价值 的新关键字等。

    [0114] 本实施例中通过根据系统日志采集系统上报的设备类型,将系统日志转换为统一 格式的技术手段,能够对不同类型的系统日志进行区分处理和存储,极大便利了后续对系 统日志的利用,满足对系统日志二次开发的需求,提高资源利用率;而且能够提高日志过滤 的精准度和灵活性,实现问题的精准定位、精确报警和问题预警,提高系统的运维质量。

    [0115] 报警模块213根据数据生成器212中的数据进行报警。报警模块213针对数据生 成器212抛来的数据进行报警。报警动作包括短信报警、邮件报警两种方式。对于标志位 为1的系统日志,报警模块213同时触发这两种方式,如报警模块213向业务组发送邮件或 发送短信报警。标志位为-1的系统日志仅触发邮件报警方式,如报警模块213仅向业务组 发送邮件报警。即报警模块213当根据所述数据生成器212中的过滤结果获知系统日志具 有第一标志位时,采用短信方式和邮件方式发送报警消息;当根据所述过滤结果获知系统 日志具有第三标志位时,采用邮件方式发送报警消息;当根据所述过滤结果获知系统日志 不具有第一标志位或第三标志位时,不执行报警操作。

    [0116] 除了向远程的业务组报警,本实施例也可以在DACC上实现本平台的平台报警。平 台报警以颜色和声音两种方式进行展现,颜色方面分为黄色预警和红色报警两种,声音方 面是针对红色报警进行音频播放动作。

    [0117] 系统日志管理系统中还可以包括一个独立的控制中心(Logzilla Expand),或者, 该控制中心可以设置在DACC中实现。logzilla是一款开源的日志收集工具,能很好的展 示和检索日志。本方案在logzilla基础上,通过php语言开发,加入了模板定义模块、关键 字定义模块、报警模块、统计分析模块、智能标识关键字模块。把logzilla改造成为了一 个集日志信息管理、监控报警、统计分析与智能化的综合管控平台,即控制中心(Logzilla Expand)〇

    [0118] 控制中心提供可视化数据展现、数据关联检索、设备模板定义、关键字模板定义、 数据统计分析、数据导出、权限与配置修改、平台报警功能、智能标识关键字功能等。

    [0119] 控制中心通过定义设备模板、关键字模板,实现模板的平台化管理,并且,当出现 新加入的需要监控的设备时,只需在控制中心为其配置设备模板、关键字模板并下发至关 键字过滤器后,就可以将新设备纳入的系统日志的处理平台中来,实现了不同应用、不同设 备的日志分析需求。

    [0120] 以及,控制中心通过对历史数据的统计计算可以实现图表的功能;通过分词算法 可以统计出未定义日志中有价值的新关键字,并在监控页面中自动出具新关键字添加提示 信息,从而形成一个集数据、监控、报警、统计功能、智能分析于一体的综合服务平台。

    [0121] 本发明又一个实施例还提供了一种系统日志的处理方法,参见图4,该方法包括:

    [0122] S400 :访问生成系统日志的设备,从所述设备采集系统日志;

    [0123] S402:将采集到的系统日志的格式与指定的设备模板进行匹配,确认各系统日志 对应的设备类型;

    [0124] S404:根据各系统日志的设备类型,利用指定的关键字模板对系统日志进行过 滤;

    [0125] S406 :将所述过滤结果发送至服务器侧,由服务器侧对所述系统日志进行报警处 理。

    [0126] 其中,每种设备类型的设备模板由能够匹配该设备类型下的所有系统日志格式的 条件表达式生成;

    [0127] 每种设备类型的关键字模板由该设备类型下系统日志中允许包括的关键字或者 禁止包括的关键字生成

    [0128] 其中,上述步骤S400包括:利用日志工具logtail访问设备,当该设备中存在系统 日志时,采集该系统日志并生成消息队列形式的系统日志消息流;当该设备中不存在系统 日志时,通过建立的DTS向该设备发送心跳消息,若该设备根据心跳消息返回系统日志,则 采集该系统日志并生成消息队列形式的系统日志消息流,若该设备根据心跳消息返回指示 发生故障的应答,则将相应设备的信息记录在DTS中,由DTS发送至服务器侧进行报警。

    [0129] 在步骤S402之前,上述方法还包括:向服务器侧发送请求获取所述设备模板和/ 或关键字模板的请求;接收服务器侧根据所述请求下发的设备模板和/或关键字模板。 [0130] 上述指定的关键字模板包括一级关键字模板和二级关键字模板,为不同设备类型 的系统日志设置的二级关键字模板不同,上述步骤S404包括:利用一级关键字模板对所有 设备类型的系统日志进行匹配,为一级关键字模板匹配成功的系统日志设置第一标志位, 将匹配成功的系统日志、该系统日志的第一标志位及设备类型上报至服务器侧;对一级关 键字模板匹配失败的系统日志,利用该系统日志的设备类型对应的二级关键字模板对该系 统日志进行匹配,为二级关键字模板匹配成功的系统日志设置第二标志位,将匹配成功的 系统日志、该系统日志的设备类型上报至服务器侧;以及,为一级关键字模板和二级关键字 模板都匹配失败的系统日志设置第三标志位,将该系统日志、该系统日志的第三标志位及 设备类型上报至服务器侧。

    [0131] 由上,本实施例采用两级的关键字结构,一级关键字模板作为报警特征使用,二级 关键字模板作为排除特征使用。一级关键字模板作用于所有类型的设备,二级关键字模板 作用于不同类型的设备。根据关键字模板过滤出一级、二级和未定义级别的系统日志。对 于标志位为1的系统日志(认定为危险),将其设备类型连同标志位直接传递给系统日志管 理系统,如先发送至系统日志管理系统中的数据生成器,再由数据生成器对该系统日志的 格式进行处理后,发送至报警模块并存储在数据库模块中;对标志位为2的系统日志(认定 为排除对象),将其设备类型、关键字计数结果等信息提交给数据库模块;对于标志位为-1 的系统日志(认定为未定义),将其设备类型连同标志位也直接传递给系统日志管理系统。

    [0132] 进一步的,上述方法还包括:当采集到的系统日志没有匹配的设备模板时,将该系 统日志的设备类型设置为未定义设备类型;

    [0133] 步骤S404中利用指定的关键字模板对系统日志进行过滤包括:仅利用一级关键 字模板对该系统日志进行匹配,将匹配成功的系统日志、该系统日志的第一标志位及设备 类型上报至服务器侧,将匹配失败的系统日志记录在临时文件中。

    [0134] 本方法实施例中各步骤的具体执行方法可以参见本发明产品实施例中系统日志 采集系统的相关内容,在此不再赘述。

    [0135] 本发明又一个实施例还提供了一种系统日志的处理方法,参见图5,该方法包括:

    [0136] S500:接收客户端侧上报的系统日志的过滤结果并按照预定的统一格式将过滤结 果存储至数据库,该过滤结果包括系统日志和该系统日志对应的标志位,该标志位包括第 一标志位和第二标志位。

    [0137] S502 :当根据所述过滤结果获知系统日志具有第一标志位时,采用短信方式和邮 件方式发送报警消息;

    [0138] S504 :当根据所述过滤结果获知系统日志具有第三标志位时,采用邮件方式发送 报警消息;

    [0139] S506 :当根据所述过滤结果获知系统日志不具有第一标志位或第三标志位时,不 执行报警操作。

    [0140] 上述步骤S500至S506的方案中,客户端仅将设置的第一标志位和第二标志位上 报至服务器侧,则在服务器侧将具有第一标志位或第三标志位之外的系统日志视为具有第 二标志为的系统日志。

    [0141] 又一种方式下,当客户端将设置的第一标志位、第二标志位和第三标志位都上报 至服务器侧,服务器侧可以便捷、快速地识别出各个类别的系统日志,便于服务器侧对各类 别的系统日志进行包括报警处理在内的其它操作。

    [0142] 进一步的,上述过滤结果中还包括系统日志的设备类型,该方法还包括:根据接收 到的日志处理指令,按照所述预定的统一格式从所述数据库中提取出指定设备类型的系统 日志,并按照所述日志处理指令进行处理,如数据统计、或者筛选未定义的有价值的新关键 字等。

    [0143] 本方法实施例中各步骤的具体执行方法可以参见本发明产品实施例中系统日志 管理系统的相关内容,在此不再赘述。

    [0144] 由上所述,本发明实施例通过将系统日志与所建立的设备模板相匹配的技术手 段,能够区分出不同设备的系统日志,对不同设备的系统日志进行不同处理,以及通过设备 类型结合指定的关键字模板对系统日志进行过滤的手段,提高了过滤方式的灵活性,能够 全面、准确地对日志进行过滤。

    [0145] 由上,本发明实施例提供的系统日志处理方案,不但能够对不同类型的系统日志 进行区分处理和存储,极大便利了后续对系统日志的利用,满足对系统日志二次开发的需 求,提高资源利用率;而且能够提高日志过滤的精准度和灵活性,实现问题的精准定位、精 确报警和问题预警,提高系统的运维质量。

    [0146] 为了便于清楚描述本发明实施例的技术方案,在发明的实施例中,采用了"第一"、 "第二"等字样对功能和作用基本相同的相同项或相似项进行区分,本领域技术人员可以理 解"第一"、"第二"等字样并不对数量和执行次序进行限定。

    [0147] 以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在 本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围 内。


    展开全文
  • 毕设是做监控android系统日志,可现在google不开放获取系统日志权限,求大神提供方法,网上有看到方法 不过好像不行 ![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/9.gif)
  • 系统日志管理

    千次阅读 2019-04-12 11:04:36
    rsylogrsyslog: 用来采集系统日志,不具备生产日志的功能 rsyslog的管理: /var/log/messages 服务信息日志 /var/log/secure 系统登陆日志 /var/log/cron ...

    rsylog
    rsyslog 用来采集系统日志,不具备生产日志的功能

    1. rsyslog的管理

    /var/log/messages

    服务信息日志

    /var/log/secure

    系统登陆日志

    /var/log/cron

    定时任务日志

    /var/log/maillog

    邮件日志

    /var/log/boot.log

    系统启动日志

    日志管理

    首先要指定日志采集路径

    日志采集规则:

    将什么类型的日志,什么级别的日志 /var/log/file

    日志类型分类:

    authpriv

    ssh.ftp等登陆信息的验证信息

    cron

    时间任务相关

    kren

    内核

    lpr

    打印

    mail

    邮件

    mark(syslog)-rsyslog

    服务内部的信息,时间标识

    news

    新闻组

    user

    用户程序产生的相关信息

    uucp

    unix to unix copy,unix主机之间相关的通讯

    local 1~7

    自定义的日志设备

    日志级别分为:

    debug

    有调试信息的,日志信息最多

    info

    一般信息的日志,最常用

    notice

    最具有重要性的普通条件的信息

    warning

    警告级别

    err

    错误级别,阻止某个功能或者模块不能正常工作的信息

    crit

    严重级别,阻止整个系统或者整个软件不能正常工作的信息

    alert

    需要立刻修改的信息

    emerg

    内核崩溃等严重信息

    none

    什么都不记录

    注意
    从上到下,级别从低到高,记录的信息越来越少
    详细的可以查看手册:man 3 syslog

    操作示例:
    目的:把系统中所有日志采集到/var/log/westos文件中
    操作:

    vim/etc/rsyslog.conf
    *.*                              /var/log/westos

    systemctl   restart rsyslog

    测试:

          systemctl   restart sshd

          cat /var/log/westos

    日志的远程同步
    在日志发送方:


    vim /etc/rsyslog.conf
    *.*  @172.25.254.206   "@"表示udp协议发送,"@@"表示tcp协议发送

    systemctl restart rsyslog
    在日志接收方:
    vim /etc/rsyslog.conf
    15行 $ModLoad imudp   日志接收模块
    16行 $UDPServerRun 514     开启接收端口

    systemctl restart rsyslog
    systemctl stop firewalld  关闭火墙
    systemctl disable firewalld 设定火墙开机关闭


    测试:
    在接收方和发送方清空日志文件
    > /var/log/messages
    在日志的发送方
    logger 日志内容
    cat /var/log/messages   查看的已经生成日志以及日志内容
    在日志的接收方
    cat /var/log/messages   查看发送方发送的日志以及日志内容

    TCP/UDP协议:

    两种都是传输协议,UDP提供了无连接的数据报服务,而TCP是面向连接的传输控制协议,UDP在传输数据前不建立连接,不对数据报进行检查和修改,不需等待对方应答,所以会出现乱序,分组丢失,重复的问题,UDP的优点是快速,网络开销小。TCP是先建立连接再传输数据,不会有数据丢失或乱序的情况出现,优点是稳定。

    展开全文
  • Ubuntu系统日志分析

    千次阅读 2019-03-12 10:53:33
    可视化的Ubuntu可在系统日志中查看日志 1. 日志查看器 Xorg 是显示服务 auth是安全验证 boot是启动 daemon是进程 kern是内核 messages是消息 syslog是系统 user是用户 2.连接时间的日志 连接时间日志一般...
  • 最近项目中需要记录服务端访问日志,所谓的服务端访问日志其实就是Controller层的访问日志,所以在开发...Service层日志监控:SpringBoot通过AOP实现系统日志记录(二)-Service层日志监控 Mapper层日志监控:Spr...
  • 系统日志的了解

    千次阅读 2018-10-13 14:28:34
    一、什么是系统日志系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。系统日志包括系统日志、应用...
  • Linux系统日志以及日志同步设置

    千次阅读 2017-07-21 23:45:02
    Linux系统日志 Linux日志同步设置 Linux日志管理
  • 系统日志查看journalctl命令详解

    千次阅读 2020-07-13 15:48:46
    journalctl可以查看所有的系统日志文件,由于日志信息量很大,journalctl还提供了各种参数帮助用户更快速的定位到日志信息。 默认情况下,用户都可以访问自己的日志。对于系统主日志和其他用户的日志,仅限于有权限...
  • win10系统日志事件ID 10016

    万次阅读 2019-04-03 16:12:09
    win10 事件查看器里面系统日志 来源DistributedCOM 事件ID 10016 事件10016直接原因就是某个账户没有对某个组件本地激活的权限 通过日志,我们可以看到是哪个账户和哪个组件 通过修改注册表获得对该组件的修改权限 ...
  • 如何在Mac上查看系统日志

    千次阅读 2020-04-28 15:17:00
    如何在Mac上查看系统日志 Mac会保留系统日志,这有助于诊断和解决macOS和已安装应用程序的问题。这些日志作为纯文本日志文件存储在Mac的系统驱动器上,macOS还包括一个用于查看它们的应用程序。 查看系统日志在...
  • Android 系统日志写入文件

    千次阅读 2018-07-04 20:04:25
    目录介绍 1.业务需求 2.目前有那些做法及问题 3.自定义log工具类,一边打印日志一边写入文件 ...4.在application开启线程池进行日志打印 ...5.写一个service将系统日志写到...要求将app的系统日志都写入到指定的文...
  • android系统日志

    千次阅读 2016-07-14 22:32:15
    系统日志主要包含: android log(包含 main_log、events_log、kernel_log),mainlog记录手机android上层app以及framework相关活动的log,比如你写的app打印的log,就在这里面;eventslog则主要是ActivityManager...
  • 闲聊Windows系统日志

    万次阅读 2018-07-04 00:26:39
    * 本文作者:TomKing,本文属FreeBuf原创奖励计划,未经许可禁止转载前言最近遇到不少应急都提出一个需求,能不能...不过现在都要求保留至少6个月的日志,因此这种原因会少了很多,然而我对于Windows中系统日志不了...
  • 如何清理系统日志

    千次阅读 2018-06-20 09:42:50
    以管理员身份登陆(administrator)后,进入 “开始—设置—控制面板—管理工具”,双击“事件查看器”,这里可以看到应用程序日志、安全日志、系统日志。在任意一种日志上面右击选择清除所有事件就可以了,也可以...
  • 业务系统日志记录规范总结

    千次阅读 2019-08-28 16:01:09
    业务系统日志记录规范 注意 应用中应该充满了日志记录信息,日志甚至比逻辑代码还要多; 集成 seluth ,开启消息链路;不开启日志上传,不集成 zipkin; 应该避免日志记录过程中出现异常,比如 log.debug(requst...
  • C# 创建系统日志、文件日志

    千次阅读 2015-01-27 13:18:53
    使用C#自带的EventLog方法来操作系统日志
  • [LINUX]linux系统日志

    千次阅读 2018-02-06 21:29:06
    linux系统日志 second60 20180206 1简介  linux系统拥有非常强大的日志功能,保存着几乎有所有操作记录,包括内核和程序产生的各种错误信息,警告信息或其他提示信息,对这些信息管理员了解系统的运行状态和分析...
  • MDC分布式系统日志链路追踪

    千次阅读 2018-12-21 00:19:08
    MDC分布式系统日志链路追踪 我先说下实现思路:MDC+logback+AOP+traceId(把traceId设置请求头里) (1)使用MDC+logback实现日志号输出 %X{traceId} (2)AOP实现在所有方法执行之前把traceId设置进MDC,并且...
  • kafka 系统日志定时清理

    千次阅读 2018-11-14 16:33:18
    每天定时清理kafka集群server端3天前的系统日志 写清理脚本,: 在/data1/kafka/kafka 目录下新建文件 auto-delete-kafka-3days-ago-log.sh 内容如下: #!/bin/sh find /data1/kafka/kafka/logs/ -mtime +3 -...
  • Ubuntu查看和写入系统日志

    万次阅读 2018-02-01 23:51:54
    Ubuntu查看和写入系统日志 一、背景 Linux将大量事件记录到磁盘上,它们大部分以纯文本形式存储在/var/log目录中。大多数日志条目通过系统日志守护进程syslogd,并被写入系统日志。 Ubuntu包括以图形方式或从...
  • Linux_如何处理系统日志和系统轮转

    千次阅读 多人点赞 2020-02-27 21:02:24
    知道了在Linux系统中如何进行rsyslog 系统日志管理和 logrotate日志轮转。 拼搏到无能为力,坚持到感动自己。 简述: 1.处理日志程序 a。rsyslog b。其他不同的应用 2.常见的日志文件 ar/log/messages ar/log/ma...
  • 通过系统日志采集大数据

    千次阅读 2019-06-25 21:59:58
    许多公司的平台每天都会产生大量的日志,并且一般为流式数据,如搜索引擎的 pv 和查询等。处理这些日志需要特定的日志系统,这些系统需要具有以下...目前使用最广泛的、用于系统日志采集的海量数据采集工具有 Had...
  • linux系统日志及其管理

    千次阅读 2017-10-17 22:39:55
    Linux——unit10、系统日志   ####1.系统日志默认分类####   /var/log/messages ##系统服务及日志,包括服务的信息,报错等等 /var/log/secure ##系统认证信息日志 /var/log/maillog ##系统邮件服务信息 /var/...
  • syslog 系统日志应用

    千次阅读 2016-11-15 10:46:25
    syslog 系统日志应用  1) 概述  syslog是Linux系统默认的日志守护进程。默认的syslog配置文件是/etc/syslog.conf文件。程序,守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以...
  • 系统日志分析 之 日志的采集与查看

    千次阅读 2019-07-21 10:52:04
    系统日志的管理 日志是由进程生成 1.rsyslog 服务 此服务是用来采集系统日志的,他不产生日志,只是起到采集作用 2.rsyslog服务的管理 /var/log/messages 该文件储存服务信息日志...
  • linux系统日志与时间管理

    千次阅读 2018-10-17 21:03:08
    1.系统日志的作用 查看日志是系统的重要排错手段,系统日志由程序本身产生,rsyslong.service服务是系统用来采集日志的服务。 2.系统日志的分类 /var/log/messages   ##系统服务及日志,包括服务的信息,报错...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,244,232
精华内容 497,692
关键字:

系统日志