Loading...
My Blog 我的工作和学习笔记

MySQL存储引擎中的MyISAM和InnoDB区别详解

程序员笔记 2017/03/06 MySQL

MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。

MyISAM与InnoDB的区别是什么?

1、 存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

2、 存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3、 可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

4、 事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

5、 AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

6、 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

7、 全文索引

MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

8、 表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

9、 表的具体行数

MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

10、 CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

11、 外键

MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。


文章来自:

http://www.jb51.net/article/62457.htm

Mysql提示Can’t connect to local MySQL server through socket的解决方法

程序员笔记 2017/01/12

mysql使用mysql -u root -p登录时提示如下信息:

Can’t connect to local MySQL server through socket

解决办法如下:

http://www.aiezu.com/db/mysql_cant_connect_through_socket.html


附带MySQL修改root密码的方法:

http://www.cnblogs.com/cuikang/p/5977800.html


参考资料来源网上,此处仅做记录

Mysql 会导致锁表的语法

程序员笔记 2016/09/13 MySQL

测试环境:Mysql 5.5 基于innodb 引擎


[sql] plain copy

  1. insert into  table1 values select  … from table2 …. 

    此种方法,会锁table2

[sql] view plain copy

  1. delete table1  from table1 inner join table2  on table1.id=table2.id  …  

      此种方法,会锁table2

[sql] view plain copy

  1. update tabel1,table2 set table1.name=’feie’ where table1.id=table2.id  

    此种方法,会锁table2

[sql] view plain copy

  1. update tabel1,table2 set table1.name=’feie’ where table1.id=table2.id and table1.id=1;  

    此种方法,会锁table2.id=1的记录

-----------------------------------------第二次编辑分割线--------------------------------------

假设kid 是表table 的 一个索引字段 且值不唯一
1.如果kid 有多个值为12的记录那么:
update table  set name=’feie’ where kid=12;  
会锁表


2.如果kid有唯一的值为1的记录那么:
update table  set name=’feie’ where kid=1;  
不会锁


总结:用索引字段做为条件进行修改时, 是否表锁的取决于这个索引字段能否确定记录唯一,当索引值对应记录不唯一,会进行锁表,相反则行锁。


如果有两个delete

kid1 与 kid2是索引字段
语句1 delete from table where  kid1=1 and kid2=2;
语句2 delete from table where  kid1=1 and kid2=3;
这样的两个delete 是不会锁表的


语句1 delete from table where  kid1=1 and kid2=2;
语句2 delete from table where  kid1=1 ;
这样的两个delete 会锁表
总结:同一个表,如果进行删除操作时,尽量让删除条件统一,否则会相互影响造成锁表


参考文档

http://blog.csdn.net/yonghumingbuzhidao/article/details/8330795


JAVA企业级项目开发约定

程序员笔记 2016/08/23

在现有的软件开发方法中,我们通常使用的是敏捷的软件开发方法,对团队在开发过程中整体协调性要求很高, 在开发过程中约定好开发规则,有利于项目统一性、持续性、扩张性,本着约定优于开发的原则,项目开发需要遵循如下开发规则:

1、类的命名:大写字母开头,遵循驼峰标示

模块名称

Article、RabbitmqLog

 

包约定

实体:entity

数据传输类:dto

持久层:dao

业务层:service

视图层:web

WEB服务:webservice

工具utils

通用common

其他:rabbitmq、mina、quartz

 

类约定

持久类:ArticleDao、ArticleDaoImpl、RabbitmqLogDao

业务类:ArticleService、ArticleServiceImpl

视图类:ArticleController、RabbitmqLogController

方法约定

getById();

getByNameAndId(String name,Long id)

getList();

getPage()

save();

update();

checkUsername();

isUnique(Sring name);

 

文件夹约定

以模块名称来命名:

cms

article

channel

index

login


 

页面约定

rabbitmq-log.jsp

rabbitmq-log-detail.jsp

article.jsp

article-input.jsp

article-detail.jsp

article-update.jsp

数据库表名称:系统名称_模块名称_实体名称

