Hibernate 3.x使用slf4j进行日志记录.Hibernate 4.x使用jboss-logging.我正在编写一个独立的应用程序,它使用Hibernate 4和SLF4J进行日志记录.
如何配置Hibernate以登录SLF4J?
如果那不可能,我怎么能配置Hibernate的日志记录呢?
关于日志记录的Hibernate 4.1手册部分首先警告它是......
完全过时了.Hibernate从4.0开始使用JBoss Logging.当我们将此内容迁移到开发人员指南时,这将记录在案.
......继续谈论SLF4J,所以没用.入门指南和开发人员指南都没有谈论记录.迁移指南也没有.
我已经查找了有关jboss-logging本身的文档,但我根本找不到任何文档.在GitHub的页面是沉默的,和JBoss的社区项目页面甚至没有列出的jboss-记录.我想知道项目的bug跟踪器是否可能有任何与提供文档相关的问题,但事实并非如此.
好消息是,在应用程序服务器(如JBoss AS7)中使用Hibernate 4时,很大程度上会记录日志记录.但是我如何在独立应用程序中配置它?
我正在构建一个小型Java应用程序,并希望使用logback进行日志记录.
我的应用程序依赖于通过其进行日志记录的旧项目
org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1
Run Code Online (Sandbox Code Playgroud)
......所以我的计划是使用
org.slf4j | jcl-over-slf4j | 1.5.6
Run Code Online (Sandbox Code Playgroud)
...将JCL日志记录重定向到
org.slf4j | slf4j-api | 1.6.0
Run Code Online (Sandbox Code Playgroud)
......最终到了
ch.qos.logback | logback-classic | 0.9.22
ch.qos.logback | logback-core | 0.9.22
Run Code Online (Sandbox Code Playgroud)
所以我的应用程序可以通过其slf4j API登录logback,而旧的库代码可以通过重定向登录到同一位置.
唉,这导致了
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:141)
Run Code Online (Sandbox Code Playgroud)
我已经在其中一些罐子上尝试过更高和更低的版本号,并且还通过API文档等进行挖掘...但我无法找到并解决问题.
请帮忙?
虽然logback被认为是"战略"日志框架,但我有一些余地,我最终使用哪种日志记录机制.我希望使用logback或log4j,我肯定希望通过常见配置将旧项目的日志记录合并到"新"日志框架最终的任何内容中.
将m2e更新为1.1版后出现上述错误.通过删除m2e 1.1并回滚到m2e 1.0一切正常.我试图在Windows和Ubuntu中重复这个问题,它给了我完全相同的错误.测试了slf4j-api和logback的许多配置,但似乎都没有.
即使没有声明slf4j依赖项,错误也会出现在任何maven项目中.
New Maven项目 - > maven-archetype-quickstart
和
New Maven项目 - >没有原型选择的简单项目
结果
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
Run Code Online (Sandbox Code Playgroud)
在Mac上使用Eclipse Indigo和Eclipse Juno(32位和64位)测试,在Ubuntu上测试32位,在Windows上测试64位和32位测试.测试了Juno Classic,Juno Modeling工具,Kepler Standard,Kepler Modeling Tools的全新安装并产生了同样的错误.
出现错误,包括清理,安装,测试,部署,生成源 …
我无法决定是否使用slf4j与log4j2.基于在线帖子,看起来不会有任何性能影响,但它确实是必需的.
这些点也有利于log4j2:
我第一次听到标记时读到:
我检查Logger对象的可用方法:
并找到接口:
我得到的更深入的信息:
但仍然困惑...请注意,我问为什么,而不是如何使用它们,所以这不是重复:
更新似乎在使用标记时,您还需要编写自定义Java代码,而不是在XML或.property文件中进行配置...
更新2来自http://logback.qos.ch/manual/appenders.html#OnMarkerEvaluator
Marker notifyAdmin = MarkerFactory.getMarker("NOTIFY_ADMIN");
logger.error(notifyAdmin,
"This is a serious an error requiring the admin's attention",
new Exception("Just testing"));
Run Code Online (Sandbox Code Playgroud) 使用log4j时,该Logger.log(Priority p, Object message)
方法可用,可用于在运行时确定的日志级别记录消息.我们正在使用这个事实和这个技巧将stderr重定向到特定日志级别的记录器.
slf4j没有log()
我能找到的通用方法.这是否意味着无法实现上述目标?
使用{}
而不是字符串连接有什么好处吗?
来自slf4j的一个例子
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
Run Code Online (Sandbox Code Playgroud)
代替
logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
Run Code Online (Sandbox Code Playgroud)
我认为这是关于速度优化的,因为根据配置文件,可以在运行时避免参数评估(和字符串连接).但是只有两个参数是可能的,那么有时除了字符串连接之外别无选择.需要就此问题提出意见.
我有一个现有的应用程序,它针对log4j进行所有日志记录.我们使用了许多其他库,它们也使用log4j,或者记录Commons Logging,最终使用我们环境中的log4j.我们的一个依赖项甚至记录了slf4j,它也可以正常工作,因为它最终也会委托给log4j.
现在,我想为这个应用程序添加ehcache以满足一些缓存需求.以前版本的ehcache使用了commons-logging,它在这种情况下可以很好地工作,但是从版本1.6-beta1开始,它们已经删除了对commons-logging的依赖,而是用java.util.logging替换它.
不熟悉java.util.logging提供的内置JDK日志记录,是否有一种简单的方法可以将针对log4j发送到JUL的任何日志消息记录下来,因此我可以使用现有配置并设置任何日志记录来来自ehcache?
看看JUL的javadocs,看起来我可以设置一堆环境变量来改变使用的LogManager
实现,也许可以用它来将log4j包装Logger
在JUL Logger
类中.这是正确的方法吗?
具有讽刺意味的是,当世界其他地方(大部分)使用第三方库时,图书馆使用内置JDK日志记录会引起如此头疼.
我有一个maven项目,在命令行没有问题的情况下构建.但是,当我使用IntelliJ构建它时,我收到错误:
java: FileName.java:89: cannot find symbol
symbol : variable log
Run Code Online (Sandbox Code Playgroud)
java文件中没有定义或导入日志,但有一个
@Slf4j
final public class FileName {
Run Code Online (Sandbox Code Playgroud)
应该定义日志类的类体之前的语句.
在项目结构窗口中,类为:
Maven: org.slf4j:jcl-over-slf4j:1.6.1
Maven: org.slf4j:slf4j-api:1.6.6
Maven: org.slf4j:slf4j-log4j12:1.6.6
Maven: org.slf4j:slf4j-simple:1.6.6
Run Code Online (Sandbox Code Playgroud)
列在库下,表示已下载并可用.
知道为什么这会通过命令行与maven一起构建,而不是通过IntelliJ以及如何解决问题?
使用SLF4J记录错误消息和异常的正确方法是什么?
我试过这样做但是从不打印异常堆栈跟踪:
logger.error("Unable to parse data {}", inputMessage, e);
在这种情况下,我想填充{}
与inputMessage
和退出异常堆栈跟踪.
我能看到这样做的唯一方法就是这样做:
logger.error("Unable to parse data " + inputMessage, e);
这不漂亮.