Java 日志记录 log4j 最简明教程

最近在搞一个项目架设,希望从构建一个项目方方面面都彻底研究透,增长实战经验。  
今天先研究一下日志的构建,这里选择了log4j--java方面比较流行的log框架,功能  
很强大,使用起来也很方便了  
 
      废话少说,先看看一个史上最简单的log例子,看看我是如何用最简洁的设计实现将异常  
等信息写入日志文件的。  
 
项目文件结构  
--------TestLog  
           |----src  
           |     |-com/janeky/log/Log.java  
           |     |-log4j.properties  
           |----bin  
           |     |-com/janeky/log/Log  
           |----lib  
           |     |-log4j-1.2.11.jar  
 
 
Eclipse新建一个java project TestLog  
新建一个com.janeky.log包  
导入log4j的jar包  
包里新建一个Log.java  


package com.janeky.log;     
import org.apache.log4j.Logger;     
import org.apache.log4j.PropertyConfigurator;     
    
/**   
* @author janeky   
* Log演示程序   
*/    
public class Log {     
    //Logger实例     
    private Logger loger;     
    //将Log类封装成单实例的模式,独立于其他类。以后要用到日志的地方只要获得Log的实例就可以方便使用     
    private static Log log;     
    //构造函数,用于初始化Logger配置需要的属性     
    private Log()     
    {     
        //获得当前目录路径     
        String filePath=this.getClass().getResource("/").getPath();     
        //找到log4j.properties配置文件所在的目录(已经创建好)     
        filePath=filePath.substring(1).replace("bin", "src");     
        //获得日志类loger的实例     
        loger=Logger.getLogger(this.getClass());     
        //loger所需的配置文件路径     
        PropertyConfigurator.configure(filePath+"log4j.properties");     
    }     
         
    static Log getLoger()     
    {     
        if(log!=null)     
            return log;     
        else    
            return new Log();     
    }     
         
    //测试函数     
    public static void main(String args[])     
    {     
        Log log=Log.getLoger();     
        try    
        {     
            //引发异常     
            int a=2/0;     
        }catch(Exception e)     
        {     
            //控制台打印异常信息     
            e.printStackTrace();     
            //写入到日子文件     
            log.loger.error("error", e);     
                 
        }     
    }     
    
}


package com.janeky.log;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * @author janeky Log演示程序
 */
public class Log {
	// Logger实例
	private Logger loger;
	// 将Log类封装成单实例的模式,独立于其他类。以后要用到日志的地方只要获得Log的实例就可以方便使用
	private static Log log;

	// 构造函数,用于初始化Logger配置需要的属性
	private Log() {
		// 获得当前目录路径
		String filePath = this.getClass().getResource("/").getPath();
		// 找到log4j.properties配置文件所在的目录(已经创建好)
		filePath = filePath.substring(1).replace("bin", "src");
		// 获得日志类loger的实例
		loger = Logger.getLogger(this.getClass());
		// loger所需的配置文件路径
		PropertyConfigurator.configure(filePath + "log4j.properties");
	}

	static Log getLoger() {
		if (log != null)
			return log;
		else
			return new Log();
	}

	// 测试函数
	public static void main(String args[]) {
		Log log = Log.getLoger();
		try {
			// 引发异常
			int a = 2 / 0;
		} catch (Exception e) {
			// 控制台打印异常信息
			e.printStackTrace();
			// 写入到日子文件
			log.loger.error("error", e);

		}
	}

}


在src文件夹中新建一个文本文档 log4j.properties 


#定义DEBUG优先级,R为日志输出目的的    
log4j.rootLogger=DEBUG, R    
#设置日志输出类型,为文件类型    
log4j.appender.R=org.apache.log4j.FileAppender    
#设置日志文件名my.log    
log4j.appender.R.file=my.log    
#每次在文件尾写入新的日志信息    
log4j.appender.R.Append=true   
#日志输出信息格式类型    
log4j.appender.R.layout=org.apache.log4j.PatternLayout    
#日志输出信息格式为 换行、换行、日期、优先级、[类名]、日志信息、换行    
log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n   
#定义DEBUG优先级,R为日志输出目的的  
log4j.rootLogger=DEBUG, R  
#设置日志输出类型,为文件类型  
log4j.appender.R=org.apache.log4j.FileAppender  
#设置日志文件名my.log  
log4j.appender.R.file=my.log  
#每次在文件尾写入新的日志信息  
log4j.appender.R.Append=true 
#日志输出信息格式类型  
log4j.appender.R.layout=org.apache.log4j.PatternLayout  
#日志输出信息格式为 换行、换行、日期、优先级、[类名]、日志信息、换行  
log4j.appender.R.layout.ConversionPattern=%n%n%d%p[%c]-%m%n  