ticket_product

ticket_order_product

ticket_order_product_parent

ticket_product

 

 

类注释:

/**

 * TicketInventorReceiveService.java

 *

 * @author Ethan Wong

 * @since JDK 1.7

 * @datetime 2016年3月17日下午1:56:11

 */


方法注释:

    /**

     * 

     * @param entity

     * @param inventoryId

     * @return

     *

     * @author Ethan Wong

     * @datetime 2016年3月17日下午1:56:28

     */


内部属性注释:

public class Article{

    private String title;//标题

    private String content;//名称

    ...

    getter and setter

}

 

静态属性注释:

public class Constant{

  /**

     * 是否发送短信

     */

    public static final Boolean IS_SEND_SMS = true;

}

 

代码编程约定,在保证业务逻辑的前提下,提高代码可读性

1、变量名称的名称可以通过字面意思理解,不可简写

2、尽量缩短变量的作用域

3、需要使用变量是才声明

4、优先处理错误情况,并且返回错误信息

5、if  else 嵌套尽量不超过3层,超过部分抽象封装独立方法

6、相同业务的代码不可多处编写,封装通用业务代码

7、保证代码的阅读顺序为由上至下,而不是上下跳着阅读

8、代码需要持续重构,实现代码最优,不可以完成业务功能为结束目标


Windows下使用jdk工具keytool生成证书

程序员笔记 2016/01/30 JAVA基础

打开控制台进入JDK安装目录下的bin目录:这里是“D:\Program Files\Java\jdk1.7.0_51\bin”

基本操作

1、创建一个证书
指定证书库为 D:/keystore,创建别名为 tomcat70 的一条证书,它指定用 RSA 算法生成,且指定密钥长度为 1024,证书有效期为 1 年:

keytool -genkey -alias tomcat70 -keyalg RSA -keysize 1024 -keystore D:/keystore -validity 365


2、显示证书库中的证书使用如下命令:  将显示 D:/keystore 证书库的的所有证书列表

keytool -list -keystore D:/keystore


3、导出到证书文件
使用命令:keytool -export -alias tomcat70 -file D:/tomcat70.cer -keystore D:/keystore 将把证书库D:/keystore 中的别名为 tomcat70 的证书导出到 tomcat70.cer 证书文件中,它包含证书主体的信息及证书的公钥,不包括私钥,可以公开。
导出的证书文件是以二进制编码文件,无法用文本编辑器正确显示,可以加上 -rfc参数以一种可打印的编者编码输出。 如:

keytool -export -alias tomcat70 -file D:/tomcat70.cer -keystore D:/keystore –rfc


4、查看证书的信息
通过命令: keytool -printcert -file D:/tomcat70.cer 可以查看证书文件的信息。 也可以在 Windows 资源管理器中双击产生的证书文件直接查看。

keytool -printcert -file D:/tomcat70.cer


5、删除密钥库中的条目
keytool -delete -alias tomcat70 -keystore D:/keystore
这条命令将 D:/keystore 库中的 tomcat70 这一条证书删除了。

keytool -delete -alias tomcat70 -keystore D:/keystore


6、修改证书条目口令
keytool -keypasswd -alias tomcat70 -keystore D:/keystore,可以以交互的方式修改 D:/keystore 证书库中的条目为 tomcat70 的证书。
Keytool -keypasswd -alias tomcat70 -keypass oldpasswd -new newpasswd -storepass storepasswd -keystore D:/keystore 这一行命令以非交互式的方式修改库中别名为 tomcat70 的证书的密码为新密码 newpasswd,行中的 oldpasswd 是指该条证书的原密码, storepasswd 是指证书库的密码。

Keytool -keypasswd -alias tomcat70 -keypass oldpasswd -new newpasswd -storepass storepasswd -keystore D:/keystore


基础知识

