zoukankan      html  css  js  c++  java
  • linux服务器日志剖析

    常规tomcat,apache,nginx,错误日志,还有项目log4j日志

    tomcat (以tomcat7.082为例)

      tomcat日志配置  运行日志和访问日志结合在一起,先说下日志哪边配置,在tomcat/conf/server.xml下查询pattern选项

      

        valve className="org.apache.catalina.valves.AccessLogValve"   java定义类,不动

        directory="logs"                       默认存放在tomcat根下logs文件下,可以修改路径

        prefix="localhost_access_log."                  日志文件名的前缀,如果没有指定,缺省值是”localhost_access_log.;(要注意后面有个小点)

        suffix=".txt"                         日志文件的后缀名(注意小点)

                             

      pattern     需要记录的日志信息的格式布局,有以下参数:

       %a    远端IP
          %A    本地IP
          %b    发送的字节数,不包含HTTP头,如果为0,使用”-”
          %B    发送的字节数,不包含HTTP头
          %h    远端主机名(如果resolveHosts=false),远端的IP
          %H    请求协议
          %l      从identd返回的远端逻辑用户名,总是返回’-’
          %m   请求的方法
          %p    收到请求的本地端口号
          %q    查询字符串
          %r     请求的第一行
          %s  响应的状态码
          %S    用户的sessionID
          %t      日志和时间,使用通常的log格式
          %u    认证以后的远端用户(如果存在的话,否则为’-’)
          %U    请求的URI路径
          %v     本地服务器的名称
          %D 处理请求的时间,以毫秒为单位
          %T    处理请求的时间,以秒为单位

        可以自定义修改日志输出内容

      tomcat日志级别,在tomcat根下conf/logging.properties

        日志分为5类

          catalina 、 localhost 、 manager 、 admin 、 host-manager

        日志每类分为从高到低

          SEVERE (highest value) > WARNING > INFO > CONFIG > FINE > FINER > FINEST (lowest value)

          

          level为日志级别(OFF设置关闭,ALL设置所有日志均输出),dicectory为日志路径,prefix为文件名称,1-4日志进行拼接最终输出一份日志

          参考https://blog.csdn.net/qiuyinthree/article/details/72677173 

      log4j日志(一般开发将该文件放在项目的缺省目录即源包下,在文件系统里,就是在项目的/src/java目录下,缺省的文件名是log4j.properties,这样项目发布后,就在tomcat的安装目录下的/webapps/项目名称/WEB-INF/classes里)

        先了解下log4j的配置

         1. 配置文件

    #配置根Logger
    log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,  …
    #配置日志信息输出目的地Appender
    log4j.appender.appenderName  =  fully.qualified.name.of.appender.class 
      log4j.appender.appenderName.option1  =  value1 
      … 
      log4j.appender.appenderName.optionN  =  valueN 
    #配置日志信息的格式(布局)
    log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class 
      log4j.appender.appenderName.layout.option1  =  value1 
      … 
      log4j.appender.appenderName.layout.optionN  =  valueN

      [level] 是日志输出级别,共有5级:

        FATAL          0  
        ERROR      3  
        WARN         4  
        INFO           6  
        DEBUG      7 

      Appender 为日志输出目的地,Log4j提供的appender有以下几种:

        org.apache.log4j.ConsoleAppender(控制台),
        org.apache.log4j.FileAppender(文件),
        org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
        org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
        org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

      Layout:日志输出格式,Log4j提供的layout有以下几种:

        org.apache.log4j.HTMLLayout(以HTML表格形式布局),
        org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
        org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
        org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 

      打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

        %m   输出代码中指定的消息
        %p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
          %r   输出自应用启动到输出该log信息耗费的毫秒数 
        %c   输出所属的类目,通常就是所在类的全名 
        %t   输出产生该日志事件的线程名 
        %n   输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” 
        %d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日  22 : 10 : 28 , 921  
        %l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 ) 

      2. 在代码中初始化Logger:
        1)在程序中调用BasicConfigurator.configure()方法:给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n",还有根记录器的默认级别是Level.DEBUG.
        2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;
        3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;
        4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。
      3. 为不同的 Appender 设置日志输出级别:
        当调试系统时,我们往往注意的只是异常级别的日志输出,但是通常所有级别的输出都是放在一个文件里的,如果日志输出的级别是BUG!?那就慢慢去找吧。
        这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改Appender的Threshold 就能实现,比如下面的例子:

    ### set log levels ###
    log4j.rootLogger = debug ,  stdout ,  D ,  E
    ### 输出到控制台 ### log4j.appender.stdout
    = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n
    ### 输出到日志文件 ### log4j.appender.D
    = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = logs/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志 log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 保存异常信息到单独文件 ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = logs/error.log ## 异常日志文件名 log4j.appender.D.Append = true log4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!! log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

      代码中的使用

    public class  TestLog4j  {     
        public static void main(String[] args) {        
            PropertyConfigurator.configure( " D:/Code/conf/log4j.properties " );        
        Logger logger  =  Logger.getLogger(TestLog4j. class );        
        logger.debug( " debug " );       
        logger.error( " error " );    
        } 
    }

      输出结果:

      参考https://blog.csdn.net/azheng270/article/details/2173430/

    apache 

      apache日志分为访问日志access.log,和错误日志error.log

      可以在httpd.conf中配置

      

      access.log 

        

        1).58.37.234.104 
        这是一个请求到apache服务器的客户端ip,默认的情况下,第一项信息只是远程主机的ip地址,但我们如果需要apache查出主机的名字,可以将 HostnameLookups设置为on,不推荐使用,会大大降低网站速度。
        2). - 
        这一项是空白,使用"-"来代替,用于记录浏览者的标识,对于大多数浏览器,这项都是空。
        3). - 
        也为空,记录浏览者进行身份验证时提供的名字,大多数这项也为空。
        4). [18/Sep/2018:18:55:21 +0800]
        第四项是记录请求的时间,格式为[day/month/year:hour:minute:second zone],最后的+0800表示服务器所处的时区为东八区
        5). "GET /xxxxx/ HTTP/1.1" 
        这一项最有用,首先,它告诉我们的服务器收到的是一个GET请求,其次,是客户端请求的资源路径,第三,客户端使用的协议时HTTP/1.1,整个格式为"%m %U%q %H",即"请求方法/访问路径/协议"
        6). 200 
        这是一个状态码,由服务器端发送回客户端,它告诉我们客户端的请求是否成功,或者是重定向,或者是碰到了什么样的错误,这项值为200,表示服务器已经成 功的响应了客户端的请求,一般来说,这项值以2开头的表示请求成功,以3开头的表示重定
        向,以4开头的标示客户端存在某些的错误,以5开头的标示服务器端 存在某些错误。
        7).22133
        这项表示服务器向客户端发送了多少的字节,在日志分析统计的时侯,把这些字节加起来就可以得知服务器在某点时间内总的发送数据量是多少

      error.log

        [发生错误时间] [错误严重等级] [pid号] [错误ip地址] [错误文件系统路径]

    nginx

       nginx的日志分为access.log( 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息)和error.log(错误信息)

      access.log:  在nginx根下log/access.log

        

        ip地址--[访问时间] “请求方式 /请求协议” 返回状态码 返回字节数 “跳转来源,没有为-” “浏览器信息”

        自定义配置:  在nginx根下conf/nginx.conf

    #access日志格式配置,具体参数不再细说,上面都已经说过了,自己对应一下即可
    log_format main '$remote_addr - $remote_user [$time_local] '
                         'fwf[$http_x_forwarded_for] tip[$http_true_client_ip] '
                         '$upstream_addr $upstream_response_time $request_time '
                         '$geoip_country_code '
                         '$http_host $request '
                         '"$status" $body_bytes_sent "$http_referer" '
                         '"$http_accept_language" "$http_user_agent" ';
    #配置access log日志的存储位置及文件,注意:access.log文件是可以按日期进行分割的,方便查看及处理

      error.log:    在nginx根下log/error.log

        

        错误信息千奇百怪,我就不一 一举例了,以上是81端口被占用

     版权声明:本文原创发表于 博客园,作者为 RainBol 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

  • 相关阅读:
    hdu 5007 水题 (2014西安网赛A题)
    hdu 1698 线段树(成段替换 区间求和)
    poj 3468 线段树 成段增减 区间求和
    hdu 2795 公告板 (单点最值)
    UVaLive 6833 Miscalculation (表达式计算)
    UVaLive 6832 Bit String Reordering (模拟)
    CodeForces 124C Prime Permutation (数论+贪心)
    SPOJ BALNUM (数位DP)
    CodeForces 628D Magic Numbers (数位DP)
    POJ 3252 Round Numbers (数位DP)
  • 原文地址:https://www.cnblogs.com/RainBol/p/9714838.html
Copyright © 2011-2022 走看看