如何加载指定路径的logback.xml 加载

君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
在测试类中加载logback的配置文件logback.xml
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口> 博客详情
摘要: 记录下
写出来还没用到
原本想在karaf 中使用logback 形式的配置文件 结过发现Pax-logger-api X 全部覆盖了 然后就是使用karaf 自身的log4j吧
public class SysLogInitActivator implements BundleActivator
public static final String KARAF_HOME = "karaf_home";
public static final String CONFIG_FILE = "syslog.xml";
public static final String logbackPropName = "logback.configurationFile";
public void start(BundleContext context) throws Exception
String logConfigPath = System.getProperty(logbackPropName);
if (logConfigPath == null || "".equals(logConfigPath))
String _karaf_home = System.getenv(KARAF_HOME);
if (_karaf_home == null || "".equals(_karaf_home))
throw new IllegalArgumentException(
"ERROR: Need Setting Environment Variables karaf_home");
System.out.println("INFO: system environment variables karaf_home is " + _karaf_home);
File logFile = new File(_karaf_home + File.separatorChar + "etc" + File.separatorChar
+ CONFIG_FILE);
if (!logFile.exists())
System.err.println("WARN: not log config file " + logFile.getAbsolutePath()
+ ", will use default.");
LoggerContext loggerContext = (LoggerContext) StaticLoggerBinder.getSingleton()
.getLoggerFactory();
loggerContext.reset();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(loggerContext);
configurator.doConfigure(logFile.getAbsoluteFile());
System.out.println("INFO: use log config " + logFile.getAbsolutePath());
System.out.println("INFO: use log config " + logConfigPath + " defined in JVM Param");
public void stop(BundleContext context) throws Exception
System.out.println("sys log bundle close");
指定加载 环境变量 Karaf 下 etc/syslog.xml 作为默认的日志配置, 如果用户通过虚拟机-logback.configurationFile 指定了配置文件, 那么syslog.xml 将失效
人打赏支持
码字总数 29265
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区如何加载指定路径的Logback.xml
如何加载指定路径的Logback.xml今天想外置logback.xml,谢了如下代码 File logbackFile = new File(./conf/logback.xml); if (logbackFile.exists()) { LoggerCon
今天想外置logback.xml,谢了如下代码
File logbackFile = new File("./conf/logback.xml");
if (logbackFile.exists()) {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
lc.reset();
configurator.doConfigure(logbackFile);
catch (JoranException e) {
e.printStackTrace(System.err);
System.exit(-1);
但是老师不按照策略输出,整了两小时,开始以为lc.reset()放错位置了,但是后来发现是我的JoranConfigurator这个类引用错了,正确的类路径是
ch.qos.logback.classic.joran.JoranConfigurator
但是我错误引用了
ch.qos.logback.access.joran.JoranConfigurator
哭死的节奏,debug到代码里面怎么就说没有处理contextName的Action,原来ch.qos.logback.access只处理基本的配置,上下文这个处理在logback-classic里面,究其原因是因为eclipse的自动提示,我下意识就选了第一个,这也算桑踹个检讨书吧.,
你最喜欢的1292人阅读
logback(1)
由于想统一处理所有模块下的日志文件, 不想每一个项目都来维护几乎一样的日志文件.就有这个想法.
百度搜索 &&logback properties& 找以一篇相关文章
文章意思使用下面即可解决.
logback载入外部properties文件
&property file=&xxx.properties& /&
&File&${FILE_PATH}/${xxx.property}/client_${byDay}.log&/File&
=====================
开始动手试试!
项目启动后发布加载不到根目录下的配置文件.
测试使用绝对路径是可能加载到配置文件.强迫症发作....
但是百度了些资料还是找不到相应文章...找到来去就前面百度找到的文章之外没了...
后来就从报没找到配置文件的日志源代码去找找看...
找到源代码找到对应的代码:
一开始发现是使用
FileInputStream
来加载文件...在那边郁闷半天,作者应该不至于把代码写这么死...应该不止这么支持才对...重新读了整个文件代码...发现 if 下来 else if 条件里面做的方案正是我想要的读取方案...
后面的话就没什么好说的咯....
来配置资源文件
最终搞定问题...
&property resource=&ydyx.properties& /&
一共有1位博乐进行推荐
发现问题解决问题,方法总比困难多,在实战中遇到问题,以博文的形式记录下来并分享,很好的习惯,继续加油。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:16650次
排名:千里之外
原创:22篇
评论:15条
(4)(2)(1)(2)(3)(1)(2)(2)(1)(2)(3)(1)Logback统一配置及环境变量加载问题 - 简书
Logback统一配置及环境变量加载问题
关键字: logback.xml in jar logback environment variable
最近实现了一下将logback.xml的配置统一在基础框架的jar包中,如此所有业务应用都不用关心日志的规范格式或者存放位置,只要做一下简单的配置即可。对于logback.xml与log4j的兼容或者适配问题,本文不做详细讨论。参见:
1. logback.xml配置
基本上也是主流配置,几个特别说明的点:
格式化的输出说明
Left pad with spaces if the logger name is less than 20 characters long.
%-20logger
Right pad with spaces if the logger name is less than 20 characters long.
%.30logger
Truncate from the beginning if the logger name is longer than 30 characters.
%20.30logger
Left pad with spaces if the logger name is shorter than 20 characters. However, if logger name is longer than 30 characters, then truncate from the beginning.
%-20.30logger
Right pad with spaces if the logger name is shorter than 20 characters. However, if logger name is longer than 30 characters, then truncate from the beginning.
%.-30logger
Truncate from the end if the logger name is longer than 30 characters.
%d表示日期,
%thread: 表示线程名
%level:日志级别
%msg:日志消息
%logger: Java类名(含包名,这里设定了36位,若超过36位,包名会精简为类似a.b.c.JavaBean)
%line: Java类的行号
NEUTRAL使用
因为正常日志和错误异常日志是拆分成两个文件的,所以在appender=FILE中如果使用ThresholdFilter配置的level是最低阀值(一般是INFO),ERROR也会进入到sys.log中,这时需要将ERROR过滤掉,设置Match Error 直接DENY, Mismatch Error则Neutral中立继续走下面的filter。
环境变量的使用
这里配置了大量的环境变量,比如log.path(日志的路径),app.name(应用名称),log.root.level(日志root级别)等,这些变量若在每个业务系统的本地,可以基于maven的profile filter resources进行变量替换即可,但是当前的设计是想将logback.xml放在一个公共组件的jar包内, 这个maven是无法替换jar包内文件的内容的。引申出我们下面的实现。(当然你可以使用一些maven plugin进行unzip,修改后再zip一把,实在太麻烦 &_&!)
&configuration&
&!--&statusListener class="ch.qos.logback.core.status.NopStatusListener" /&--&
&jmxConfigurator/&
&!-- 控制台输出 --&
&appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&
&encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"&
[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-36.36thread] [%-5level] [%-36.36logger{36}:%-4.4line] - %msg%n
&/pattern&
&/encoder&
&/appender&
&!-- 按照每天生成日志文件 --&
&appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"&
&file&${log.path}/${app.name}/sys.log&/file&
&!--拒绝ERROR日志--&
&filter class="ch.qos.logback.classic.filter.LevelFilter"&
&level&ERROR&/level&
&onMatch&DENY&/onMatch&
&onMisMatch&NEUTRAL&/onMisMatch&
&filter class="ch.qos.logback.classic.filter.ThresholdFilter"&
&level&${log.lowest.level}&/level&
&onMatch&ACCEPT&/onMatch&
&onMismatch&DENY&/onMismatch&
&rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&
&FileNamePattern&${log.path}/${app.name}/sys-%d{yyyy-MM-dd}-%i.log&/FileNamePattern&
&MaxHistory&90&/MaxHistory&
&TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&
&MaxFileSize&10MB&/MaxFileSize&
&/TimeBasedFileNamingAndTriggeringPolicy&
&/rollingPolicy&
&encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"&
[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-36.36thread] [%-5level] [%-36.36logger{36}:%-4.4line] - %msg%n
&/pattern&
&/encoder&
&/appender&
&appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"&
&file&${log.path}/${app.name}/sys-err.log&/file&
&filter class="ch.qos.logback.classic.filter.LevelFilter"&
&level&ERROR&/level&
&onMatch&ACCEPT&/onMatch&
&onMismatch&DENY&/onMismatch&
&rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"&
&FileNamePattern&${log.path}/${app.name}/sys-err-%d{yyyy-MM-dd}-%i.log&/FileNamePattern&
&MaxHistory&90&/MaxHistory&
&TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"&
&MaxFileSize&10MB&/MaxFileSize&
&/TimeBasedFileNamingAndTriggeringPolicy&
&/rollingPolicy&
&encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"&
&pattern&[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-36.36thread] [%-5level] [%-36.36logger{36}:%-4.4line] - %msg%n
&/pattern&
&/encoder&
&/appender&
&!-- show parameters for hibernate sql 专为 Hibernate 定制 --&
&logger name="org.hibernate.type.descriptor.sql.BasicBinder"
additivity="true" level="${log.hibernate.level}" /&
&logger name="org.hibernate.type.descriptor.sql.BasicExtractor" additivity="true" level="${log.hibernate.level}" /&
&logger name="org.hibernate.SQL"
additivity="true" level="${log.hibernate.level}" /&
&logger name="org.springframework"
additivity="true" level="${log.spring.level}"/&
&logger name="com.myown"
additivity="true" level="${log.root.level}"/&
&!-- 日志输出级别 --&
&root level="${log.root.level}"&
&appender-ref ref="STDOUT"/&
&appender-ref ref="FILE"/&
&appender-ref ref="FILE-ERROR"/&
&/configuration&
2. web.xml 监听器的实现
上面logback.xml里设置了大量的环境变量,而这些环境变量都必须在Web应用启动之前设置完毕。实现方式其实比较多:a. 第一种: 设置JVM的启动参数 -Dlog.path=/logs/app/ -Dlog.root.level=INFOb. 第二种:设置应用服务器的启动参数,比如tomcat,在bin文件夹下新增一个bat(windows)或者shell文件(linux),命名为setenv.bat/sh,
setenv.bat内容:
set log.path=/usr/local/src/logs/test
set log.root.level=INFO
c. 第三种:前两种处理方式都有些不妥的地方就是,开发人员pull代码之后无法直接部署tomcat运行,还需要添加setenv文件,容易遗漏;参数的设置不灵活:不能根据OS, 开发/测试/生产的环境变量动态调整log level或者log path。(其实,在不同环境下的tomcat只要设定一次启动参数,业务应用日后的部署都是一劳永逸的, 不排除以后采用第二种方案 ^_^)现,决定,通过监听器来实现。
监听器示例代码如下:
public class LogbackListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event) {
ServletContext sc = event.getServletContext();
//添加系统属性示例代码
if (mons.lang3.SystemUtils.IS_OS_WINDOWS) {
System.setProperty("log.path", "${CATALINA_HOME}" + SystemUtils.FILE_SEPARATOR + "logs");
} else {//linux
System.setProperty("log.path", "/logs");
if (isProductEnv) {
System.setProperty("log.root.level", "INFO");
} else {//非生产环境
System.setProperty("log.root.level", "DEBUG");
..........................
WebLogbackConfigurer.initLogging(sc);
public void contextDestroyed(ServletContextEvent event){
WebLogbackConfigurer.shutdownLogging(event.getServletContext());
web.xml添加监听器配置,该监听器的配置尽量位于第一位,至少保证在其他有可能使用日志打印的监听器之前。
············
&!--logback日志环境变量配置--&
&listener&
&listener-class&com.myown.framework.LogbackListener&/listener-class&
&/listener&
&!--Spring上下文--&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
············
3. TOMCAT + JNDI + Druid连接池的坑
因为某个核心系统期望能监控一下数据库连接方面的性能和请求情况,采用了开源连接池Druid, 在context.xml配置的jndi是这样的:
1. tomcat lib需添加mysql驱动 mysql-connector-java-5.1.38.jar
2. 添加 druid-1.0.16.jar
3. filter若使用log4j,tomcat lib需添加log4j.jar;若使用slf4j基于logback,需添加slf4j-api-1.7.13.jar
name="jndi/nicholas"
factory="com.alibaba.druid.pool.DruidDataSourceFactory"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/nicholas?useUnicode=true&characterEncoding=utf-8"
username="root"
password="root"
initialSize="10"
minIdle="10"
maxActive="50"
maxWait="10000"
timeBetweenEvictionRunsMillis="60000"
minEvictableIdleTimeMillis="300000"
removeabandoned="true"
removeabandonedtimeout="180"
logabandoned="true"
filters="stat,wall,slf4j"/&
具体druid的配置和使用就不详谈,注意最后的filters 配置了slf4j, 它的实现是基于web应用配置的logback,请看下图首次进入LoggerContext的调用链情况。其实此时的Tomcat启动优先加载了druid jndi连接池,而druid又需要打印日志,所以在我们的监听器初始化之前, logback的配置已经加载完毕了,而加载的logback.xml中的一堆变量都是undefined!问题粗线了!现在看起来好像前面的第一种或者第二种方法才行得通了。。。这尼玛!
应用启动首次进入LoggerContext的堆栈信息
一个开源组件的依赖会带来如此不堪忍受的问题,这个事件的教训就是设计一个越基础的组件越要减少对其他组件的依赖,不然会有各种升级或者兼容层面的潜在隐患
目前本人的解决方案是在刚才的 LogbackListener 监听器中重置logback上下文!
public void contextInitialized(ServletContextEvent event) {
//系统环境变量设置 System.setProperty()
..............
//进入Web之前判断是否已加载了Logger,若已加载需要重置!
if (loggerContext != null && loggerContext.getLoggerList().size() & 0) {
//必须清空一下,否则之前加载的logger堆栈信息还保留着StatusPrinter.print会打印出之前的状态
loggerContext.getStatusManager().clear();
loggerContext.reset();
ContextInitializer ci = new ContextInitializer(loggerContext);
ci.autoConfig();
} catch (JoranException e) {
sc.log("-=-=-= Reset Logback status Failed =-=-=- \n" + ExceptionUtil.getStackTrace(e));
WebLogbackConfigurer.initLogging(sc);
StatusPrinter.print(loggerContext);
4. 默认赋值问题
某些情况下需要变量设置个默认值,以防出现比较恶心的 _IS_UNDEFINED 后缀( log4j不存在的变量会留空)只要使用" :- " 操作符即可(冒号+减号)。比如 log.path 没有定义, 使用该变量的地方就会变成 log.path_IS_UNDEFINED, 给他一个默认值
${log.path:-/var/logs/myapp}
5. 注意事项
Spring的WARN日志无法打印出来
检查spring是否exclude自带的commons-logging 即 jcl jar包,并同时添加 jcl-over-slf4j的jar包,将其适配给slf4j
&dependency&
&groupId&org.springframework&/groupId&
&artifactId&spring-core&/artifactId&
&version&${spring.version}&/version&
&exclusions&
&exclusion&
&groupId&commons-logging&/groupId&
&artifactId&commons-logging&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&jcl-over-slf4j&/artifactId&
&/dependency&
Zookeeper/ZkClient等默认使用log4j的组件无法打印日志
需要exclude log4j包,并添加log4j-over-slf4j依赖 (注意 slf4j-log4j12 与 log4j-over-slf4j的环形依赖会导致异常)
&dependency&
&groupId&com.github.sgroschupf&/groupId&
&artifactId&zkclient&/artifactId&
&version&0.1&/version&
&exclusions&
&exclusion&
&groupId&log4j&/groupId&
&artifactId&log4j&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&!--zkClient和disconf都会依赖zookeeper,而zookeeper会依赖slf4j-log4j12和log4j,
在我们使用logback的情况下,需要将log4j转为logback,则需依赖log4j-over-slf4j。
slf4j-log4j12会与log4j-over-slf4j循环依赖导致冲突,
所以所有依赖zookeeper的jar必须exclude掉slf4j-log4j12--&
&dependency&
&groupId&org.apache.zookeeper&/groupId&
&artifactId&zookeeper&/artifactId&
&version&${zookeeper.version}&/version&
&exclusions&
&exclusion&
&groupId&log4j&/groupId&
&artifactId&log4j&/artifactId&
&/exclusion&
https://issues.apache.org/jira/browse/ZOOKEEPER-1371
zookeeper Remove dependency on log4j in the source code.
slf4j-log4j12会与log4j-over-slf4j循环依赖导致冲突
&exclusion&
&groupId&org.slf4j&/groupId&
&artifactId&slf4j-log4j12&/artifactId&
&/exclusion&
&/exclusions&
&/dependency&
&dependency&
&groupId&org.slf4j&/groupId&
&artifactId&log4j-over-slf4j&/artifactId&
&/dependency&

我要回帖

更多关于 java 加载logback.xml 的文章

 

随机推荐