-genkey      在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书 
-alias       产生别名
-keystore    指定密钥库的名称(产生的各类信息将不在.keystore文件中
-keyalg      指定密钥的算法    
-validity    指定创建的证书有效期多少天
-keysize     指定密钥长度
-storepass   指定密钥库的密码
-keypass     指定别名条目的密码
-dname       指定证书拥有者信息 例如:  "CN=sagely,OU=atr,O=szu,L=sz,ST=gd,C=cn"
-list        显示密钥库中的证书信息      keytool -list -v -keystore sage -storepass ....
-v           显示密钥库中的证书详细信息
-export      将别名指定的证书导出到文件  keytool -export -alias caroot -file caroot.crt
-file        参数指定导出到文件的文件名
-delete      删除密钥库中某条目          keytool -delete -alias sage -keystore sage
-keypasswd   修改密钥库中指定条目口令    keytool -keypasswd -alias sage -keypass .... -new .... -storepass ... -keystore sage
-import      将已签名数字证书导入密钥库  keytool -import -alias sage -keystore sagely -file sagely.crt 
             导入已签名数字证书用keytool -list -v 以后可以明显发现多了认证链长度,并且把整个CA链全部打印出来。

------------------------------------------------------------------------------------------------

keytool JAVA是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据 完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。通过keytool –help查看其用法,详细信息可以参考http: //java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html 

Java中的 keytool.exe (位于 JDK/Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中的一条证书包含该条证书的私钥,公钥和对应的 数字证书的信息。证书库中的一条证书可以导出数字证书文件,数字证书文件只包括主体信息和对应的公钥。 
每一个证书库是一个文件组成,它有访问密码,在首次创建时,它会自动生成证书库,并要求指定访问证书库的密码。 
在创建证书的的时候,需要填写证书的一些信息和证书对应的私钥密码。这些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它们的意思是: 
? CN(Common Name - 名字与姓氏):其实这个“名字与姓氏”应该是域名,比如说localhost或是blog.devep.net之类的。输成了姓名,和真正运行的时候域名 不符,会出问题。浏览器访问时,弹出一个对话框,提示“安全证书上的名称无效,或者与站点名称不匹配”,用户选择继续还是可以浏览网页。但是用http client写程序访问的时候,会抛出类似于“javax.servlet.ServletException: HTTPS hostname wrong: should be ”的异常。 
? OU(Organization Unit - 组织单位名称) 
? O(Organization - 组织名称) 
? L(Locality - 城市或区域名称) 
? ST(State - 州或省份名称) 
? C(Country - 国家名称) 
可以采用交互式让工具提示输入以上信息,也可以采用参数,如:-dname “CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx”来自动创建。


参考文档

http://deanandbai-gmail-com.iteye.com/blog/1538749

持续集成工具Jenkins安装配置(Jenkins、SVN、MAVEN、Tomcat )

程序员笔记 2016/01/15 持续集成 , Tomcat

开篇说明

持续集成工具可以使项目的构建、测试和部署等自动化,为软件开发节省大量的时间,这里主要简单介绍MAC下安装Jenkins,并且新建一个构建MAVEN的项目,使用SVN进行源码管理,构建成功后,安装部署到Tomcat 7.x。


环境准备

1、安装好JDK并且配置好环境变量,这里略过

2、安装好MAVEN并且配置好环境变量,这里略过

3、安装好Tomcat并且配置好端口和管理用户权限和角色

下载“apache-tomcat-7.0.67-windows-x64.zip”解压为“apache-tomcat-7.0.67”

编辑“conf/tomcat-users.xml”,配置管理员账号和权限

<role rolename="manager-gui"/>
<role rolename="manager-script"/>    
<role rolename="manager-jmx"/>    
<role rolename="manager-status"/>    
<user username="admin" password="123456" roles="manager-gui"/>  
<user username="tomcat" password="123456" roles="manager-script,manager-jmx,manager-status"/>

由于Jenkins默认安装的端口是8080,所有这里需要修改Tomcat的端口为7777

编辑“conf/server.xml”

<Connector port="7777" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"


具体步骤

1、访问http://jenkins-ci.org/下载适合自己操作系统的版本的安装包。

MAC下载安装“jenkins-1.644.pkg”,浏览器打开:http://localhost:8080,显示Jenkins表示安装成功。


2、默认安装的Jenkins没有自带“Deploy to container Plugin”插件,所里这里需要安装这个插件,在Jenkins首页进入到“系统管理”-》“插件管理”-》“可选插件”,选择“Deploy to container Plugin”并且安装。


3、进行“系统管理”-》“系统配置”

    1)Maven Configuration

    2)Maven -》 Maven安装

    3)邮件通知


