Slf4j + logback 配置怎么过滤掉第三方包中的日志显示

slf4j+logback使用 - 咫尺天涯 - ITeye技术网站
博客分类:
一 环境配置: XP+JDK1.5+Myeclipse6.6
二 各组件的官方网址:
&& slf4j:
&& logback:
&& log4j.properties 转换为 logback.xml 工具页面
&&
三 项目文件:
参考资料
Java日志框架:SLF4J, Apache Common-Logging, Log4J和Logback
SLF4J 的几种实际应用模式--之一:SLF4J+Log4J
SLF4J 的几种实际应用模式--之二:SLF4J+Logback
Logback 分为三个模块:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身实现了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日志实现,如原始的 Log4J,java.util.logging 等;logback-access 让你方便的访问日志信息,如通过 http 的方式。
需要的配置文件和组件包,下面三个 jar 文件和一个 xml文件都是要放在项目的 ClassPath 上。
slf4j-api-1.6.1.jar
logback-classic-0.9.24.jar
logback-core-0.9.24.jar
四 示例代码:摘自slf4j
class Bar {
Logger logger = LoggerFactory.getLogger(Bar.class);
public void doIt() {
logger.debug("doing my job");
import org.slf4j.L
import org.slf4j.LoggerF
import ch.qos.logback.classic.LoggerC
import ch.qos.logback.classic.joran.JoranC
import ch.qos.logback.core.joran.spi.JoranE
import ch.qos.logback.core.util.StatusP
public class MyAppWithConfigFile {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(MyAppWithConfigFile.class);
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
lc.reset();
configurator.setContext(lc);
// configurator.doConfigure("E:/testworkspace/SLF4J/src/chapters/architecture/sample-config-2.xml");
[color=red]configurator.doConfigure(MyAppWithConfigFile.class
.getResourceAsStream("sample-config-3.xml"));[/color]
} catch (JoranException je) {
StatusPrinter.print(lc.getStatusManager());
("Entering application.");
Bar bar = new Bar();
bar.doIt();
("Exiting application.");
logger.warn("WARN...");
logger.error("ERROR...");
&?xml version="1.0" encoding="UTF-8" ?&
&configuration&
&!-- 声明变量 --&
&substitutionProperty name="log.base" value="./logs/hzg" /&
&appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&
&layout class="ch.qos.logback.classic.PatternLayout"&
&pattern&%-4relative [%thread] %-5level %class - %msg%n&/pattern&
&/appender&
&appender name="FILE" class="ch.qos.logback.core.FileAppender"&
&layout class="ch.qos.logback.classic.PatternLayout"&
&pattern&%-4relative [%thread] %-5level %class - %msg%n&/pattern&
&File&${log.base}.log&/File&
&/appender&
&logger name="chapters.architecture" level="error" /&
&root level="debug"&
&appender-ref ref="STDOUT" /&
&appender-ref ref="FILE" /&
&/configuration&
其中红色地方可以设置日志文件的存储位置,如是WEB应用程序可在Servlet中进行相应设置
&logger name="chapters.architecture" level="error" /&
这个可以设置对应包下面所要显示的日志级别
附件是slf4j的示例代码及所有相关.jar文件
下载次数: 290
浏览: 806337 次
来自: 成都
很不错,谢谢!
写得不错,thx楼主!
为什么不能下载源码?
找了许久,终于找到一个可以运行的,不乱码的,晕……
谢了1、使用slf4j和logback输出日志到控制台_CentOS6.2永恒静态路由的配置_CMS引见-收藏__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
1、使用slf4j和logback输出日志到控制台
CentOS6.2永恒静态路由的配置
CMS引见-收藏
1、使用slf4j和logback输出日志到控制台
一、使用slf4j和logback输出日志到控制台
一、使用slf4j和logback输出日志到控制台二、使用slf4j和logback输出日志到文件三、使用slf4j和logback输出日志到文件(滚动)slf4j是Java的简单日志门面API,很多日志实现都可以与之集成,如JDK logging (java.util.logging), log4j和logback。优点是代码里不会有具体的日志实现类,减少侵入。与log4j相比,logback具有一些优势,如更好的性能、更少的内存使用、自动重加载配置文件以及过滤功能等。下面简要介绍下logback的使用:1. 在pom.xml文件中添加依赖:
&properties&
&logback.version&1.0.11&/logback.version&
&slf4j.api.version&1.7.5&/slf4j.api.version&
&/properties&
&dependencies&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&slf4j-api&/artifactId&
&version&${slf4j.api.version}&/version&
&/dependency&
&dependency&
&groupId&ch.qos.logback&/groupId&
&artifactId&logback-classic&/artifactId&
&version&${logback.version}&/version&
&/dependency&
&dependency&
&groupId&ch.qos.logback&/groupId&
&artifactId&logback-core&/artifactId&
&version&${logback.version}&/version&
&/dependency&
&/dependencies&
2. 在类路径下新建logback.xml或logback-test.xml(优先级高)文件:
&?xml version="1.0" encoding="UTF-8"?&
&configuration&
&appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&
&!-- encoder的默认实现类是ch.qos.logback.classic.encoder.PatternLayoutEncoder --&
&pattern&%d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n&/pattern&
&/encoder&
&/appender&
&!-- name属性可以是包名或者具体的类名 --&
&logger name="com.john.logging.b" level="INFO"&
&appender-ref ref="STDOUT" /&
&!-- root的默认level是DEBUG --&
&root level="DEBUG"&
&appender-ref ref="STDOUT" /&
&/configuration&
3. 测试类:
package com.john.logging.a;
public class Reconciliation {
private static final Logger log = LoggerFactory.getLogger(Reconciliation.class);
public void reconciliate() {
String name = "conciliate";
("Hello from reconciliate");
log.debug("My name is {}", name);
package com.john.logging.b;
public class Corruption {
// logger名称为类的全限定名
private static final Logger log = LoggerFactory.getLogger(Corruption.class);
public void corrupt() {
String name = "allegation";
("Hello from corrupt.");
log.debug("My name is {}", name);
输出:11:50:16.266 [main] INFO
c.j.l.a.Reconciliation - Hello from reconciliate11:50:16.270 [main] DEBUG c.j.l.a.Reconciliation - My name is conciliate11:50:16.271 [main] INFO
c.j.l.b.Corruption - Hello from corrupt.11:50:16.271 [main] INFO
c.j.l.b.Corruption - Hello from corrupt.所有logger的始祖是ROOT,默认会继承ROOT的配置,因此Corruption中的日志会打印两次。解决:logger的additivity属性设置为false
&logger name="com.john.logging.b" level="INFO" additivity="false"&
CentOS6.2永恒静态路由的配置
CentOS6.2永久静态路由的配置
第一种就是这个route-int,内容简单明了:$DST_NET via $GW_IP $DST_HOST via $GW_IP第二种是/etc/sysconfig/static-routes any net $DST_NET gw $GW_IP any host $DST_HOST gw $GW_IP第一种超级简单,但多网卡需要多配置文件 第二种稍微复杂,但只需要一个配置文件
/content/13/74.shtml
在使用双网卡,同时使用2个网关的时候就需要加一条静态路由了。当然还有很多时候会需要加路由。操作系统版本centos-6.4 64bit 一:使用route 命令添加1、使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了,方法://添加到主机的路由# route add –host 192.168.1.11 dev eth0# route add –host 192.168.1.12 gw 192.168.1.1
//添加到网络的路由
# route add –net 192.168.1.11 netmask 255.255.255.0 dev eth0# route add –net 192.168.1.11 netmask 255.255.255.0 gw 192.168.1.1# route add –net 192.168.1.0/24 dev eth1
//添加默认网关
# route add default gw 192.168.2.1
//删除路由
# route del –host 192.168.1.11 dev eth0
2、还可以使用ip命令来添加、删除路由ip route add default via 172.16.10.2 dev eth0ip route add 172.16.1.0/24 via 172.16.10.2 dev eth0
格式如下:ip route default via gateway dev interfaceip/netmask via
gateway dev interface
二:在linux下设置永久路由的方法:
1.在/etc/rc.local里添加
方法:route add -net 192.168.3.0/24 dev eth0route add -net 192.168.2.0/24 gw 192.168.2.254
2.在/etc/sysconfig/network里添加到末尾
方法:GATEWAY=gw-ip或者GATEWAY=gw-dev
3./etc/sysconfig/static-routes :any net 192.168.3.0/24 gw 192.168.3.254any net 10.250.228.128 netmask 255.255.255.192 gw 10.250.228.129
如果在rc.local中添加路由会造成NFS无法自动挂载问题,所以使用static-routes的方法是最好的。无论重启系统和service network restart 都会生效。
解决NFS问题的描述:
按照linux启动的顺序,rc.local里面的内容是在linux所有服务都启动完毕,最后才被执行的,也就是说,这里面的内容是在netfs之后才被执行的,那也就是说在netfs启动的时候,服务器上的静态路由是没有被添加的,所以netfs挂载不能成功。4、在/etc/sysconfig/network-script/route-interface下添加路由(每个接口一个文件,如果没有就创建一个,只能添加针对该接口的路由)
格式如下:network/prefix via gateway dev intf
例如给eth0添加一个默认网关:vim /etc/sysconfig/network-scripts/route-eth0
#添加如下内容(可以省略dev eth0)0.0.0.0/0 via 172.16.10.2 dev eth0
ps:注意这里的掩码是0而不是32,因为这里是网段而不是路由。
保存退出后,service network restart。
使用route -n或netstat -r查看路由表。
[root@localhost ~]# route -nKernel IP routing tableDestination
Flags Metric Ref
Use Iface172.16.10.0
255.255.255.0
0 eth0192.168.122.0
255.255.255.0
0 virbr0169.254.0.0
255.255.0.0
0 eth00.0.0.0
172.16.10.2
默认路由已经被添加到路由表里面了。
注意如果有两块网卡,需要设置默认路由才能访问internet。
所有添加静态路由的方法在centos6.4上面均经过验证,正确无误。本文参考了互联网上面的一些资料。如果转载请注明出处,谢谢合作!
CMS引见-收藏
CMS介绍--收藏
转自:/topic/1119491
1.总体介绍:
CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。
2.CMS过程:
初始标记(STW initial mark)
并发标记(Concurrent marking)
并发预清理(Concurrent precleaning)
重新标记(STW remark)
并发清理(Concurrent sweeping)
并发重置(Concurrent reset)
初始标记 :在这个阶段,需要虚拟机停顿正在执行的任务,官方的叫法STW(Stop The Word)。这个过程从垃圾回收的"根对象"开始,只扫描到能够和"根对象"直接关联的对象,并作标记。所以这个过程虽然暂停了整个JVM,但是很快就完成了。
并发标记 :这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿。
并发预清理 :并发预清理阶段仍然是并发的。在这个阶段,虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对象被分配到老年代)。通过重新扫描,减少下一个阶段"重新标记"的工作,因为下一个阶段会Stop The World。
重新标记 :这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从"跟对象"开始向下追溯,并处理对象关联。
并发清理 :清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行。
并发重置 :这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收。
CSM执行过程:
CMS回收器采用的基础算法是Mark-Sweep。所有CMS不会整理、压缩堆空间。这样就会有一个问题:经过CMS收集的堆会产生空间碎片。 CMS不对堆空间整理压缩节约了垃圾回收的停顿时间,但也带来的堆空间的浪费。为了解决堆空间浪费问题,CMS回收器不再采用简单的指针指向一块可用堆空 间来为下次对象分配使用。而是把一些未分配的空间汇总成一个列表,当JVM分配对象空间的时候,会搜索这个列表找到足够大的空间来hold住这个对象。
需要更多的CPU资源。从上面的图可以看到,为了让应用程序不停顿,CMS线程和应用程序线程并发执行,这样就需要有更多的CPU,单纯靠线程切 换是不靠谱的。并且,重新标记阶段,为空保证STW快速完成,也要用到更多的甚至所有的CPU资源。当然,多核多CPU也是未来的趋势!
CMS的另一个缺点是它需要更大的堆空间。因为CMS标记阶段应用程序的线程还是在执行的,那么就会有堆空间继续分配的情况,为了保证在CMS回 收完堆之前还有空间分配给正在运行的应用程序,必须预留一部分空间。也就是说,CMS不会在老年代满的时候才开始收集。相反,它会尝试更早的开始收集,已 避免上面提到的情况:在回收完成之前,堆没有足够空间分配!默认当老年代使用68%的时候,CMS就开始行动了。 – XX:CMSInitiatingOccupancyFraction =n 来设置这个阀值。
总得来说,CMS回收器减少了回收的停顿时间,但是降低了堆空间的利用率。
4.啥时候用CMS
如果你的应用程序对停顿比较敏感,并且在应用程序运行的时候可以提供更大的内存和更多的CPU(也就是硬件牛逼),那么使用CMS来收集会给你带来好处。还有,如果在JVM中,有相对较多存活时间较长的对象(老年代比较大)会更适合使用CMS。
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:、、 全是以同一个人为首的团伙搞出来的(日志专业户!),这几个各有所长,log4j性能相对最差,log4j2性能不错,但是目前跟mybatis有些犯冲(log4j2的当前版本,已经将AbstractLoggerWrapper更名成ExtendedLoggerWrapper,但是mybatis 2.3.7依赖的仍然是旧版本的log4j2,所以mybatis使用log4j2会报错),说到日志,还要注意另一外项目( java的世界里,记日志的组件真是多!),SLF4J只一个接口标准,并不提供实现(就好象JSF/JPA 与 RichFaces/Hibernate的关系类似),而LogBack是SLF4J的一个实现,下面介绍logback的基本用法
一、基本用法
1.1 maven依赖项
&!-- log --&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&slf4j-api&/artifactId&
&version&1.7.7&/version&
&/dependency&
&dependency&
&groupId&ch.qos.logback&/groupId&
&artifactId&logback-core&/artifactId&
&version&1.1.2&/version&
&/dependency&
&dependency&
&groupId&ch.qos.logback&/groupId&
&artifactId&logback-classic&/artifactId&
&version&1.1.2&/version&
&/dependency&
1.2 配置文件logback.xml
1 &?xml version="1.0" encoding="UTF-8" ?&
2 &configuration scan="true" scanPeriod="1800 seconds"
debug="false"&
&property name="USER_HOME" value="logs" /&
&property scope="context" name="FILE_NAME" value="mylog-logback" /&
&timestamp key="byDay" datePattern="yyyy-MM-dd" /&
&appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&
&pattern&%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
&/pattern&
&/encoder&
&/appender&
&appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender"&
&file&${USER_HOME}/${FILE_NAME}.log&/file&
&rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"&
&fileNamePattern&${USER_HOME}/${byDay}/${FILE_NAME}-${byDay}-%i.log.zip
&/fileNamePattern&
&minIndex&1&/minIndex&
&maxIndex&10&/maxIndex&
&/rollingPolicy&
&triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"&
&maxFileSize&5MB&/maxFileSize&
&/triggeringPolicy&
&pattern&%-4relative [%thread] %-5level %logger{35} - %msg%n
&/pattern&
&/encoder&
&/appender&
&logger name="blogs.yjmyzz.App2" level="debug" additivity="true"&
&appender-ref ref="file" /&
&!-- &appender-ref ref="STDOUT" /& --&
&root level="info"&
&appender-ref ref="STDOUT" /&
47 &/configuration&
1.3 示例程序跟前面log4j2的示例程序几乎完全一样:
1 package blogs.
3 import org.slf4j.*;
5 public class App2 {
static Logger logger = LoggerFactory.getLogger(App2.class);
public static void main(String[] args) {
for (int i = 0; i & 100000; i++) {
logger.trace("trace message " + i);
logger.debug("debug message " + i);
("info message " + i);
logger.warn("warn message " + i);
logger.error("error message " + i);
System.out.println("Hello World! 2");
运行后,会在当前目录下创建logs目录,生成名为mylog-logback.log的日志文件,该文件体积&5M后,会自动创建 yyyy-mm-dd的目录,将历史日志打包生成类似:mylog-logback--1.log.zip 的压缩包,每天最多保留10个
二、与spring -mvc的集成&
2.1 maven依赖项&
注:${springframework.version},我用的是3.2.8.RELEASE 版本
1 &!-- Spring --&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-beans&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-context&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-web&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-webmvc&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-expression&/artifactId&
&version&${springframework.version}&/version&
&/dependency&
&!-- logback --&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&slf4j-api&/artifactId&
&version&1.7.7&/version&
&/dependency&
&dependency&
&groupId&ch.qos.logback&/groupId&
&artifactId&logback-core&/artifactId&
&version&1.1.2&/version&
&/dependency&
&dependency&
&groupId&ch.qos.logback&/groupId&
&artifactId&logback-classic&/artifactId&
&version&1.1.2&/version&
&/dependency&
&!-- Servlet --&
&dependency&
&groupId&javax.servlet&/groupId&
&artifactId&servlet-api&/artifactId&
&version&2.5&/version&
&scope&provided&/scope&
&/dependency&
2.2 web.xml里增加下面的内容
1 &!-- logback-begin --&
&context-param&
&param-name&logbackConfigLocation&/param-name&
&param-value&classpath:logback.xml&/param-value&
&/context-param&
&listener&
&listener-class&</blogs.yjmyzz.util.LogbackConfigListener&/listener-class&
&/listener&
&!-- logback-end --&
其中blogs.yjmyzz.util.LogbackConfigListener 是自己开发的类,代码如下:(从网上掏来的)
注:该处理方式同样适用于struts 2.x
1 package blogs.yjmyzz.
3 import javax.servlet.ServletContextE
4 import javax.servlet.ServletContextL
6 public class LogbackConfigListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
LogbackWebConfigurer.initLogging(event.getServletContext());
public void contextDestroyed(ServletContextEvent event) {
LogbackWebConfigurer.shutdownLogging(event.getServletContext());
LogbackConfigListener
1 package blogs.yjmyzz.
3 import java.io.FileNotFoundE
5 import javax.servlet.ServletC
7 import org.springframework.util.ResourceU
8 import org.springframework.util.SystemPropertyU
9 import org.springframework.web.util.WebU
11 public abstract class LogbackWebConfigurer {
/** Parameter specifying the location of the logback config file */
public static final String CONFIG_LOCATION_PARAM = "logbackConfigLocation";
* Parameter specifying the refresh interval for checking the logback config
public static final String REFRESH_INTERVAL_PARAM = "logbackRefreshInterval";
/** Parameter specifying whether to expose the web app root system property */
public static final String EXPOSE_WEB_APP_ROOT_PARAM = "logbackExposeWebAppRoot";
* Initialize logback, including setting the web app root system property.
* @param servletContext
the current ServletContext
* @see WebUtils#setWebAppRootSystemProperty
public static void initLogging(ServletContext servletContext) {
// Expose the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.setWebAppRootSystemProperty(servletContext);
// Only perform custom logback initialization in case of a config file.
String location = servletContext
.getInitParameter(CONFIG_LOCATION_PARAM);
if (location != null) {
// Perform actual lo else rely on logback's
// default initialization.
// Return a URL (e.g. "classpath:" or "file:") as-
// consider a plain file path as relative to the web application
// root directory.
if (!ResourceUtils.isUrl(location)) {
// Resolve system property placeholders before resolving
// real path.
location = SystemPropertyUtils
.resolvePlaceholders(location);
location = WebUtils.getRealPath(servletContext, location);
// Write log message to server log.
servletContext.log("Initializing logback from [" + location
// Initialize without refresh check, i.e. without logback's
// watchdog thread.
LogbackConfigurer.initLogging(location);
} catch (FileNotFoundException ex) {
throw new IllegalArgumentException(
"Invalid 'logbackConfigLocation' parameter: "
+ ex.getMessage());
* Shut down logback, properly releasing all file locks and resetting the
* web app root system property.
* @param servletContext
the current ServletContext
* @see WebUtils#removeWebAppRootSystemProperty
public static void shutdownLogging(ServletContext servletContext) {
servletContext.log("Shutting down logback");
LogbackConfigurer.shutdownLogging();
} finally {
// Remove the web app root system property.
if (exposeWebAppRoot(servletContext)) {
WebUtils.removeWebAppRootSystemProperty(servletContext);
* Return whether to expose the web app root system property, checking the
* corresponding ServletContext init parameter.
* @see #EXPOSE_WEB_APP_ROOT_PARAM
private static boolean exposeWebAppRoot(ServletContext servletContext) {
String exposeWebAppRootParam = servletContext
.getInitParameter(EXPOSE_WEB_APP_ROOT_PARAM);
return (exposeWebAppRootParam == null || Boolean
.valueOf(exposeWebAppRootParam));
LogbackWebConfigurer
1 package blogs.yjmyzz.
3 import java.io.F
4 import java.io.FileNotFoundE
5 import java.net.URL;
7 import org.slf4j.LoggerF
8 import org.springframework.util.ResourceU
9 import org.springframework.util.SystemPropertyU
11 import ch.qos.logback.classic.LoggerC
12 import ch.qos.logback.classic.joran.JoranC
13 import ch.qos.logback.core.joran.spi.JoranE
15 public abstract class LogbackConfigurer {
/** Pseudo URL prefix for loading from the class path: "classpath:" */
public static final String CLASSPATH_URL_PREFIX = "classpath:";
/** Extension that indicates a logback XML config file: ".xml" */
public static final String XML_FILE_EXTENSION = ".xml";
private static LoggerContext lc = (LoggerContext) LoggerFactory
.getILoggerFactory();
private static JoranConfigurator configurator = new JoranConfigurator();
* Initialize logback from the given file location, with no config file
* refreshing. Assumes an XML file in case of a ".xml" file extension, and a
* properties file otherwise.
* @param location
the location of the config file: either a "classpath:"
location (e.g. "classpath:mylogback.properties"), an absolute
file URL (e.g.
"file:C:/logback.properties), or a plain absolute path in the file system (e.g. "
C:/logback.properties")
* @throws FileNotFoundException
if the location specifies an invalid file path
public static void initLogging(String location)
throws FileNotFoundException {
String resolvedLocation = SystemPropertyUtils
.resolvePlaceholders(location);
URL url = ResourceUtils.getURL(resolvedLocation);
if (resolvedLocation.toLowerCase().endsWith(XML_FILE_EXTENSION)) {
// DOMConfigurator.configure(url);
configurator.setContext(lc);
lc.reset();
configurator.doConfigure(url);
} catch (JoranException ex) {
throw new FileNotFoundException(url.getPath());
lc.start();
// PropertyConfigurator.configure(url);
* Shut down logback, properly releasing all file locks.
* This isn't strictly necessary, but recommended for shutting down logback
* in a scenario where the host VM stays alive (for example, when shutting
* down an application in a J2EE environment).
public static void shutdownLogging() {
lc.stop();
* Set the specified system property to the current working directory.
* This can be used e.g. for test environments, for applications that
* leverage logbackWebConfigurer's "webAppRootKey" support in a web
* environment.
* @param key
system property key to use, as expected in logback
configuration (for example: "demo.root", used as
"${demo.root}/WEB-INF/demo.log")
* @see org.springframework.web.util.logbackWebConfigurer
public static void setWorkingDirSystemProperty(String key) {
System.setProperty(key, new File("").getAbsolutePath());
LogbackConfigurer
2.3 JBOSS EAP 6+ 的特殊处理
jboss 默认已经集成了sf4j模块,会与上面新加的3个类有冲突,app启动时会报错:
&java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
所以,需要手动排除掉jboss默认的slf4j模块,在web-inf下创建名为jboss-deployment-structure.xml的文件,内容如下:
1 &?xml version="1.0" encoding="UTF-8"?&
2 &jboss-deployment-structure&
&deployment&
&exclusions&
&module name="org.slf4j" /&
&module name="org.slf4j.impl" /&
&module name="org.slf4j.jcl-over-slf4j" /&
&module name="org.slf4j.ext" /&
&/exclusions&
&/deployment&
11 &/jboss-deployment-structure&
2.4 最后将logback.xml放到resouces目录下即可(打包后,会自动复制到classpath目录下)
阅读(...) 评论()}

我要回帖

更多关于 logback 配置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信