zoukankan      html  css  js  c++  java
  • 日志之再说Log4J

     网上关于LOG4J的使用文章太多了,写这篇文章的目的一方面是为了回顾LOG4J的用法,一方面针对配置的使用自动将日志插入数据库,自动发送邮件,还有就是自定义输入实现。后续文章会总结下从LOG4J到LOG4J2,再到logback,从commons-logging到sl4j。

    1.简单介绍

      LOG4J(也就是通常所有的log4j1)是Apache软件基金会下面的一个项目,同时也是Apache Logging项目的一部分,Apache Logging包括:Apache Log4j 2Apache log4phpApache log4netApache chainsawApache log4j 1Apache log4cxxApache log4j 1 extras 。通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码.

    2.使用示例

    import org.apache.log4j.Logger;
    
    public class Log4JTest {
    
    	
    	private static final Logger log = Logger.getLogger(Log4JTest.class);//日志文件
    //private static final Logger log = Logger.getLogger("appender");//日志文件 public static void main(String[] args) { log.debug("DEBUG"); log.warn("WARN"); log.info("INFO"); log.error("ERROR"); log.fatal("FATAL"); } }

      从上面可以看出日志级别包括:TRACE,DEBUG,INFO,WARN,ERROR 和FATAL。关于日志的级别这里就不在赘述。

    3.配置文件示例

    3.1说明

      Log4j支持两种格式的配置文件:Log4j 支持两种配置文件格式,一种是 XML 格式的文件,一种是 Java 特性文件 lg4j.properties (键 = 值),properties文件简单易读,xml文件可以配置更多的功能(比如过滤)。

    3.2配置文件加载

      如果采用log4j输出日志,要对log4j加载配置文件的过程有所了解。log4j启动时,默认会寻找source folder下的log4j.xml配置文件,若没有,会寻找log4j.properties文件,然后加载配置。 还可以通过程序的方式手动加载PropertyConfigurator.configure("config/log4j.properties");如果在WEB开发中和Spring集成,还可以通过通过在XML中下列方式来指定具体位置。

    <!-- log4jConfigLocation:log4j配置文件存放路径 -->
        <context-param>
            <param-name>log4jConfigLocation</param-name>
            <param-value>/WEB-INF/conf/log4j.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
        </listener>
    

      3.3示例

    XML配置文件方式

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
     
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
     
        <!-- 控制台的日志记录 -->
        <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <param name="Target" value="System.out" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-5p: %c - %m%n" />
            </layout>
        </appender>
            <!-- 文件的日志记录 -->
        <appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${webapp.root}/logs/testdata.log" />
            <param name="Append" value="true" />
            <param name="DatePattern" value="'.'yyyy-MM-dd" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%-5p]: %c - %m%n" />
            </layout>
        </appender>
        <!-- name要对应字节码文件所在的包路径,只会记录该包路径下的代码的日志 -->
        <logger name="com.bocloud">
            <level value="debug,info,error" />
            <appender-ref ref="file"/>
            <appender-ref ref="console" />
        </logger>
         
        <!-- Root Logger -->
        <root>
            <priority value="debug" />
            <appender-ref ref="console" />
        </root>
         
    </log4j:configuration>
    

     属性配置文件:log4j.properties

    log4j.rootLogger=TRACE,CONSOLE,A1,MAIL,DATABASE,CUNSTOM
    log4j.addivity.org.apache=true 
    
    # 应用于控制台 
    
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
    log4j.appender.Threshold=DEBUG
    log4j.appender.CONSOLE.Target=System.out 
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.CONSOLE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
    #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n 
    
    #应用于文件 
    
    log4j.appender.FILE=org.apache.log4j.FileAppender 
    log4j.appender.FILE.File=file.log 
    log4j.appender.FILE.MaxFileSize=100MB 
    log4j.appender.FILE.Append=true 
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.FILE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
    # Use this layout for LogFactor 5 analysis 
    
    # 应用于文件回滚 
    log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender 
    log4j.appender.ROLLING_FILE.Threshold=ERROR 
    log4j.appender.ROLLING_FILE.File=rolling.log 
    log4j.appender.ROLLING_FILE.Append=true 
    log4j.appender.ROLLING_FILE.MaxFileSize=10KB 
    log4j.appender.ROLLING_FILE.MaxBackupIndex=1 
    log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.ROLLING_FILE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
    
    #应用于socket 
    log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender 
    log4j.appender.SOCKET.RemoteHost=localhost 
    log4j.appender.SOCKET.Port=5001 
    log4j.appender.SOCKET.LocationInfo=true 
    log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout 
    log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n 
    
    # 发送日志给邮件 
    
    log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
    log4j.appender.MAIL.Threshold=FATAL 
    log4j.appender.MAIL.BufferSize=10 
    log4j.appender.MAIL.From=xxxxxxxx
    log4j.appender.MAIL.SMTPHost=smtp.qq.com
    log4j.appender.MAIL.SMTPUsername=xxxxxxxx
    log4j.appender.MAIL.SMTPPassword=xxxxxxxxxxxxxxxx
    log4j.appender.MAIL.Subject=Log4J Message错误日志发送 
    log4j.appender.MAIL.SMTPDebug=false
    log4j.appender.MAIL.To=xxxxxxxx@qq.com
    log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout 
    log4j.appender.MAIL.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
    
    
    
    # 用于数据库 
    log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender 
    log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
    log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
    log4j.appender.DATABASE.user=root
    log4j.appender.DATABASE.password=root
    log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n') 
    log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout 
    log4j.appender.DATABASE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
    
    # 每天建立日志
    log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender  
    log4j.appender.A1.File=dailyFile.log  
    log4j.appender.A1.Encoding=GBK  
    log4j.appender.A1.Threshold=DEBUG  
    log4j.appender.A1.DatePattern='.'yyyy-MM-dd  
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout  
    log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n 
    #自定义Appender 
    
    log4j.appender.CUNSTOM = com.ifengxy.loggerTest.appender.CustomAppender 
    
    log4j.appender.CUNSTOM.host = mail.cybercorlin.net 
    log4j.appender.CUNSTOM.userName = userName 
    log4j.appender.CUNSTOM.passWord = passWord 
    log4j.appender.CUNSTOM.recipient = corlin@cybercorlin.net 
    log4j.appender.CUNSTOM.layout=org.apache.log4j.PatternLayout 
    log4j.appender.CUNSTOM.layout.ConversionPattern =[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    4.配置文件详解

    使用log4j主要配置包括:

        1.日志记录器(Loggers):控制要输出哪些日志记录语句,对日志信息进行级别限制。

     在上面的配置文件中:log4j.rootLogger=DEBUG, CONSOLE, FILE      ----- 配置根Logger,等号后的第一个单词DEBUG代表输出等级(等级共有5种FATAL ERRORWARN INFO DEBUG,越往后输出越详细,按顺序每一个等级都包含前面的所有输出并屏蔽后面的所有输出。每在rootLogger配置一个输入目的地,那么就需要相应的后面定义这些目的地的定义。具体见示例。

        2.输出端(Appenders):指定了日志将打印到控制台还是文件中。Log4j提供的appender有以下几种:

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

        3.日志格式化器(Layout):控制日志信息的显示格式。

    log4j提供以下4种布局样式:
     org.apache.log4j.HTMLLayout(以HTML表格形式布局)
     org.apache.log4j.PatternLayout(可以灵活地指定布局模式,就是可以自定义输出样式),
     org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
     org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
    

      针对PatternLayout布局,我们可以通过灵活定制输出格式:log4j.appender.CONSOLE.layout.ConversionPattern=%d{MM-ddHH:mm:ss}[%c-%L][%t][%-4r] - %m%n  

    其中格式参数定义如下所示:

       %m 输出代码中指定的消息
      %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
      %r 输出自应用启动到输出该log信息耗费的毫秒数
      %c 输出所属的类目,通常就是所在类的全名
      %t 输出产生该日志事件的线程名
      %n 输出一个回车换行符,Windows平台为“
    ”,Unix平台为“
    ”,也就是一跳消息占用一行
      %d 输出日志时间点的日期或时间,紧跟一对花括号进行自定义格式
       %c 输出所属的类目,通常就是所在类的全名
       %l 精确到行
    %x 输出对齐
    

      

    5.配置输出到数据库

    配置如下:

    # 用于数据库
    log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
    log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
    log4j.appender.DATABASE.user=root
    log4j.appender.DATABASE.password=root
    log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
    log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
    log4j.appender.DATABASE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    需要配置的参数包括数据库地址,驱动名称,数据库的用户名以及密码!!需要注意是一定要添加数据库驱动jar包,我添加的是:mysql-connector-java-5.1.37.jar,这样才会起作用。sql表示向数据库中插入记录的语句,需要首先在数据库中建立相应的日志表,比如我的这个例子中表名是LOG4J ,字段是Message。

    6.配置日志发送到邮件

    配置如下:

    # 发送日志给邮件

    log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
    log4j.appender.MAIL.Threshold=FATAL
    log4j.appender.MAIL.BufferSize=10
    log4j.appender.MAIL.From=xxxxxxxx
    log4j.appender.MAIL.SMTPHost=smtp.qq.com
    log4j.appender.MAIL.SMTPUsername=xxxxxxxx
    log4j.appender.MAIL.SMTPPassword=xxxxxxxxxxxxxxxx
    log4j.appender.MAIL.Subject=Log4J Message错误日志发送
    log4j.appender.MAIL.SMTPDebug=false
    log4j.appender.MAIL.To=xxxxxxxx@qq.com
    log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
    log4j.appender.MAIL.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    参数需要:邮件的名称,服务地址,用户名,密码,还有就是邮件名称。需要注意的是一定要添加javamail的jar包。我添加的是:mail-1.4.jar。

    7.自定义输出

    7.1需要首先继承AppenderSkeleton,自定义所需要的输出Appender

    import org.apache.log4j.AppenderSkeleton;
    import org.apache.log4j.spi.LoggingEvent;
    
    public class CustomAppender extends AppenderSkeleton {
    	
    	private String userName;
    	private String host;
    	private String passWord;
    	private String recipient;
    
    	public void close() {
    		// TODO Auto-generated method stub
    		
    	}
    
    	public boolean requiresLayout() {
    		// TODO Auto-generated method stub
    		return false;
    	}
    
    	@Override
    	protected void append(LoggingEvent event) {
    		// TODO Auto-generated method stub
    		
    	}
    
    	public String getUserName() {
    		return userName;
    	}
    
    	public String getHost() {
    		return host;
    	}
    
    	public String getPassWord() {
    		return passWord;
    	}
    
    	public String getRecipient() {
    		return recipient;
    	}
    
    	public void setUserName(String userName) {
    		this.userName = userName;
    	}
    
    	public void setHost(String host) {
    		this.host = host;
    	}
    
    	public void setPassWord(String passWord) {
    		this.passWord = passWord;
    	}
    
    	public void setRecipient(String recipient) {
    		this.recipient = recipient;
    	}
    
    }
    

      7.2.配置文件配置

    #自定义Appender

    log4j.appender.CUNSTOM = com.ifengxy.loggerTest.appender.CustomAppender

    log4j.appender.CUNSTOM.host = mail.test.com
    log4j.appender.CUNSTOM.userName = userName
    log4j.appender.CUNSTOM.passWord = passWord
    log4j.appender.CUNSTOM.recipient =test
    log4j.appender.CUNSTOM.layout=org.apache.log4j.PatternLayout
    log4j.appender.CUNSTOM.layout.ConversionPattern =[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    上面对log4j的用法做了个简单的总结,其中涉及的知识点主要是在实战中用到的。并未涉及全面的知识点,也主要是工作需要用到的一些。接下来会对其他的日志系统做个简单说明。

  • 相关阅读:
    开始写游戏 --- 第十一篇
    开始写游戏 --- 第十篇
    开始写游戏 --- 第九篇
    CDN的原理以及其中的一些技术
    深入理解Redis主键失效原理及实现机制
    使用 Redis 实现分布式系统轻量级协调技术
    Redis实现分布式锁
    进程线程协程
    类加载机制
    消息队列
  • 原文地址:https://www.cnblogs.com/zhangminghui/p/4920773.html
Copyright © 2011-2022 走看看