4、在Jenkins首页新建一个“构建一个maven项目”的项目

   1)源码管理配置:svn://localhost/svn-repository/appone

   2)构建触发器 Poll SCM : */5 * * * *    //5分钟执行一次

   3)构建后操作 构建成功后部署到Tomcat


其他说明

1、mac下使用如下命令可以进行Jenkins的启动和关闭

sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist


2、mac下默认安装的Jenkins的目录是“/Users/Shared/Jenkins/Home”



参考文档

http://jenkins-ci.org/

http://www.cnblogs.com/itech/archive/2011/11/23/2260009.html

Tomcat使用Redis缓存实现分布式Session共享

程序员笔记 2016/01/15 Tomcat , Redis

前置场景描述

    在两台linux服务器上分别安装Tomcat,并且部署相同的WEB应用,通过前置服务器的nginx反向代理,达到这两个Tomcat的负载均衡的目的,实现分布式部署;当发生单点故障或者临时停机,nginx会将用户当前访问的WEB应用切换到其他正常服务器到应用上,这个时候如果session不同步,则会导致用户会话超时,提示再次登录的现象,会给用户产生非常不好的体验。

所以出现了Tocmat Session共享的课题,用于解决session不同步,应用切换时会话超时的问题。

    Tomcat Session共享的实现方式有多种,例如使用memcache、mongodb、redis等,本文主要针对使用redis来实现Tomcat的Session共享。


实际操作步骤

1、访问https://github.com/jcoleman/tomcat-redis-session-manager/releases ,下载"1.2-tomcat-7-java-7.zip"并解压后将项目导入Eclipse,构建成功,并且导出“tomcat-redis-session-manager-1.2-tomcat-7.jar”


2、将如下jar包放到tomcat的lib目录下

tomcat-redis-session-manager-1.2-tomcat-7.jar

commons-pool2-2.2.jar

jedis-2.5.2.jar

tomcat-juli-7.0.27.jar


3、编辑tomcat配置文件context.xml,加入如下内容

    <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
    <Manager className="com.radiadesign.catalina.session.RedisSessionManager"
         host="localhost" 
         port="6379" 
         database="0" 
         maxInactiveInterval="60" 
         />


这里使用的是本机默认安装的redis


4、启动tomcat并且访问应用,查看redis缓存内容如下

127.0.0.1:6379> get 33B32CE273EE4375C78B75CD8BE684DA
"\xac\xed\x00\x05sr\x00Ncn.zblink.framework.redis.session.manager.tomcat7.SessionSerializationMetadata\xdea\xb1\n\x9a\xcdn\xff\x03\x00\x01[\x00\x15sessionAttributesHasht\x00\x02[Bxpw\x14\x00\x00\x00\x10V\x1b\x96:\xe1r\x97_m'k\xbb\xca\xeb\x0e\x1axsr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01RDC\"\x02sq\x00~\x00\x03\x00\x00\x01RDC\"\x02sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x04\x00\x00\a\bsr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x01q\x00~\x00\nsq\x00~\x00\x03\x00\x00\x01RDC\"\x03t\x00 33B32CE273EE4375C78B75CD8BE684DAsq\x00~\x00\a\x00\x00\x00\x01t\x00\x15justForSessionTestKeyq\x00~\x00\x0ew\b\x00\x00\x01RDC\"\x02"
127.0.0.1:6379>


参考文档:

https://github.com/jcoleman/tomcat-redis-session-manager

org.quartz.SchedulerException: Couldn't get host name! [See nested exception: java.net.UnknownHostException:

