一个项目中对log4j和logback都有强依赖的情况怎样使用slf4j?

owen1759 2015-07-17 11:40:07
公司的一个项目,为了使程序不依赖具体的日志实现,我选择了使用slf4j打日志,但却发现没有打到日志文件里去。
但是发现公司项目中引用的两个基础包居然分别直接依赖log4j和直接依赖logback的,也就意味着如果我把其中任何一个去掉,都会导致项目跑不起来。然而这两个基础包是公司的开发框架里的,工程浩大,所以意味着不可能对其再进行任何改造。
现在我只不过想指定一下让slf4j优先调用log4j实现,有什么办法可以对其进行设置么?
也许会有人说,你想用log4j就直接用log4j呗,反正你的项目离了log4j也运行不起来。但是我不想就因为这个原因,让这种对具体日志实现的依赖,像传染病一样传染下去。
...全文
936 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
owen1759 2015-08-03
  • 打赏
  • 举报
回复
额~好吧,我绕了个圈又绕回来了,还是老老实实用log4j吧~
owen1759 2015-07-28
  • 打赏
  • 举报
回复
或许把logback包里的StaticLoggerBinder类抠掉能达到目的?反正这个类的存在也仅仅是提供给slf4j绑定用的,把它抠掉应该不会影响到直接调用logback的代码,却可以戳瞎slf4j的眼睛。 大家觉得这个可行不? 写完才想起,jar包是maven管理的,我就算把本地的改了,也改不到服务器上去,然并卵…
owen1759 2015-07-28
  • 打赏
  • 举报
回复
引用 12 楼 nickycheng 的回复:
呵呵,你说的对,没有logback-over-slf4j,想不到有任何理由不用logback而去使用log4j实现。 系统里已有直接使用 logback 记录日志的情况下,没有方法再去改变了,唯有接受现实
想不到的理由却现实存在着: 其一、这个项目不是我一个人的项目,我也不是领导,只能负责我自己这一个模块,所以我不可能给我的模块单独弄个配置文件。 其二、项目开发出来是要多个实例分布部署的,所以专门有个服务管制程序负责下发特定的配置文件,所以我就算单独弄个配置文件也不起作用。 所以我觉得如果能通过配置文件(或者依赖注入也行)在并存的情况下给它指定一个优先绑定的,那就最好了。(话说在提供多个实现时随机绑定一个本来就不是一个好的设计嘛,很少有框架会设计成这样,大部分对于多个实现都是采取优先级的方式。)
迷林 2015-07-28
  • 打赏
  • 举报
回复
看完了所有的评论,我觉得楼主是在绕圈,公司底层用的就是log4和loback 到你这就完全改变了,万一这你模块出现问题导致整个项目的运行,倒时候就你有哭的了,所以了 楼主想法是好的,但是你没有站在全局的地方去考虑整个问题,这世界上有很多你想改变的东西,但是有时候不是你说能改变就能改变的,当然这只是我的一面之词,一点点建议。。。
owen1759 2015-07-27
  • 打赏
  • 举报
回复
引用 10 楼 nickycheng 的回复:
我没有理解错,倒是觉得你对slf4j的理解有些误区。 首先我假设你公司的那2个基础包没有直接把log4j logback的jar和配置直接集成在里面,只是使用了它们的api。(应该不会那么傻直接把第三方jar直接嵌入基础包里吧) 你在自己的项目里引用基础包,并依赖以下几个 slf4j-api logback-classic, logback-core log4j-over-slf4j (maven里一定要排除掉log4j,保证项目lib里没有log4j) jcl-over-slf4j(maven里一定要排除掉log4j,保证项目lib里没有commong logging) 按logback方式配日志配置文件,这样整个项目的日志都经过slf4j,包括基础包里的那些直接用log4j api的代码。
楼上的朋友,关键问题就在于我不想以logback的方式配日志文件,我想要的是把slf4j转到log4j上。 你说的方案相当于这样: 直接调用log4j的代码-->log4j-over-slf4j转接-->slf4j-->logback 但是我希望的是这样: 直接调用slf4j的代码-->slf4j-->log4j 我明白你的意思,但是却没有(如果按照命名方式的话应该是)logback-over-slf4j这样的东西。
nickycheng 2015-07-27
  • 打赏
  • 举报
回复
呵呵,你说的对,没有logback-over-slf4j,想不到有任何理由不用logback而去使用log4j实现。 系统里已有直接使用 logback 记录日志的情况下,没有方法再去改变了,唯有接受现实
nickycheng 2015-07-23
  • 打赏
  • 举报
