26
26
</properties >
27
27
28
28
<body >
29
- <section name =" Logging " >
29
+ <section name =" 日志 " >
30
30
<p ></p >
31
- <p >
32
- Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:
31
+ <p >Mybatis 的内置日志工厂提供日志功能,内置日志工厂将日志交给以下其中一种工具作代理:
33
32
</p >
34
33
<ul >
35
34
<li >
48
47
JDK logging
49
48
</li >
50
49
</ul >
51
- <p >
52
- 具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。
53
- 如果一个都未找到,日志功能就会被禁用。
54
- </p >
55
- <p >
56
- 不少应用服务器的classpath中已经包含Commons Logging,如Tomcat和WebShpere,
57
- 所以MyBatis会把它作为具体的日志实现。记住这点非常重要。这将意味着,在诸如
58
- WebSphere的环境中——WebSphere提供了Commons Logging的私有实现,你的Log4J配置将被忽略。
59
- 这种做法不免让人悲催,MyBatis怎么能忽略你的配置呢?事实上,因Commons Logging已经存
60
- 在了,按照优先级顺序,Log4J自然就被忽略了!不过,如果你的应用部署在一个包含Commons Logging的环境,
61
- 而你又想用其他的日志框架,你可以通过在MyBatis的配置文件mybatis-config.xml里面添加一项setting(配置)来选择一个不同的日志实现。
62
- </p >
50
+ <p >MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具。它会使用第一个查找得到的工具(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。</p >
51
+ <p >不少应用服务器(如 Tomcat 和 WebShpere)的类路径中已经包含 Commons Logging,所以在这种配置环境下的 MyBatis 会把它作为日志工具,记住这点非常重要。这将意味着,在诸如 WebSphere 的环境中,它提供了 Commons Logging 的私有实现,你的 Log4J 配置将被忽略。MyBatis 将你的 Log4J 配置忽略掉是相当令人郁闷的(事实上,正是因为在这种配置环境下,MyBatis 才会选择使用 Commons Logging 而不是 Log4J)。如果你的应用部署在一个类路径已经包含 Commons Logging 的环境中,而你又想使用其它日志工具,你可以通过在 MyBatis 配置文件 mybatis-config.xml 里面添加一项 setting 来选择别的日志工具。</p >
63
52
<source ><![CDATA[ <configuration>
64
53
<settings>
65
54
...
68
57
</settings>
69
58
</configuration>]]>
70
59
</source >
71
- <p >
72
- logImpl可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING
73
- 或者是实现了接口<code >org.apache.ibatis.logging.Log</code >的类的完全限定类名,
74
- 并且这个类的构造函数需要是以一个字符串(String类型)为参数的。
75
- (可以参考org.apache.ibatis.logging.slf4j.Slf4jImpl.java的实现)
60
+ <p >logImpl 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了接口 <code >org.apache.ibatis.logging.Log</code > 的,且构造方法是以字符串为参数的类的完全限定名。(译者注:可以参考org.apache.ibatis.logging.slf4j.Slf4jImpl.java的实现)
76
61
</p >
77
- <p >
78
- 你根据需要调用如下的某一方法:
62
+ <p >你也可以调用如下任一方法来使用日志工具:
79
63
</p >
80
64
<source ><![CDATA[ org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
81
65
org.apache.ibatis.logging.LogFactory.useLog4JLogging();
82
66
org.apache.ibatis.logging.LogFactory.useJdkLogging();
83
67
org.apache.ibatis.logging.LogFactory.useCommonsLogging();
84
68
org.apache.ibatis.logging.LogFactory.useStdOutLogging();]]> </source >
85
- <p >如果的确需要调用以上的某个方法,请在其他所有MyBatis方法之前调用它。另外,只有在相应日志实现中存在
86
- 的前提下,调用对应的方法才是有意义的,否则MyBatis一概忽略。如你环境中并不存在Log4J,你却调用了
87
- 相应的方法,MyBatis就会忽略这一调用,代之默认的查找顺序查找日志实现。
88
- </p >
89
- <p >关于SLF4J、Apache Commons Logging、Apache Log4J和JDK Logging的API介绍已经超出本文档的范围。
90
- 不过,下面的例子可以作为一个快速入门。关于这些日志框架的更多信息,可以参考以下链接:
69
+ <p >如果你决定要调用以上某个方法,请在调用其它 MyBatis 方法之前调用它。另外,仅当运行时类路径中存在该日志工具时,调用与该日志工具对应的方法才会生效,否则 MyBatis 一概忽略。如你环境中并不存在 Log4J,你却调用了相应的方法,MyBatis 就会忽略这一调用,转而以默认的查找顺序查找日志工具。
91
70
</p >
71
+ <p >关于 SLF4J、Apache Commons Logging、Apache Log4J 和 JDK Logging 的 API 介绍不在本文档介绍范围内。不过,下面的例子可以作为一个快速入门。关于这些日志框架的更多信息,可以参考以下链接:</p >
92
72
<ul >
93
73
<li >
94
74
<a href =" http://commons.apache.org/logging" >Apache Commons Logging</a >
@@ -100,35 +80,31 @@ org.apache.ibatis.logging.LogFactory.useStdOutLogging();]]></source>
100
80
<a href =" http://java.sun.com/j2se/1.4.1/docs/guide/util/logging/" >JDK Logging API</a >
101
81
</li >
102
82
</ul >
103
- <subsection name =" Logging Configuration " >
104
- <p >MyBatis可以对包、类、命名空间和全限定的语句记录日志 。
83
+ <subsection name =" 日志配置 " >
84
+ <p >你可以对包、映射类的全限定名、命名空间或全限定语句名开启日志功能来查看 MyBatis 的日志语句 。
105
85
</p >
106
- <p >具体怎么做,视使用的日志框架而定,这里以Log4J为例。配置日志功能非常简单:添加几个配置文件,
107
- 如log4j.properties,再添加个jar包,如log4j.jar。下面是具体的例子,共两个步骤:
86
+ <p >再次说明下,具体怎么做,由使用的日志工具决定,这里以 Log4J 为例。配置日志功能非常简单:添加一个或多个配置文件(如 log4j.properties),有时需要添加 jar 包(如 log4j.jar)。下面的例子将使用 Log4J 来配置完整的日志服务,共两个步骤:
108
87
</p >
109
88
<p ></p >
110
89
<h4 >
111
- 步骤1: 添加 Log4J 的 jar 包
90
+ 步骤 1: 添加 Log4J 的 jar 包
112
91
</h4 >
113
- <p >因为采用Log4J,要确保在应用中对应的jar包是可用的。要满足这一点,只要将jar包添加到应用的classpath中即可。
114
- Log4J的jar包可以从上面的链接中下载。
92
+ <p >因为我们使用的是 Log4J,就要确保它的 jar 包在应用中是可用的。要启用 Log4J,只要将 jar 包添加到应用的类路径中即可。Log4J 的 jar 包可以在上面的链接中下载。
115
93
</p >
116
- <p >具体而言,对于web或企业应用,需要将<code >log4j.jar</code > 添加到<code >WEB-INF/lib</code > 目录; 对于独立应用,
117
- 可以将它添加到jvm的 <code >-classpath</code >启动参数中。
94
+ <p >对于 web 应用或企业级应用,则需要将 <code >log4j.jar</code > 添加到 <code >WEB-INF/lib</code > 目录下;对于独立应用,可以将它添加到JVM 的 <code >-classpath</code > 启动参数中。
118
95
</p >
119
96
<p ></p >
120
97
<h4 >
121
- 步骤2:配置Log4J
98
+ 步骤 2:配置 Log4J
122
99
</h4 >
123
- <p >配置Log4J比较简单, 比如需要记录这个mapper接口的日志:
124
- </p >
100
+ <p >配置 Log4J 比较简单,假如你需要记录这个映射器接口的日志:
101
+ </p >
125
102
<source ><![CDATA[ package org.mybatis.example;
126
103
public interface BlogMapper {
127
104
@Select("SELECT * FROM blog WHERE id = #{id}")
128
105
Blog selectBlog(int id);
129
106
}]]> </source >
130
- <p >只要在应用的classpath中创建一个名称为<code >log4j.properties</code >的文件,
131
- 文件的具体内容如下:
107
+ <p >在应用的类路径中创建一个名称为 <code >log4j.properties</code > 的文件,文件的具体内容如下:
132
108
</p >
133
109
<source ><![CDATA[ # Global logging configuration
134
110
log4j.rootLogger=ERROR, stdout
@@ -138,28 +114,22 @@ log4j.logger.org.mybatis.example.BlogMapper=TRACE
138
114
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
139
115
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
140
116
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n]]> </source >
141
- <p >添加以上配置后,Log4J就会把
142
- <code >org.mybatis.example.BlogMapper</code >
143
- 的详细执行日志记录下来,对于应用中的其它类则仅仅记录错误信息。
144
- </p >
145
- <p >也可以将日志从整个mapper接口级别调整到到语句级别,从而实现更细粒度的控制。如下配置只记录
146
- <code >selectBlog</code > 语句的日志:
117
+ <p >添加以上配置后,Log4J 就会记录 <code >org.mybatis.example.BlogMapper</code > 的详细执行操作,且仅记录应用中其它类的错误信息(若有)。</p >
118
+ <p >你也可以将日志的记录方式从接口级别切换到语句级别,从而实现更细粒度的控制。如下配置只对 <code >selectBlog</code > 语句记录日志:
147
119
</p >
148
120
149
121
<source >log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE</source >
150
122
151
- <p >与此相对,可以对一组mapper接口记录日志,只要对mapper接口所在的包开启日志功能即可 :</p >
123
+ <p >与此相对,可以对一组映射器接口记录日志,只要对映射器接口所在的包开启日志功能即可 :</p >
152
124
153
125
<source >log4j.logger.org.mybatis.example=TRACE</source >
154
126
155
- <p >某些查询可能会返回大量的数据,只想记录其执行的SQL语句该怎么办?为此,Mybatis中SQL语
156
- 句的日志级别被设为DEBUG(JDK Logging中为FINE),结果日志的级别为TRACE(JDK
157
- Logging中为FINER)。所以,只要将日志级别调整为DEBUG即可达到目的:
127
+ <p >某些查询可能会返回庞大的结果集,此时只想记录其执行的 SQL 语句而不想记录结果该怎么办?为此,Mybatis 中 SQL 语句的日志级别被设为DEBUG(JDK 日志设为 FINE),结果的日志级别为 TRACE(JDK 日志设为 FINER)。所以,只要将日志级别调整为 DEBUG 即可达到目的:
158
128
</p >
159
129
160
130
<source >log4j.logger.org.mybatis.example=DEBUG</source >
161
131
162
- <p >要记录日志的是类似下面的mapper文件而不是mapper接口又该怎么呢 ?
132
+ <p >要记录日志的是类似下面的映射器文件而不是映射器接口又该怎么做呢 ?
163
133
</p >
164
134
165
135
<source ><![CDATA[ <?xml version="1.0" encoding="UTF-8" ?>
@@ -172,23 +142,23 @@ log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n]]></source>
172
142
</select>
173
143
</mapper>]]> </source >
174
144
175
- <p >对这个文件记录日志 ,只要对命名空间增加日志记录功能即可:
145
+ <p >如需对 XML 文件记录日志 ,只要对命名空间增加日志记录功能即可:
176
146
</p >
177
147
178
148
<source >log4j.logger.org.mybatis.example.BlogMapper=TRACE</source >
179
149
180
- <p > 进一步,要记录具体语句的日志可以这样做:
181
- </p >
150
+ <p >要记录具体语句的日志可以这样做:</p >
182
151
183
152
<source >log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE</source >
184
153
185
- <p >看到了吧,两种配置没差别!
154
+ <p >你应该注意到了,为映射器接口和 XML 文件添加日志功能的语句毫无差别。
186
155
</p >
156
+
157
+ <p ><span class =" label important" >注意</span > 如果你使用的是 SLF4J 或 Log4j 2,MyBatis 将以 MYBATIS 这个值进行调用。</p >
187
158
188
- <p >配置文件<code >log4j.properties</code >的余下内容是针对日志格式的,这一内容已经超出本
189
- 文档范围。关于Log4J的更多内容,可以参考Log4J的网站。不过,可以简单试一下看看,不同的配置
190
- 会产生什么不一样的效果。
159
+ <p >配置文件 <code >log4j.properties</code > 的余下内容是针对日志输出源的,这一内容已经超出本文档范围。关于 Log4J 的更多内容,可以参考Log4J 的网站。不过,你也可以简单地做做实验,看看不同的配置会产生怎样的效果。
191
160
</p >
161
+
192
162
</subsection >
193
163
</section >
194
164
</body >
0 commit comments