运行吧,出错了,恭喜你成功了,去TestLog目录下寻找my.log日志信息吧  
 
 
以后再任何需要记录日志的地方只要使用下面语句就行了  
Log log= Log.getLogger();  
log.logger.error("something u like to record");  
 
记录日志就是这么简单,不过你可以有其他的需要:  
 
我要将日志发到邮箱  
我要将日志写到数据库  
我要每天的日志自动归档  
……  
 
这些都可以通过修改配置log4j.properties配置文件来实现  
以下是配置文件的语法  
 
 
1. log4j.rootLogger = [level],appenderName,appenderName...  
其中,level是日志记录的优先级,从高到低分别为FATAL ERROR WARN INFO DEBUG 。当  
你定义一个级别,只有等于或者高于这个基本的才进行处理。 可选的All打印所有日志,OFF  
关闭所有日志输出。  
appenderName用于指定日志信息输出目的地,可以指定多个  
 
2.配置appender  
 
类型有以下几种  
org.apache.log4j.jdbc.JDBCAppender 存入数据库  
org.apache.log4j.net.SMTPAppender  发送到指定邮箱  
net.cybercorlin.util.logger.appender.IMAppender 自定义类型  
org.apache.log4j.ConsoleAppender 控制台  
org.apache.log4j.FileAppender 文件  
org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件  
org.apache.log4j.RollingFileAppender 文件达到指定大小的时候产生一个新的文件  
org.apache.log4j.WriterAppender 将日志信息以流格式发送到任意指定的地方  
*************可以参照文章后面从网上摘抄的例子************  
 
3.配置日志信息格式Layout  
有以下几种  
org.apache.log4j.HTMLLayout HTML表格形式  
org.apache.log4j.PatternLayout 自定义的布局(下面将见到这么自定义配置)  
org.apache.log4j.SimpleLayout 只包含日志信息基本和信息的字符信息  
org.apache.log4j.TTCCLayout   包括日志产生时间、线程、类别等信息  
 
4.自定义的布局中用到的格式化日志信息  
采用跟C语言中printf的方式,参数有  
%m 输出代码中指定的信息 如 log.error("error")  
%p 输出优先级 就是上面提到的DEBUG,INFO等  
%c 输出所在类的全名  
%r 输出自应用启用到输出该log信息耗费的时间(毫秒)  
%t 输出产生该日子事件的线程名  
%n 输出换行符号 Windows平台为 "rn",unix平台“n"  
%d 输出日志时间点 默认格式是ISO8601 可以自定义格式,比如%d{yyy MM dd hh:mm:ss,sss}  
 
在程序中使用log4j  
记住,很简单,就两步骤,相信我,没错的:)  
 
 
1.导入包  
import org.apache.log4j.Logger;  
import org.apache.log4j.PropertyConfigurator;  
 
 
2.获取log实例  
Logger logger = Logger.getLogger  
 
 
3配置log4j.properties  
PropertyConfigurator.configure(log4j2.properties路径);  
 
就这些了,没了,谢谢观看,有什么意见尽管说  
 
