我正在使用 azure databricks 5.5 LTS 以及 Spark 2.4.3 和 scala 2.11。几乎每个发送到 databricks 集群的请求都会出现以下错误日志
ERROR RetryingHMSHandler: NoSuchObjectException(message:There is no database named global_temp)
at org.apache.hadoop.hive.metastore.ObjectStore.getMDatabase(ObjectStore.java:487)
at org.apache.hadoop.hive.metastore.ObjectStore.getDatabase(ObjectStore.java:498)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Run Code Online (Sandbox Code Playgroud)
虽然这不会影响我们正在尝试做的事情的最终结果,但我们的日志不断充满这些内容,并且浏览起来并不是很愉快。我尝试通过将以下属性设置为驱动程序和执行程序来关闭它
log4j.level.org.apache.hadoop.hive.metastore.RetryingHMSHandler=OFF
Run Code Online (Sandbox Code Playgroud)
只是后来才意识到 RetryingHMSHandler 类实际上使用 slf4j 记录器,有没有一种优雅的方法来克服这个问题?
我有一个方法,我想添加特定的日志记录:
@Slf4j
@Service
public class SomethingService {
public void doSomething(Something data, String comment, Integer limit) {
Long id = saveSomethingToDatabase(data, comment);
boolean sentNotification = doSomething(id);
// ...
// Log what you done.
// Variables that always have important data: data.getName(), id
// Variables that are optional: sentNotification, comment, limit
// (optional means they aren't mandatory, rarely contains essential data, often null, false or empty string).
}
}
Run Code Online (Sandbox Code Playgroud)
我可以简单地记录所有:
log.info("Done something '{}' and saved (id {}, sentNotification={}) with comment '{}' and …Run Code Online (Sandbox Code Playgroud) 我在 gradle 项目中使用 Guice。运行main方法时,出现以下错误:
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
Run Code Online (Sandbox Code Playgroud)
我做了一些研究,并在dependencies文件部分添加了两个依赖项build.gradle,如下所示:
dependencies {
...
implementation group: 'org.slf4j', name: 'slf4j-api', version: '2.0.0-alpha1'
testImplementation group: 'org.slf4j', name: 'slf4j-simple', version: '2.0.0-alpha1'
}
Run Code Online (Sandbox Code Playgroud)
但错误仍然存在...
我需要通过 Guice 将 SLF4J 提供者与某些内容绑定吗?
我的main方法很简单,所以作为AbstractModuleGuice的类,如下所示(不确定它们是否相关):
public class Restful {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new ApplicationModule());
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class ApplicationModule extends AbstractModule …Run Code Online (Sandbox Code Playgroud) 使用slf4j-log4j12版本 2.0.0-alpha5 依赖项进行日志记录,从而拉取 Apache Log4j \xc2\xbb 1.2.17。需要将 Log4j 升级到最新版本,即 log4j-core \xc2\xbb 2.17.1,这样我就不必在代码库中进行更改。
\n以下是 POM 片段和示例代码:
\n <dependencies>\n <dependency>\n <groupId>org.slf4j</groupId>\n <artifactId>slf4j-log4j12</artifactId>\n <version>2.0.0-alpha5</version>\n </dependency>\n </dependencies>\nRun Code Online (Sandbox Code Playgroud)\n示例代码:
\nimport org.apache.log4j.Logger;\npublic class Entry {\n final static Logger logger = Logger.getLogger(Entry.class);\n public static void main(String[] args) {\n logger.info("Through Logging");\n System.out.println("Logging tests");\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nlog4j2有sl4j依赖吗?
\nlombok.extern.slf4j.XSlf4j有人可以解释一下和之间的区别lombok.extern.slf4j.Slf4j吗?看起来XSlf4j是一个新添加的,为什么这个新注释被添加到Lombok库中。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger log = LoggerFactory.getLogger(Twitter.class);
} catch (TwitterException e) {
// It prints the message as well as the exception
// log.error("Unable to show status", e);
// I would like to pass a status as well as an exception
// Is this an appropriate log statement
String status = "failed";
log.error("Unable to show status {}", status, e);
}
Run Code Online (Sandbox Code Playgroud)
上述log.error语句的一个变体log.error,将上面的语句正常工作.我不确定,因为我也传递了"身份".请澄清一下
我有一个Java Maven项目,其依赖包括slf4j和它log4j adapter.我管理的版本log4j,slf4j-log4j12并slf4j-api根据其最新版本http://mvnrepository.com,尤其是log4j的1.2.17版本已经超过1.2.12,但我仍然得到错误
SLF4J: This version of SLF4J requires log4j version 1.2.12 or later.
See also http://www.slf4j.org/codes.html#log4j_version
Run Code Online (Sandbox Code Playgroud)
这对我来说完全不清楚.
我的Maven依赖管理如下所示:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<type>pom</type>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
我该如何摆脱警告?
PS:我也得到了java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled().
PPS:由于你的评论,我记得该程序有一个"lib"文件夹,它不是由Maven包含在类路径中,而是由Eclipse本身包含,所以冲突的依赖关系必须在那里.对不起,我完全忘记了我认为将Maven与lib文件夹混合是我的错.我想我必须尝试将尽可能多的库转换为maven依赖项.奇怪的是,即使我编辑"订单和导出"以将Maven依赖项置于顶部,问题仍然存在.
jdk 6,slf4j 1.7.5
布局ble:
.
??? com
? ??? to
? ??? Main.class
??? simplelogger.properties
??? slf4j-api-1.7.5.jar
??? slf4j-simple-1.7.5.jar
Run Code Online (Sandbox Code Playgroud)
Main.java如下:
package com.to;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
final static Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
logger.info("error {}", logger.isErrorEnabled());
logger.info("info {}", logger.isInfoEnabled());
logger.info("debug {}", logger.isDebugEnabled());
}
}
Run Code Online (Sandbox Code Playgroud)
simplelogger.properties更改如下:
org.slf4j.simpleLogger.defaultLog=error
Run Code Online (Sandbox Code Playgroud)
运行测试,输出显示默认日志级别根本没有更改.
$ java -cp .:slf4j-api-1.7.5.jar:slf4j-simple-1.7.5.jar com.to.Main
[main] INFO com.to.Main - error true
[main] INFO com.to.Main - info true
[main] INFO com.to.Main - debug false
Run Code Online (Sandbox Code Playgroud)
即使系统属性在下面更改,也会发生同样的问题, …
我跑的时候不明白一些行为:
mvn -V clean -Dorg.slf4j.simpleLogger.showThreadName=true
Run Code Online (Sandbox Code Playgroud)
我明白了:
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12- 14T18:29:23+01:00)
Java version: 1.8.0_31, vendor: Oracle Corporation
...
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
因此,看起来org.slf4j.simpleLogger.showThreadNameslf4j无法识别属性
当我改变这个属性时,conf/logging/simplelogger.properties我得到:
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-14T18:29:23+01:00)
Java version: 1.8.0_31, vendor: Oracle Corporation
...
[main] [INFO] Scanning for projects...
[main] [INFO] ------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
现在我有了我的期望.
也mvn help:system -Dorg.slf4j.simpleLogger.showThreadName=true说财产已经确定.
我做错了什么?
我想用cli来设置sl4j的属性.我不想改变maven内部配置文件.
我收到了错误Caused by "java.lang.ClassNotFoundException: Didn't find class "org.slf4j.LoggerFactory".我附上了 slf4j-android-1.5.8.jarlib.但我不知道什么是问题.请帮忙