程序员笔记 2016/01/12 Quartz , Linux , Nginx

hostname没有指向IP地址,编辑/etc/hosts,将hostname指向127.0.0.1即可

vi /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1   ticket.centerB


Redis常用命令速查

程序员笔记 2016/01/06 Redis

Spring项目整合Logback日志框架

程序员笔记 2015/12/29 Spring Framework , 日志框架

1、加入maven依赖

  <!-- logback begin  --> 
               <dependency>               
                        <groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.1.3</version>
		</dependency>
		<dependency>
			<groupId>org.logback-extensions</groupId>
			<artifactId>logback-ext-spring</artifactId>
			<version>0.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>1.7.12</version>
		</dependency>
		<!-- logback end  -->

第一个logback-classic包含了logback本身所需的slf4j-api.jar、logback-core.jar及logback-classsic.jar

第二个logback-ext-spring是由官方提供的对Spring的支持,它的作用就相当于log4j中的Log4jConfigListener;这个listener,网上大多都是用的自己实现的,原因在于这个插件似乎并没有出现在官方文档的显要位置导致大多数人并不知道它的存在

第三个jcl-over-slf4j是用来把Spring源代码中大量使用到的commons-logging替换成slf4j,只有在添加了这个依赖之后才能看到Spring框架本身打印的日志,否则只能看到开发者自己打印的日志


2、日志配置文件"log/logback.xml"

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

	<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="${user.dir}" />

	<!-- 控制台输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder charset="UTF-8">
			<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
			<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
		</encoder>
	</appender>
	
	<!-- 按照每天生成日志文件 -->
	<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_HOME}/logs/system.log</file>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<!--日志文件输出的文件名-->
			<fileNamePattern>${LOG_HOME}/logs/system.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
		</encoder>
	</appender>
	
	<appender name="businessLogFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${LOG_HOME}/logs/system_business.log</file>
		<!-- 按每小时滚动文件,如果一个小时内达到10M也会滚动文件, 滚动文件将会压缩成zip格式 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${LOG_HOME}/logs/system_business_%d{yyyy-MM-dd_HH}.%i.zip</fileNamePattern>
			<!--日志文件最大的大小-->
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
			<!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
		</rollingPolicy>
		<!-- 独立的pattern -->
		<encoder charset="UTF-8">
			<pattern>%d{HH:mm:ss.SSS},%msg%n</pattern>
		</encoder>
	</appender>
	
	<!-- business log 使用独立的appender,不继承Root的appender -->
	<logger name="business" level="INFO" additivity="false">
		<appender-ref ref="businessLogFile" />
	</logger>

	<!-- 日志输出级别 -->
	<root level="DEBUG">
		<appender-ref ref="console" />
		<appender-ref ref="rollingFile" />
		<appender-ref ref="businessLogFile" />
	</root>
	
	<!-- 下面配置一些第三方包的日志过滤级别,用于避免刷屏,additivity属性为false,表示此loger的打印信息不再向上级传递,默认为true -->
    <logger name="org.hibernate" level="error" additivity="false" />
    <logger name="org.springframework" level="error" additivity="false" />
    <logger name="com.opensymphony" level="WARN" />
    <logger name="org.apache" level="info" />
    <logger name="java.sql.Connection" level="DEBUG" />
    <logger name="java.sql.Statement" level="DEBUG" />
    <logger name="java.sql.PreparedStatement" level="DEBUG" />
	
</configuration>


3、web.xml配置文件添加如下内容配置

	<!-- logback监听配置,context-param必须独立配置 -->
	<context-param>
    	<param-name>logbackConfigLocation</param-name>
    	<param-value>classpath:log/logback.xml</param-value>
	</context-param>
	<listener>
    	<listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
	</listener>

注意,该配置文件必须放在<context-param>...</context-param>配置文件之后,如果没有会导致Logback找不到自定义的配置文件,而使用默认的配置文件,从而导致配置没有生效


参考文档:

http://logback.qos.ch/

http://blog.csdn.net/sadfishsc/article/details/47160213