********************从网上摘抄的一些配置实例*********************  
http://hi.baidu.com/yitao/blog/item/7e6a0bd1740ce1d2562c8410.html  
 
      log4j.rootLogger=DEBUG,CONSOLE,A1,im  
      #DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE  
      log4j.addivity.org.apache=true 
     
      ###################  
      # Console Appender  
      ###################  
      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=[framework] %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  
     
      #####################  
      # File Appender  
      #####################  
      log4j.appender.FILE=org.apache.log4j.FileAppender  
      log4j.appender.FILE.File=file.log  
      log4j.appender.FILE.Append=false 
      log4j.appender.FILE.layout=org.apache.log4j.PatternLayout  
      log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n  
      # Use this layout for LogFactor 5 analysis  
     
      ########################  
      # Rolling File  
      ########################  
      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=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n  
     
      ####################  
      # Socket Appender  
      ####################  
      log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender  
      log4j.appender.SOCKET.RemoteHost=localhost  
      log4j.appender.SOCKET.Port=5001 
      log4j.appender.SOCKET.LocationInfo=true 
      # Set up for Log Facter 5 
      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  
     
      ########################  
      # Log Factor 5 Appender  
      ########################  
      log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender  
      log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 
     
      ########################  
      # SMTP Appender  
      #######################  
      log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender  
      log4j.appender.MAIL.Threshold=FATAL  
      log4j.appender.MAIL.BufferSize=10 
      [email protected]  
      log4j.appender.MAIL.SMTPHost=mail.hollycrm.com  
      log4j.appender.MAIL.Subject=Log4J Message  
      [email protected]  
      log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout  
      log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n  
     
      ########################  
      # JDBC Appender  
      #######################  
      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=  
      log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')  
      log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout  
      log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n  
     
      log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender  
      log4j.appender.A1.File=SampleMessages.log4j  
      log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' 
      log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout  
      ###################  
      #自定义Appender  
      ###################  
      log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender  
      log4j.appender.im.host = mail.cybercorlin.net  
      log4j.appender.im.username = username  
      log4j.appender.im.password = password  
      log4j.appender.im.recipient = [email protected]  
      log4j.appender.im.layout=org.apache.log4j.PatternLayout  
      log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n  
     
      log4j.properties配置文件讲解如下:  
      # Set root logger level to DEBUG and its only appender to A1  
      #log4j中有五级logger  
      #FATAL 0 
      #ERROR 3 
      #WARN 4 
      #INFO 6 
      #DEBUG 7 
      配置根Logger,其语法为:  
      #log4j.rootLogger = [ level ] , appenderName, appenderName, …  
      log4j.rootLogger=INFO, A1 ,R  
      #这一句设置以为着所有的log都输出  
      #如果为log4j.rootLogger=WARN, 则意味着只有WARN,ERROR,FATAL  
      #被输出,DEBUG,INFO将被屏蔽掉.  
      # A1 is set to be a ConsoleAppender.  
      #log4j中Appender有几层如控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等  
      #ConsoleAppender输出到控制台  
      log4j.appender.A1=org.apache.log4j.ConsoleAppender  
      # A1 使用的输出布局,其中log4j提供4种布局.  
 
      #org.apache.log4j.HTMLLayout(以HTML表格形式布局)  
      #org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
      #org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
      #org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)  
      log4j.appender.A1.layout=org.apache.log4j.PatternLayout  
      #灵活定义输出格式 具体查看log4j javadoc org.apache.log4j.PatternLayout  
      #d 时间 ....  
      log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n  
      #R 输出到文件 RollingFileAppender的扩展,可以提供一种日志的备份功能。  
      log4j.appender.R=org.apache.log4j.RollingFileAppender  
      #日志文件的名称  
      log4j.appender.R.File=log4j.log  
      #日志文件的大小  
      log4j.appender.R.MaxFileSize=100KB  
      # 保存一个备份文件  
      log4j.appender.R.MaxBackupIndex=1 
 
      log4j.appender.R.layout=org.apache.log4j.TTCCLayout  
      #log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n  
     
      配置根Logger,其语法为:  
      log4j.rootLogger = [ level ] , appenderName, appenderName, ...  
      level 是日志记录的优先级  
      appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。  
      配置日志信息输出目的地Appender,其语法为  
     
      log4j.appender.appenderName = fully.qualified.name.of.appender.class 
      log4j.appender.appenderName.option1 = value1  
      ...  
      log4j.appender.appenderName.option = valueN  
      Log4j提供的appender有以下几种:  
      org.apache.log4j.ConsoleAppender(控制台),  
      org.apache.log4j.FileAppender(文件),  
      org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),  
      org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),  
      org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)  
      配置日志信息的格式(布局),其语法为:  
     
      log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
      log4j.appender.appenderName.layout.option1 = value1  
      ....  
      log4j.appender.appenderName.layout.option = valueN  
      Log4j提供的layout有以下几种:  
      org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
      org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
      org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
      org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)  
      
 
 
简化spring中的事务管理配置  
      xml代码:  
<bean id="proxyService"
	class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
	<property name="transactionManager">
		<ref local="myTransactionManager" />
	</property>
	<property name="target">
		<ref local="itemService" />
	</property>
	<property name="transactionAttributes">
		<props>
			<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
			<prop key="add*">PROPAGATION_REQUIRED</prop>
			<prop key="update*">PROPAGATION_REQUIRED</prop>
			<prop key="delete*">PROPAGATION_REQUIRED</prop>
			<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
		</props>
	</property>
</bean>
<bean id="itemService" class="com.xxx.services.IServiceImpl">
	<property name="itemMasterDAO">
		<ref local="itemMasterDAO" />
	</property>
</bean>

     
      系统中有多个service,但我们的事务策略大部分都是一样的,难道非要每个service都要写一个这样的代理配置么?当然不是..  
      看下面代码:  
      xml代码:  
<!-- Transactional proxy for the services -->
<bean id="baseTxProxy" lazy-init="true"
	class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
	<property name="transactionManager">
		<ref bean="transactionManager" />
	</property>
	<property name="transactionAttributes">
		<props>
			<prop key="*">PROPAGATION_REQUIRED</prop>
		</props>
	</property>
</bean>
<bean id="itemService" parent="baseTxProxy">
	<property name="target">
		<bean class="ItemServiceImpl" autowire="byName" />
	</property>
</bean>

你可能感兴趣的:(java,apache,C++,c,log4j)