回复
我没有理解错,倒是觉得你对slf4j的理解有些误区。 首先我假设你公司的那2个基础包没有直接把log4j logback的jar和配置直接集成在里面,只是使用了它们的api。(应该不会那么傻直接把第三方jar直接嵌入基础包里吧) 你在自己的项目里引用基础包,并依赖以下几个 slf4j-api logback-classic, logback-core log4j-over-slf4j (maven里一定要排除掉log4j,保证项目lib里没有log4j) jcl-over-slf4j(maven里一定要排除掉log4j,保证项目lib里没有commong logging) 按logback方式配日志配置文件,这样整个项目的日志都经过slf4j,包括基础包里的那些直接用log4j api的代码。
owen1759 2015-07-21
  • 打赏
  • 举报
回复
有没有人能解决这问题哦~
owen1759 2015-07-20
  • 打赏
  • 举报
回复
引用 7 楼 nickycheng 的回复:
用 log4j-over-slf4j.jar 代替 log4j.jar, 使用了它以后,别忘了把工程里的log4j去掉。
我查了一下你说的这个包,你似乎误会了我的意思了。 你说的这个包是将硬编码调用log4j的转接到slf4j上面去,而我的方向正好相反,编码里面引用slf4j想要指定转接到log4j上面。
nickycheng 2015-07-20
  • 打赏
  • 举报
回复
用 log4j-over-slf4j.jar 代替 log4j.jar, 使用了它以后,别忘了把工程里的log4j去掉。
owen1759 2015-07-20
  • 打赏
  • 举报
回复
引用 4 楼 uyerp 的回复:
把log4j和logback的直接调用代码,查找替换成slf4j! 代码直接写死的调用具体实现,你还想怎么换? 不然,只能新代码调用接口了。
我都说了,那些直接调用log4j的和直接调用logback的都是在基础包里面的,你上班的公司会让你随便动基础包的内容么?就算想动也没那个权限吧。
引用 5 楼 Inhibitory 的回复:
private static Logger logger = LoggerFactory.getLogger(HelloWorldController.class.getName());
这样取得 logger,是不需要具体依赖 Log4j 还是 Logback,正 classpath 里发现了谁的 jar 包就用谁的
这我知道,而现在的困难就在这上面,因为无论log4j的包还是logback的包都不能删,而我又想指定slf4j用log4j的包,所以就想问一下这东西可不可以给个配置文件什么的,在有多个实现包的情况下指定一个实现,如果能通过配置文件或者什么别的途径指定一下,这麻烦就迎刃而解了。
Inhibitory 2015-07-19
  • 打赏
  • 举报
回复
private static Logger logger = LoggerFactory.getLogger(HelloWorldController.class.getName());
这样取得 logger,是不需要具体依赖 Log4j 还是 Logback,正 classpath 里发现了谁的 jar 包就用谁的
搞什么哦 2015-07-19
  • 打赏
  • 举报
回复
把log4j和logback的直接调用代码,查找替换成slf4j! 代码直接写死的调用具体实现,你还想怎么换? 不然,只能新代码调用接口了。
  • 打赏
  • 举报
回复
我不懂,大神求教... 好腻害
owen1759 2015-07-17
  • 打赏
  • 举报
回复
引用 1 楼 shijing266 的回复:
为了使程序不依赖具体的日志实现 没看懂这句话
额,你知道slf4j和common-logging是干什么的么? 打个比方,如果你写日志是调用的log4j,然后在某个时候你突然不想用log4j了,想改用logback了,或者其他的什么日志实现。如果你的代码里是直接这样写的,那么,要想换一个日志实现无异于噩梦,你几乎要修改每个类,修改各处的日志代码。 但是如果你的代码里调用的是slf4j,然后你只需要把log4j的包(以及slf4j-log4j包)丢进去,就是log4j实现的,你把log4j的包删掉,把logback的包丢进去,就是logback实现的,这就叫做不依赖。 打个比方,以前那个年代各家手机厂商充电器的插口都是自己做的,那个时候你买了个三星的手机到外面没电了,即使别人有诺基亚充电器也帮不上你忙,这就叫依赖。而现在安卓的充电器采用的是统一的插口,现在你买了个三星的手机到外面没电了,你拿个酷派的充电器、联想的充电器都可以充电。我们写程序就像造手机,这个统一的标准就相当于slf4j,各个厂商的充电器就相当于各种日志实现。
  • 打赏
  • 举报
回复
为了使程序不依赖具体的日志实现 没看懂这句话

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